@fedifyFedify: ActivityPub server framework How many queues do you use? Is it based on any mathematical rules like number of users vs cpu cores, or memory requirements? Do you always spin up a new queue or cap the number and reuse the resources as they come available?
洪 民憙 (Hong Minhee)
@hongminhee@hackers.pub · 961 following · 674 followers
Hi, I'm who's behind Fedify, Hollo, BotKit, and this website, Hackers' Pub! My main account is at
@hongminhee洪 民憙 (Hong Minhee)
.
Fedify, Hollo, BotKit, 그리고 보고 계신 이 사이트 Hackers' Pub을 만들고 있습니다. 제 메인 계정은:
@hongminhee洪 民憙 (Hong Minhee)
.
Fedify、Hollo、BotKit、そしてこのサイト、Hackers' Pubを作っています。私のメインアカウントは「
@hongminhee洪 民憙 (Hong Minhee)
」に。
Website
- hongminhee.org
GitHub
- @dahlia
Hollo
- @hongminhee@hollo.social
DEV
- @hongminhee
velog
- @hongminhee
Qiita
- @hongminhee
Zenn
- @hongminhee
Matrix
- @hongminhee:matrix.org
X
- @hongminhee
@PossiblyMaxMax Great question about our queue implementation! Fedify doesn't actually create separate physical queues, but rather uses a single logical queue where each message contains its own destination information.
For resource management, we generally rely on the underlying queue implementation (Redis, PostgreSQL, etc.) to handle concurrent processing efficiently. Since version 1.0.0, we've introduced ParallelMessageQueue which processes multiple messages concurrently with a configurable worker count—usually set close to your CPU core count for IO-bound operations.
We don't spin up new queues dynamically; instead, we focus on making the message processing scalable. You can control the parallelism level when using ParallelMessageQueue, and for high-volume instances, you can horizontally scale by running multiple worker processes that connect to the same shared queue backend.
This approach keeps the architecture simpler while still allowing for good throughput and resource utilization that can scale with your instance size.
Just released @fedify/markdown-it-mention v0.3.0! This update adds support for bare handles (e.g., @username without domain) with the new localDomain option, allowing you to specify the domain for these shortened mentions.
Install via npm, Bun, or Deno:
npm add @fedify/markdown-it-mention@0.3.0
bun add @fedify/markdown-it-mention@0.3.0
deno add jsr:@fedify/markdown-it-mention@0.3.0
@FediChatBot Hello from Hackers' Pub! Hackers' Pub is an ActivityPub-enabled blogging platform for software engineers. You can think of it as a Fediverse version of DEV.to. As such, I'm communicating with you through ActivityPub.
Hackers' Pub is still in development, but it is also open-sourced under the AGPL-3.0 license, so anyone can participate in the development.
What do you think of the future of Hackers' Pub? How does it compare to DEV.to, Qiita/Zenn in Japan, velog in Korea, etc.? Do you think it is competitive?
해커스펍! 흥한다!
어젯밤 데비안 패드 벽돌 될 것 감수하고 데비안 12로 업그레이드했는데 생각보다 문제 없이 잘 돼서 신남! ^ㅁ^ 전부터 느끼지만 그놈 데스크톱 환경은 예상 외로 터치 친화적인데... 터치로 쓰는 사용자가 생각보다 많은 걸까?
팔로워만 볼 수 있는 글 테스트 4. 잘 보이나요?
Vim 컨퍼런스 주최를 위해 사전조사를 하고 있습니다 많관부
Hackers' Pub 쓰고 계신 분들 중에서, 자신의 Hackers' Pub 계정을 연합우주(fediverse)뿐만 아니라 Bluesky에도 노출하고 그쪽 사람들과 교류하고 싶으신 분이 있다면, 상단 검색창에 @bsky.brid.gy@bsky.brid.gy을 검색하셔서 나오는 프로필을 팔로해 보세요. 그리고 1분 정도 뒤에 Bluesky에서 본인ID.hackers.pub.ap.brid.gy로 검색하면 본인의 Hackers' Pub 계정이 Bluesky에서도 보이는 걸 확인하실 수 있을 겁니다.
ここがHacker's Pubちゃんですか
@yamanokuやまのく Hackers' Pubへようこそ〜
ここがHacker's Pubちゃんですか
昨日と今朝は主にバグ修正だけだった。
- 非公開の投稿は共有を出来なくした
- Markdown のレンダリングで GitHub スタイルのコールアウトのバグを修正
AUTHORIZED_FETCHが適用されたインスタンスからノートオブジェクトのリクエストを受けた時、無条件に401が出るバグ修正(Fedifyまでまとめて修正…)- 脚注リンクが動かないバグ修正
- 他の人のDMがタイムラインに表示されるバグを修正
- ファビコン追加
中国語翻訳も追加したいけど、私の中国語力ではまだ力不足だ…
어제랑 오늘 오전은 주로 버그 수정만 했다.
- 비공개 게시물은 공유 못 하게 막음
- Markdown 렌더링에서 GitHub 스타일 콜아웃 버그 고침
- AUTHORIZED_FETCH 적용된 인스턴스로부터 노트 객체 요청 받았을 때 무조건 401 떨어지던 버그 수정 (Fedify까지 덩달아 수정…)
- 각주 링크 작동 안 하던 버그 고침
- 다른 사람 DM이 타임라인에 뜨던 버그 고침
- 파비콘 추가
중국어 번역도 추가하고 싶긴 한데, 나의 중국어 실력이 아직은 역부족이다…
えーと…Hackers' Pubの上部のナビゲーションバーのデザインを改善する必要が有るけど、どの様に改善すれば良いのか分からない。
昨日と今朝は主にバグ修正だけだった。
- 非公開の投稿は共有を出来なくした
- Markdown のレンダリングで GitHub スタイルのコールアウトのバグを修正
AUTHORIZED_FETCHが適用されたインスタンスからノートオブジェクトのリクエストを受けた時、無条件に401が出るバグ修正(Fedifyまでまとめて修正…)- 脚注リンクが動かないバグ修正
- 他の人のDMがタイムラインに表示されるバグを修正
- ファビコン追加
아, 생각해 보니 RSS도 추가해야겠다.
어제랑 오늘 오전은 주로 버그 수정만 했다.
- 비공개 게시물은 공유 못 하게 막음
- Markdown 렌더링에서 GitHub 스타일 콜아웃 버그 고침
- AUTHORIZED_FETCH 적용된 인스턴스로부터 노트 객체 요청 받았을 때 무조건 401 떨어지던 버그 수정 (Fedify까지 덩달아 수정…)
- 각주 링크 작동 안 하던 버그 고침
- 다른 사람 DM이 타임라인에 뜨던 버그 고침
- 파비콘 추가
@noellaboのえる whats your new handle?
@liaizonwakest ⁂ His handle on Hackers' Pub is @noellaboのえる.
궁금해 하실 분들이 계실지 모르겠지만, Hackers' Pub은 아래의 기술로 만들어지고 있습니다.
- 백엔드 JavaScript 런타임으로 Deno (Node.js를 안 씁니다)
- 데이터베이스로 PostgreSQL
- 웹 프레임워크로 Fresh 2.0[1]
- ORM으로 Drizzle ORM
- 캐시 저장소로 Redis
- ActivityPub 연합을 위해 Fedify
- 로깅 라이브러리로 LogTape
- 웹 프런트엔드 프레임워크로 Preact
- 스타일링에 Tailwind CSS
- 국제화에 i18next
2025년 3월 현재 Fresh 2.0은 정식 버전이 릴리스되지 않은 상태인데, 무시하고 불안정 버전을 그대로 쓰고 있습니다. Fresh 1.0 → 2.0에서 많은 게 바뀌기 때문에 굳이 Fresh 1.0을 쓰고 싶지 않았습니다. ↩︎
気になる方がいるか分かりませんが、Hackers' Pubは下記の技術で作られています。
- バックエンドのJavaScriptランタイムとしてDeno(Node.jsは使わない)
- データベースとしてPostgreSQL
- ウェブフレームワークとしてFresh 2.0[1]
- ORMとしてDrizzle ORM
- キャッシュストレージとしてRedis
- ActivityPub連合の為のFedify
- ロギングライブラリとしてLogTape
- WebフロントエンドフレームワークとしてPreact
- スタイリングにTailwind CSS
- 国際化にi18next
2025年3月現在Fresh 2.0は正式版がリリースされていない状態ですが、無視して不安定なバージョンを使っています。Fresh 1.0→2.0で色々変わったので、あえてFresh 1.0を使いたくなかったです。 ↩︎
궁금해 하실 분들이 계실지 모르겠지만, Hackers' Pub은 아래의 기술로 만들어지고 있습니다.
- 백엔드 JavaScript 런타임으로 Deno (Node.js를 안 씁니다)
- 데이터베이스로 PostgreSQL
- 웹 프레임워크로 Fresh 2.0[1]
- ORM으로 Drizzle ORM
- 캐시 저장소로 Redis
- ActivityPub 연합을 위해 Fedify
- 로깅 라이브러리로 LogTape
- 웹 프런트엔드 프레임워크로 Preact
- 스타일링에 Tailwind CSS
- 국제화에 i18next
2025년 3월 현재 Fresh 2.0은 정식 버전이 릴리스되지 않은 상태인데, 무시하고 불안정 버전을 그대로 쓰고 있습니다. Fresh 1.0 → 2.0에서 많은 게 바뀌기 때문에 굳이 Fresh 1.0을 쓰고 싶지 않았습니다. ↩︎
Hackers' Pub 쓰고 계신 분들 중에서, 자신의 Hackers' Pub 계정을 연합우주(fediverse)뿐만 아니라 Bluesky에도 노출하고 그쪽 사람들과 교류하고 싶으신 분이 있다면, 상단 검색창에 @bsky.brid.gy@bsky.brid.gy을 검색하셔서 나오는 프로필을 팔로해 보세요. 그리고 1분 정도 뒤에 Bluesky에서 본인ID.hackers.pub.ap.brid.gy로 검색하면 본인의 Hackers' Pub 계정이 Bluesky에서도 보이는 걸 확인하실 수 있을 겁니다.
블루스카이 여러분들 하위하위
Node.js滅びてくれ
使いにくすぎる
@hongminhee洪 民憙 (Hong Minhee) 두 번 시도해서 두 번 다 타임아웃 났었는데 지금 하니까 되네요 (..) 일시적인 딜레이였던 거 같습니다.
@linear 다행입니다!
앱 개발 일만 8년간 한 사람 오늘 드디어 웹 개발 시작한다 시작은 역시 hello world 부터라고 생각합니다 netlify 가입했고 세팅했고 index.html 잘 나오는 거 확인했으니까 오늘은 여기서 끝!
프로필 링크에 아무거나 막 넣을 수 있는 게 아닌 걸까? 네이버 블로그 URL 을 넣었더니 타임아웃이 난다(..)
@linear 어라, 그건 버그 같네요! 혹시 재시도 해보셔도 안 되나요?
hackers.pub 모바일 앱이 있으면 좋겠다 일단 iOS 개발자가 손을 들어봅니다 ㅋㅋ
@linear 그러게요, 모바일 앱을 하나 만들어야 할 것 같아요. 근데 아직 웹에서 모바일 뷰도 제대로 안 되어서… 그것부터 좀 잘 만들어 두려고요!
@linear 마크다운이 먹는다니 감격스러워 ㅠㅠ
hackers.pub 모바일 앱이 있으면 좋겠다 일단 iOS 개발자가 손을 들어봅니다 ㅋㅋ
Got an interesting question today about #Fedify's outgoing #queue design!
Some users noticed we create separate queue messages for each recipient inbox rather than queuing a single message and handling the splitting later. There's a good reason for this approach.
In the #fediverse, server response times vary dramatically—some respond quickly, others slowly, and some might be temporarily down. If we processed deliveries in a single task, the entire batch would be held up by the slowest server in the group.
By creating individual queue items for each recipient:
- Fast servers get messages delivered promptly
- Slow servers don't delay delivery to others
- Failed deliveries can be retried independently
- Your UI remains responsive while deliveries happen in the background
It's a classic trade-off: we generate more queue messages, but gain better resilience and user experience in return.
This is particularly important in federated networks where server behavior is unpredictable and outside our control. We'd rather optimize for making sure your posts reach their destinations as quickly as possible!
What other aspects of Fedify's design would you like to hear about? Let us know!
🧪 Experiment with Temporal in
@firefoxnightly!
The New API has,
✅ Time Zone Support – Easy UTC conversions!
✅ Precise Calculations – Leap years, daylight savings
✅ Built-in Parsing & Formatting – No need for third-party libraries
Start exploring 👇
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Temporal
@hongminhee洪 民憙 (Hong Minhee) さんに招待をいただきました。よろしくです。
@lionhairdino 그러지 않기를 빌겠습니다… 🙏
오 hackers pub 모바일 뷰 고쳐졌다
계정 이름에도 커스텀 에모지 표시되게 고쳤다.
아, 생각해 보니 RSS도 추가해야겠다.
Monads: Beyond Simple Analogies—Reflections on Functional Programming Paradigms
洪 民憙 (Hong Minhee) @hongminhee@hackers.pub
While exploring functional programming languages, I've been reflecting on how different communities approach similar concepts. One pattern that seems particularly fascinating is how Haskell and OCaml communities differ in their embrace of monads as an abstraction tool.
The Elegant Power of Monads in Haskell
It's common to hear monads explained through analogies to concepts like JavaScript's Promise or jQuery chains. While these comparisons provide an entry point, they might miss what makes monads truly beautiful and powerful in Haskell's ecosystem.
The real strength appears to lie in the Monad typeclass itself. This elegant abstraction allows for creating generic functions and types that work with any type that shares the monad property. This seems to offer a profound unification of concepts that might initially appear unrelated:
- You can write code once that works across many contexts (
Maybe,[],IO,State, etc.) - Generic functions like
sequence,mapM, and others become available across all monadic types - The same patterns and mental models apply consistently across different computational contexts
For example, a simple conditional function like this works beautifully in any monadic context:
whenM :: Monad m => m Bool -> m () -> m ()
whenM condition action = do
result <- condition
if result then action else return ()
Whether dealing with potentially missing values, asynchronous operations, or state transformations, the same function can be employed without modification. There's something genuinely satisfying about this level of abstraction and reuse.
OCaml's Different Approach
Interestingly, the OCaml community seems less enthusiastic about monads as a primary abstraction tool. This might stem from several factors related to language design:
Structural Differences
OCaml lacks built-in typeclass support, relying instead on its module system and functors. While powerful in its own right, this approach might not make monad abstractions feel as natural or convenient:
(* OCaml monad implementation requires more boilerplate *)
module type MONAD = sig
type 'a t
val return : 'a -> 'a t
val bind : 'a t -> ('a -> 'b t) -> 'b t
end
module OptionMonad : MONAD with type 'a t = 'a option = struct
type 'a t = 'a option
let return x = Some x
let bind m f = match m with
| None -> None
| Some x -> f x
end
OCaml also doesn't offer syntactic sugar like Haskell's do notation, which makes monadic code in Haskell considerably more readable and expressive:
-- Haskell's elegant do notation
userInfo = do
name <- getLine
age <- readLn
return (name, age)
Compared to the more verbose OCaml equivalent:
let user_info =
get_line >>= fun name ->
read_ln >>= fun age ->
return (name, age)
The readability difference becomes even more pronounced in more complex monadic operations.
Philosophical Differences
Beyond syntax, the languages differ in their fundamental approach to effects:
- Haskell is purely functional, making monads essential for managing effects in a principled way
- OCaml permits direct side effects, often making monadic abstractions optional
This allows OCaml programmers to write more direct code when appropriate:
(* Direct style in OCaml *)
let get_user_info () =
print_string "Name: ";
let name = read_line () in
print_string "Age: ";
let age = int_of_string (read_line ()) in
(name, age)
OCaml's approach might favor pragmatism and directness in many cases, with programmers often preferring:
- Direct use of
optionandresulttypes - Module-level abstractions through functors
- Continuation-passing style when needed
While this directness can be beneficial for immediate readability, it might come at the cost of some of the elegant uniformity that Haskell's monadic approach provides.
Reflections on Language Design
These differences highlight how programming language design shapes the idioms and patterns that emerge within their communities. Neither approach is objectively superior—they represent different philosophies about abstraction, explicitness, and the role of the type system.
Haskell's approach encourages a high level of abstraction and consistency across different computational contexts, which can feel particularly satisfying when working with complex, interconnected systems. There's something intellectually pleasing about solving a problem once and having that solution generalize across many contexts.
OCaml often favors more direct solutions that might be easier to reason about locally, though potentially at the cost of less uniformity across the codebase. This approach has its own virtues, particularly for systems where immediate comprehensibility is paramount.
After working with both paradigms, I find myself drawn to the consistent abstractions that Haskell's approach provides, while still appreciating the pragmatic clarity that OCaml can offer in certain situations. The typeclasses and syntactic support in Haskell seem to unlock a particularly elegant way of structuring code that, while perhaps requiring a steeper initial learning curve, offers a uniquely satisfying programming experience.
What patterns have you noticed in how different programming language communities approach similar problems? And have you found yourself drawn to the elegant abstractions of Haskell or the pragmatic approach of OCaml?
음… Hackers' Pub의 상단 네비게이션 바 디자인을 개선해야 하는데, 어떻게 개선해야 할 지 모르겠다.
계정 이름에도 커스텀 에모지 표시되게 고쳤다.
プロフィールページにフィルターを追加した。ノートだけを見たり、共有した物だけを見たり、記事だけを見たりする事が出来る。
えーと…Hackers' Pubの上部のナビゲーションバーのデザインを改善する必要が有るけど、どの様に改善すれば良いのか分からない。
프로필 페이지에 필터를 추가했다. 노트만 보거나 공유한 것만 보거나 게시물만 볼 수 있다.
음… Hackers' Pub의 상단 네비게이션 바 디자인을 개선해야 하는데, 어떻게 개선해야 할 지 모르겠다.
フォローのお勧めのアルゴリズムを改善した。
https://github.com/dahlia/hackerspub/commit/27f91659687658cdc4490a1320c882ad70cc6766
プロフィールページにフィルターを追加した。ノートだけを見たり、共有した物だけを見たり、記事だけを見たりする事が出来る。
팔로 추천 알고리즘을 개선했다.
프로필 페이지에 필터를 추가했다. 노트만 보거나 공유한 것만 보거나 게시물만 볼 수 있다.
フォローとフォロワーリストを実装した。とりあえずは自分のリストだけを見る事が出来る。
フォローのお勧めのアルゴリズムを改善した。
https://github.com/dahlia/hackerspub/commit/27f91659687658cdc4490a1320c882ad70cc6766
팔로잉 및 팔로워 목록을 구현했다. 일단은 자기 자신의 목록만 볼 수 있다.
팔로 추천 알고리즘을 개선했다.
Hello, Hacker's pub!
これまで実装した機能:
- 共有
- カスタム絵文字
- プロフィールアイコン
- 画像添付
- 検索
- フォローのお勧め
フォローとフォロワーリストを実装した。とりあえずは自分のリストだけを見る事が出来る。
생각해 보니 알림이 없네… 알림도 만들어야지. 할 거 많다.
팔로잉 및 팔로워 목록을 구현했다. 일단은 자기 자신의 목록만 볼 수 있다.
Hacker's pub은 모바일에서 쓰기엔 제약이 많나... 아무래도 블로그가 메인이니
@markeb54맹꽁이 적어도 웹으로라도 모바일에서 쓸 수 있게 하는 게 목표이긴 합니다. 여유가 생기면 모바일 앱도 만들고 싶긴 해요…
Hello, world!
プロフィールページにOpen Graphの画像を追加した。
これまで実装した機能:
- 共有
- カスタム絵文字
- プロフィールアイコン
- 画像添付
- 検索
- フォローのお勧め
아 또 있다.
- 게시물 (
Note) 수정 및 삭제 (Article은 수정 가능한데Note는 아직 안 됨) - 팔로잉 및 팔로워 목록
생각해 보니 알림이 없네… 알림도 만들어야지. 할 거 많다.









