洪 民憙 (Hong Minhee)'s avatar

洪 民憙 (Hong Minhee)

@hongminhee@hollo.social · 899 following · 1122 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にも興味が多いです。日本語、英語、韓国語で話しかけてください。(または、漢文でも!)

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 · Reply to 땡스바 :spinny_cat_gay:'s post

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

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

@hongminhee@hollo.social · Reply to 땡스바 :spinny_cat_gay:'s post

@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: an ActivityPub server framework's avatar
Fedify: an 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: an ActivityPub server framework's avatar
Fedify: an 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.
洪 民憙 (Hong Minhee)'s avatar
洪 民憙 (Hong Minhee)

@hongminhee@hollo.social · Reply to 염산하's post

@ysh @rangho_220 북마크와 좋아요는 Hollo 관리 페이지에 있는 내보내기 기능을 쓰시면 CSV로 저장하실 수 있습니다. 포스트와 부스트는 제가 다른 댓글에서 언급한 방식(ActivityPub의 발신함 조회)으로 가능할 것 같습니다! (일반 포스트는 "type": "Create"로, 부스트는 "type": "Announce"로 표시됩니다.)

https://hollo.social/@hongminhee/019531ff-9e05-7152-b100-f6a8272b016f

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

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

@mck 앗, 링크 수정했습니다! 감사합니다!

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

@hongminhee@hollo.social · Reply to Emelia 👸🏻's post

@thisismissem @bori Oh, I see!

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

@hongminhee@hollo.social · Reply to Emelia 👸🏻's post

@thisismissem @bori I've never been aware that “numbers” can also refer to fingers. Interesting!

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

@hongminhee@hollo.social

@bori購讀(구독)】이 “subscription”의 完全(완전)飜譯語(번역어)機能(기능)하는 것은 唯獨(유독) 韓國語(한국어)에서만 그런 것 같더라고요. (제가 알기로는 中國語(중국어)日本語(일본어)에서는 그렇게 쓰이지 않아요.)

Kaori :_mastodon_2022:'s avatar
Kaori :_mastodon_2022:

@kaorit@fedibird.com

番号の話に興味が湧いたので辞書を引いたら元々は英語のnumberの訳語だそうで。

番号の意味は「順番を示す符号。順序のしるし」。ナンバー(number)は「数・数詞」。

これらから推察するに順序立てて(後から辿れるように)並んでいれば数字やその他の符号が混じっていても問題は無さそう。

逆に順序が不明になるものには使えない言葉という事になるのかな。

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

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

英語(영어)境遇(경우), 確實(확실)히 “number”는 數字(숫자) 以外(이외)包含(포함)할 수 있다는 느낌이 있지요. 實際(실제)《위키낱말辭典(사전)英文板(영문판)에서 “number”를 찾아보면

A sequence of digits and letters used to register people, automobiles, and various other items.

Her passport number is C01X864TN.

라는 用例(용례)가 나와 있기도 하고요.

https://baram.me/@bori/114056446388564683

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

@hongminhee@hollo.social

내가 Galaxy 시리즈를 안 쓰는 가장 큰 理由(이유)單純(단순)三星(삼성)不買(불매)하기 때문. (三星(삼성)不買(불매)理由(이유)는 너무나 많기 때문에 여기서는 省略(생략).) 메인 폰으로 iPhone을 쓰고 있지만, Android를 쓰게 되더라도 Google의 Pixel 시리즈 같은 걸 쓸 것 같다.

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

@hongminhee@hollo.social

I have great respect for @thisismissem's tremendous work on @hollo.😲

https://hachyderm.io/@thisismissem/114056333638591578

Emelia 👸🏻's avatar
Emelia 👸🏻

@thisismissem@hachyderm.io

Extended my previous contribution to @hollo tonight with some tests for the `GET /api/v1/accounts/verify_credentials` route:

github.com/fedify-dev/hollo/pu

There's some magic going on here, but I'm pretty happy with the results.

Though, node.js's test runner seems really slow at times and I've no idea why, like some of these are taking 1-4 seconds, whereas other tests are 54ms. I've tried instrumenting the code to find slownesses and I can't, everything's taking only milliseconds.

Emelia 👸🏻's avatar
Emelia 👸🏻

@thisismissem@hachyderm.io · Reply to Emelia 👸🏻's post

Found the slowness! It was because each account that was created for the tests generated two keypairs for activitypub usage. We don't need those for these tests.

Now they run in like 150ms each, or a 10x increase in speed.

← Newer
Older →