洪 民憙 (Hong Minhee)'s avatar

洪 民憙 (Hong Minhee)

@hongminhee@hollo.social · 946 following · 1259 followers

An intersectionalist, feminist, and socialist guy living in Seoul (UTC+09:00). @tokolovesme's spouse. Who's behind @fedify, @hollo, and @botkit. Write some free software in , , , & . They/them.

서울에 사는 交叉女性主義者이자 社會主義者. 金剛兔(@tokolovesme)의 配偶者. @fedify, @hollo, @botkit 메인테이너. , , , 等으로 自由 소프트웨어 만듦.

()

洪 民憙 (Hong Minhee)'s avatar
洪 民憙 (Hong Minhee)

@hongminhee@hollo.social

Hello, I'm an open source software engineer in my late 30s living in , , and an avid advocate of and the .

I'm the creator of @fedify, an server framework in , @hollo, an ActivityPub-enabled microblogging software for single users, and @botkit, a simple ActivityPub bot framework.

I'm also very interested in East Asian languages (so-called ) and . Feel free to talk to me in , (), or (), or even in Literary Chinese (, )!

洪 民憙 (Hong Minhee)'s avatar
洪 民憙 (Hong Minhee)

@hongminhee@hollo.social · Reply to 洪 民憙 (Hong Minhee)'s post

安寧(안녕)하세요, 저는 서울에 살고 있는 30() 後半(후반) 오픈 소스 소프트웨어 엔지니어이며, 自由(자유)·오픈 소스 소프트웨어와 聯合宇宙(연합우주)(fediverse)의 熱烈(열렬)支持者(지지자)입니다.

저는 TypeScript() ActivityPub 서버 프레임워크인 @fedify 프로젝트와 싱글 유저() ActivityPub 마이크로블로그인 @hollo 프로젝트와 ActivityPub 봇 프레임워크인 @botkit 프로젝트의 製作者(제작자)이기도 합니다.

저는 ()아시아 言語(언어)(이른바 )와 유니코드에도 關心(관심)이 많습니다. 聯合宇宙(연합우주)에서는 國漢文混用體(국한문 혼용체)를 쓰고 있어요! 제게 韓國語(한국어)英語(영어), 日本語(일본어)로 말을 걸어주세요. (아니면, 漢文(한문)으로도!)

洪 民憙 (Hong Minhee)'s avatar
洪 民憙 (Hong Minhee)

@hongminhee@hollo.social · Reply to 洪 民憙 (Hong Minhee)'s post

こんにちは、私はソウルに住んでいる30代後半のオープンソースソフトウェアエンジニアで、自由・オープンソースソフトウェアとフェディバースの熱烈な支持者です。名前は洪 民憙ホン・ミンヒです。

私はTypeScript用のActivityPubサーバーフレームワークである「@fedify」と、ActivityPubをサポートする1人用マイクロブログである 「@hollo」と、ActivityPubのボットを作成する為のシンプルなフレームワークである「@botkit」の作者でもあります。

私は東アジア言語(いわゆるCJK)とUnicodeにも興味が多いです。日本語、英語、韓国語で話しかけてください。(または、漢文でも!)

洪 民憙 (Hong Minhee)'s avatar
洪 民憙 (Hong Minhee)

@hongminhee@hollo.social · Reply to @reiver ⊼ (Charles) :batman:'s post

@reiver You're right, it started as an internet prank by 4chan. They wanted to trick people into thinking 👌 meant “white power.” It was meant to make liberals and the media look foolish for overreacting to a harmless symbol.

Unfortunately, the prank took a dark turn. Some right-wingers started using the gesture ironically, as a way to troll people. Then, some white supremacists actually adopted the symbol, giving it a real connection to hate.

So, while it began as a hoax, it has been used by some white supremacists to signal their hateful ideology. It's a complicated situation, and it's important to be aware of the potential for this symbol to be used to express hate, even if that wasn't the original intent.

洪 民憙 (Hong Minhee)'s avatar
洪 民憙 (Hong Minhee)

@hongminhee@hollo.social

Today I learned that the “okay” hand gesture 👌 has been co-opted by some as a hate symbol representing white supremacy. It's shocking to me that this common gesture could be turned into something so hateful…

https://www.adl.org/resources/hate-symbol/okay-hand-gesture

우주스타 아이도루 랭호 🌠's avatar
우주스타 아이도루 랭호 🌠

@rangho_220@rangho.moe

i like how german translation of twitter-like apps literally conjugate english verbs as if they were german verbs

the prime example would be geliked as if the act of liking is some sort of "proper verb" lmao

:_ko::_ko::_a::_ni::_lya::_n:'s avatar
:_ko::_ko::_a::_ni::_lya::_n:

@cocoa_vrc@misskey.io

APModel

テストとかが不完全でソース公開されてないのは注意
https://pypi.org/project/apmodel/

洪 民憙 (Hong Minhee)'s avatar
洪 民憙 (Hong Minhee)

@hongminhee@hollo.social · Reply to noim's post

@noim Haha, iOS Translate recognizes Korean as Dutch sometimes, I have no idea why though… 😂

By the way, it means: “Custom emojis, would it work well?”

洪 民憙 (Hong Minhee)'s avatar
洪 民憙 (Hong Minhee)

@hongminhee@hollo.social · Reply to 洪 民憙 (Hong Minhee)'s post

하는 김에 相對(상대) 時間(시간)으로 보이게 하고 實時間(실시간)으로 更新(갱신)되게 만들었다. Fresh의 아일랜드 아키텍처, 나 같은 프런트엔드 初心者(초심자)가 쓰기에 좋은 듯?

Hackers' Pub에서 揭示物을 올린 時刻이 相對 時間으로 나타나고 있다.
ALT text detailsHackers' Pub에서 揭示物을 올린 時刻이 相對 時間으로 나타나고 있다.
洪 民憙 (Hong Minhee)'s avatar
洪 民憙 (Hong Minhee)

@hongminhee@hackers.pub · Reply to 洪 民憙 (Hong Minhee)'s post

아, 그런데 서버 타임존이 UTC라 올린 시각도 UTC로 보이네… 이것부터 고쳐야겠다.

洪 民憙 (Hong Minhee)'s avatar
洪 民憙 (Hong Minhee)

@hongminhee@hollo.social · Reply to 洪 民憙 (Hong Minhee)'s post

오, 잘 보인다!

Hackers' Pub에서 커스텀 繪文字가 잘 보이는 모습.
ALT text detailsHackers' Pub에서 커스텀 繪文字가 잘 보이는 모습.
洪 民憙 (Hong Minhee)'s avatar
洪 民憙 (Hong Minhee)

@hongminhee@hollo.social · Reply to 洪 民憙 (Hong Minhee)'s post

커스텀 繪文字(회문자), 잘 될까? :hollo: :fedify: :botkit: 🤔

洪 民憙 (Hong Minhee)'s avatar
洪 民憙 (Hong Minhee)

@hongminhee@hollo.social

조금 다른 얘기이긴 하지만, 도라마 코리아는 經營陣(경영진)極右(극우)인 것으로도 알려져 있지요.

https://bsky.brid.gy/r/https://bsky.app/profile/did:plc:fvyaird3ggeppv7eimcjovj3/post/3lixrsbnih22s

심란🍞's avatar
심란🍞

@simraniyo.bsky.social@bsky.brid.gy

아 맞아 여러분 고독한 미식를 비롯해 도라마코리아 작품은 캡쳐+혹은 카메라로 찍은 모니터 사진도 올리지 마세요. 친구가 그냥 일상 짤 하나로 음식 사진 찍다가 노트북 화면에 고독한 미식가 한 컷 들어간 거 올렸다고 저작권 침해 공문 받았다고 하네요 ^^; 폰트 업체들이 하던 깡패짓 어디서 써먹고 있어; 진심 양아치들;

Mastodon Migration's avatar
Mastodon Migration

@mastodonmigration@mastodon.online

Who owns Bluesky? users demand straight answers from CEO Jay Graber on who owns the platform.

Just kidding. No they didn't. No one knows who owns Bluesky and the company isn't telling.

What precious little we do know: mastodon.online/@mastodonmigra

洪 民憙 (Hong Minhee)'s avatar
洪 民憙 (Hong Minhee)

@hongminhee@hollo.social · Reply to 안녕's post

@annyeong For writing, I haven't noticed much of a difference from Sonnet 3.5 yet, and I've only been using it for a day, so I'll have to wait and see!

洪 民憙 (Hong Minhee)'s avatar
洪 民憙 (Hong Minhee)

@hongminhee@hollo.social

Nowadays, when I need to compose articles in multiple languages, such as English, Korean, and Japanese, I draft them in Sonnet. By providing the data that should be included in the content and the constraints, it produces a pretty good draft. is a language model, so it is quite good at writing—especially if you need to work with multiple languages.

Jeff Sikes's avatar
Jeff Sikes

@box464@mastodon.social

Nice little feature in the IceShrimp.NET beta I found today. Most of the Forkey platforms have the concept of a "Drive" where all the media you've uploaded is contained.

In the drive, warnings have been added to any image that is missing ALT text. You can go through and easily add the missing ALT text right from this screen!

A screenshot of a file directory displaying various media files, including images and a video. Small icons appear on the images, identifying them as the image used for your profile or banner, a warning sign if no alt text has been entered, or the term "CC" if alt text has been added.
ALT text detailsA screenshot of a file directory displaying various media files, including images and a video. Small icons appear on the images, identifying them as the image used for your profile or banner, a warning sign if no alt text has been entered, or the term "CC" if alt text has been added.
洪 民憙 (Hong Minhee)'s avatar
洪 民憙 (Hong Minhee)

@hongminhee@hollo.social · Reply to 洪 民憙 (Hong Minhee)'s post

Just responded to some browser compatibility issues with . Turns out bundling everything in one package creates headaches for Next.js and other browser environments.

For the next minor version, we're breaking things up:

  • @logtape/logtape will be browser-friendly with zero compromises
  • @logtape/file will handle filesystem operations
  • Other specialized features will get their own packages

This should make LogTape work seamlessly across all environments while giving developers better control over what they include.

Emelia 👸🏻's avatar
Emelia 👸🏻

@thisismissem@hachyderm.io

Representing graphs in Postgresql — admittedly, I don't understand the query at the end, but cool:

richard-towers.com/2025/02/16/

洪 民憙 (Hong Minhee)'s avatar
洪 民憙 (Hong Minhee)

@hongminhee@hollo.social · Reply to Jaeyeol Lee (a.k.a. kodingwarrior) :vim:'s post

@kodingwarrior 아이고… 고생이 많으십니다. 😭

洪 民憙 (Hong Minhee)'s avatar
洪 民憙 (Hong Minhee)

@hongminhee@hollo.social · Reply to :_ko::_ko::_a::_ni::_lya::_n:'s post

@cocoa_vrc @AmaseCocoa もしよろしければ、ログにどの様な内容が記録されるのか、DMで教えていただけませんか?

洪 民憙 (Hong Minhee)'s avatar
洪 民憙 (Hong Minhee)

@hongminhee@hollo.social · Reply to :_ko::_ko::_a::_ni::_lya::_n:'s post

@cocoa_vrc これは調べてみます!

ここあ :logo_cocoa: at :hollo:'s avatar
ここあ :logo_cocoa: at :hollo:

@cocoa@hollo.amase.cc

でプロフィールカードを作成しました! https://purofu.y-zu.org/view/server?id=142

洪 民憙 (Hong Minhee)'s avatar
洪 民憙 (Hong Minhee)

@hongminhee@hollo.social

I am to resolve the pending issues of this evening.

洪 民憙 (Hong Minhee)'s avatar
洪 民憙 (Hong Minhee)

@hongminhee@hollo.social · Reply to 洪 民憙 (Hong Minhee)'s post

Wait, is only iPhone 17 Pro Max going to come out like this? Then it might be okay because I'm not interested in large-sized iPhone anyway. 🤔

洪 民憙 (Hong Minhee)'s avatar
洪 民憙 (Hong Minhee)

@hongminhee@hollo.social

If iPhone 17 is really released like this mock-up, I don't think I'll buy a new iPhone for a while.

https://mastodon.social/@macrumors/114058266581926184

Erin 💽✨'s avatar
Erin 💽✨

@erincandescent@erincandescent.net

Postgres won't let you store `\u0000` (a legal JSON escape sequence!) in a JSONB record 🤯

Fortunately for our use case, our input data is Latin 1. I'm suggesting we replace the NULs with control picture ␀
洪 民憙 (Hong Minhee)'s avatar
洪 民憙 (Hong Minhee)

@hongminhee@hollo.social

PostgreSQL은 任意(임의)表現式(표현식)索引(색인)을 만들 수 있고, jsonjsonb 타입에는 JSON 값의 部分(부분) 값을 抽出(추출)하는 演算子(연산자)函數(함수)이 있기 때문에 저렇게 해도 索引(색인)可能(가능)합니다.

https://social.maka.nagoya/notes/a4mflu94zxek3bq1

Pedro Fonseca's avatar
Pedro Fonseca

@PJFDF@masto.pt

Wait, what? 😯

can send email? Damn... @bagder I'm impressed (not that I didn't expected that), curl just keeps on giving. 😁

curl --url "smtp://$SMTP_SERVER:$SMTP_PORT" \
--ssl-reqd \
--mail-from "$SMTP_USER" \
--mail-rcpt "$EMAIL" \
--upload-file "$LOG_FILE" \
--user "$SMTP_USER:$SMTP_PASSWORD" \
--insecure

洪 民憙 (Hong Minhee)'s avatar
洪 民憙 (Hong Minhee)

@hongminhee@hollo.social

@thx 그건 그렇지요… 나름 디자인 심볼로 승화하려고 한 것 같지만 여전히 너무 부담스럽습니다.

洪 民憙 (Hong Minhee)'s avatar
洪 民憙 (Hong Minhee)

@hongminhee@hollo.social

@thx Pixel 최근에 나온 것들은 꽤 예쁘지 않나요? 제 눈에만 그렇게 보이는 걸 수도…

洪 民憙 (Hong Minhee)'s avatar
洪 民憙 (Hong Minhee)

@hongminhee@hollo.social

Yes, we probably should have had this sooner… but hey, proper domain handling is coming to 1.5.0!

https://hollo.social/@fedify/01953693-1afd-7430-988a-23d649099e1c

Fedify: ActivityPub server framework's avatar
Fedify: ActivityPub server framework

@fedify@hollo.social

We're excited to announce two major features coming in 1.5.0, focused on giving you more control over domain names in your federated apps:

Separate WebFinger Host from Server Origin

Want different domains for your WebFinger handles and server URIs? Fedify 1.5.0 will let you use domains like @alice@example.com as fediverse handles while serving content from https://ap.example.com. This gives you more flexibility in how you structure your federated services.

Canonical Origin Support

Need to ensure consistent URLs across your infrastructure? The new canonical origin support lets you explicitly set your server's authoritative domain. This is particularly useful when running behind reverse proxies or load balancers—no more unexpected URLs generated from internal hostnames.


These features represent our ongoing commitment to making Fedify more flexible and production-ready.

Can't wait to try these features? You can experiment with them today using our unstable release v1.5.0-dev.680+562e3dc0 (JSR & npm). Keep in mind that this is an unstable release intended for testing—use it in production at your own risk.

Otherwise, stay tuned for the stable Fedify 1.5.0 release!

Separating WebFinger host from the server origin

This API is available since Fedify 1.5.0.

Sometimes you may want to use different domain names for WebFinger handles (i.e., fediverse handles) and the server origin. For example, you may want to use https://ap.example.com/actors/alice as an actor URI but want to use @alice@example.com as its fediverse handle.

In such cases, you can set the handleHost different from the webOrigin in the origin option. The handleHost is used to construct the WebFinger handles, and the webOrigin is used to construct the URLs in the Context object:

const federation = createFederation({
  origin: {
    handleHost: "example.com",
    webOrigin: "https://ap.example.com",
  },
});

NOTE

Even if you set the handleHost different from the webOrigin, the other fediverse handle with the same domain name as the webOrigin will still be recognized.

In the above example, two fediverse handles are recognized as the same:

• @alice@example.com
• @alice@ap.example.com
ALT text detailsSeparating WebFinger host from the server origin This API is available since Fedify 1.5.0. Sometimes you may want to use different domain names for WebFinger handles (i.e., fediverse handles) and the server origin. For example, you may want to use https://ap.example.com/actors/alice as an actor URI but want to use @alice@example.com as its fediverse handle. In such cases, you can set the handleHost different from the webOrigin in the origin option. The handleHost is used to construct the WebFinger handles, and the webOrigin is used to construct the URLs in the Context object: const federation = createFederation({ origin: { handleHost: "example.com", webOrigin: "https://ap.example.com", }, }); NOTE Even if you set the handleHost different from the webOrigin, the other fediverse handle with the same domain name as the webOrigin will still be recognized. In the above example, two fediverse handles are recognized as the same: • @alice@example.com • @alice@ap.example.com
Explicitly setting the canonical origin

This API is available since Fedify 1.5.0.

Or you can explicitly set the canonical origin of the server by passing the origin option to the createFederation() function. The origin option is either a string or a FederationOrigin object, which consists of two fields: handleHost and webOrigin.

For example, if you want to set the canonical origin to https://example.com, you can pass the string:

const federation = createFederation({
  origin: "https://example.com",
});

NOTE

The origin option has to include the leading https:// or http:// scheme.

Such a configuration leads the constructed URLs using Context to use the canonical origin instead of the origin from the incoming HTTP requests, which avoids constructing unexpected URLs when a request bypasses a reverse proxy or a load balancer.

CAUTION

For example, suppose that your federated server (upstream) is accessible at the http://1.2.3.4:8000 and your load balancer (downstream) is accessible at the https://example.com and forwards the requests to the upstream server. In this case, you should set the canonical origin to https://example.com to construct the correct URLs. Otherwise, when some malicious actor directly sends a request to the upstream server, the constructed URLs will start with http://1.2.3.4:8000 instead of https://example.com, which can lead to security issues.
ALT text detailsExplicitly setting the canonical origin This API is available since Fedify 1.5.0. Or you can explicitly set the canonical origin of the server by passing the origin option to the createFederation() function. The origin option is either a string or a FederationOrigin object, which consists of two fields: handleHost and webOrigin. For example, if you want to set the canonical origin to https://example.com, you can pass the string: const federation = createFederation({ origin: "https://example.com", }); NOTE The origin option has to include the leading https:// or http:// scheme. Such a configuration leads the constructed URLs using Context to use the canonical origin instead of the origin from the incoming HTTP requests, which avoids constructing unexpected URLs when a request bypasses a reverse proxy or a load balancer. CAUTION For example, suppose that your federated server (upstream) is accessible at the http://1.2.3.4:8000 and your load balancer (downstream) is accessible at the https://example.com and forwards the requests to the upstream server. In this case, you should set the canonical origin to https://example.com to construct the correct URLs. Otherwise, when some malicious actor directly sends a request to the upstream server, the constructed URLs will start with http://1.2.3.4:8000 instead of https://example.com, which can lead to security issues.
Fedify: ActivityPub server framework's avatar
Fedify: ActivityPub server framework

@fedify@hollo.social

We're excited to announce two major features coming in 1.5.0, focused on giving you more control over domain names in your federated apps:

Separate WebFinger Host from Server Origin

Want different domains for your WebFinger handles and server URIs? Fedify 1.5.0 will let you use domains like @alice@example.com as fediverse handles while serving content from https://ap.example.com. This gives you more flexibility in how you structure your federated services.

Canonical Origin Support

Need to ensure consistent URLs across your infrastructure? The new canonical origin support lets you explicitly set your server's authoritative domain. This is particularly useful when running behind reverse proxies or load balancers—no more unexpected URLs generated from internal hostnames.


These features represent our ongoing commitment to making Fedify more flexible and production-ready.

Can't wait to try these features? You can experiment with them today using our unstable release v1.5.0-dev.680+562e3dc0 (JSR & npm). Keep in mind that this is an unstable release intended for testing—use it in production at your own risk.

Otherwise, stay tuned for the stable Fedify 1.5.0 release!

Separating WebFinger host from the server origin

This API is available since Fedify 1.5.0.

Sometimes you may want to use different domain names for WebFinger handles (i.e., fediverse handles) and the server origin. For example, you may want to use https://ap.example.com/actors/alice as an actor URI but want to use @alice@example.com as its fediverse handle.

In such cases, you can set the handleHost different from the webOrigin in the origin option. The handleHost is used to construct the WebFinger handles, and the webOrigin is used to construct the URLs in the Context object:

const federation = createFederation({
  origin: {
    handleHost: "example.com",
    webOrigin: "https://ap.example.com",
  },
});

NOTE

Even if you set the handleHost different from the webOrigin, the other fediverse handle with the same domain name as the webOrigin will still be recognized.

In the above example, two fediverse handles are recognized as the same:

• @alice@example.com
• @alice@ap.example.com
ALT text detailsSeparating WebFinger host from the server origin This API is available since Fedify 1.5.0. Sometimes you may want to use different domain names for WebFinger handles (i.e., fediverse handles) and the server origin. For example, you may want to use https://ap.example.com/actors/alice as an actor URI but want to use @alice@example.com as its fediverse handle. In such cases, you can set the handleHost different from the webOrigin in the origin option. The handleHost is used to construct the WebFinger handles, and the webOrigin is used to construct the URLs in the Context object: const federation = createFederation({ origin: { handleHost: "example.com", webOrigin: "https://ap.example.com", }, }); NOTE Even if you set the handleHost different from the webOrigin, the other fediverse handle with the same domain name as the webOrigin will still be recognized. In the above example, two fediverse handles are recognized as the same: • @alice@example.com • @alice@ap.example.com
Explicitly setting the canonical origin

This API is available since Fedify 1.5.0.

Or you can explicitly set the canonical origin of the server by passing the origin option to the createFederation() function. The origin option is either a string or a FederationOrigin object, which consists of two fields: handleHost and webOrigin.

For example, if you want to set the canonical origin to https://example.com, you can pass the string:

const federation = createFederation({
  origin: "https://example.com",
});

NOTE

The origin option has to include the leading https:// or http:// scheme.

Such a configuration leads the constructed URLs using Context to use the canonical origin instead of the origin from the incoming HTTP requests, which avoids constructing unexpected URLs when a request bypasses a reverse proxy or a load balancer.

CAUTION

For example, suppose that your federated server (upstream) is accessible at the http://1.2.3.4:8000 and your load balancer (downstream) is accessible at the https://example.com and forwards the requests to the upstream server. In this case, you should set the canonical origin to https://example.com to construct the correct URLs. Otherwise, when some malicious actor directly sends a request to the upstream server, the constructed URLs will start with http://1.2.3.4:8000 instead of https://example.com, which can lead to security issues.
ALT text detailsExplicitly setting the canonical origin This API is available since Fedify 1.5.0. Or you can explicitly set the canonical origin of the server by passing the origin option to the createFederation() function. The origin option is either a string or a FederationOrigin object, which consists of two fields: handleHost and webOrigin. For example, if you want to set the canonical origin to https://example.com, you can pass the string: const federation = createFederation({ origin: "https://example.com", }); NOTE The origin option has to include the leading https:// or http:// scheme. Such a configuration leads the constructed URLs using Context to use the canonical origin instead of the origin from the incoming HTTP requests, which avoids constructing unexpected URLs when a request bypasses a reverse proxy or a load balancer. CAUTION For example, suppose that your federated server (upstream) is accessible at the http://1.2.3.4:8000 and your load balancer (downstream) is accessible at the https://example.com and forwards the requests to the upstream server. In this case, you should set the canonical origin to https://example.com to construct the correct URLs. Otherwise, when some malicious actor directly sends a request to the upstream server, the constructed URLs will start with http://1.2.3.4:8000 instead of https://example.com, which can lead to security issues.
← Newer
Older →