👀
BotKitを使ってActivityPubボットを作ってみよう https://zenn.dev/hongminhee/articles/6e4c5ab155305f

洪 民憙 (Hong Minhee)
@hongminhee@hackers.pub · 861 following · 607 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
Botを動かすためだけにMisskeyやらMastodonを建てるの、オーバースペックな感じがしないでもないので、ActivityPubを直接喋るようなBotを作ってみたい(と思ってから数年が経過している)
BotKitすごいわね
すっごい簡易なAPubデバッグには便利なのよねーBotkit
サーバーとしてbotを立てるって面白そうだよねえ
@FediChatBot こんにちは。
좋은 질문 감사합니다. 실험 결과 4096의 배수인게 유의미한것 같습니다.
오늘은 몇 줄 기여하는데 온 동네 도움을 받았습니다... 감사합니다 🙇
We're thrilled to highlight five outstanding contributions from the Korean Open Source Contribution Academy (#OSSCA) program participants who have been working on #Fedify! Their dedication and effort have significantly enhanced our #ActivityPub server framework.
First up is @nyeongAn Nyeong (安寧) with his monumental #318 PR, implementing a SQLite-based key–value store to address #274. This contribution adds the
SqliteKvStore
class with full cross-runtime support for Node.js, Deno, and Bun through the new @fedify/sqlite
package. His implementation includes atomic operations, TTL support, comprehensive test coverage, and careful attention to SQL injection prevention. This enables developers to use SQLite as a persistent storage backend while maintaining compatibility with Fedify's existing KvStore
API—a crucial feature for production deployments!
Next, @crohasang크롸상 delivered an excellent quality-of-life improvement with #341 PR, fixing #257. He enhanced the CLI to properly respect TTY status and the
NO_COLOR
environment variable, implementing intelligent color control across all CLI commands. The solution involved switching from @cliffy/ansi/colors
to @std/fmt/colors
, creating a helper function using Deno.inspect()
to handle object formatting, and ensuring colors are correctly disabled when output is redirected to files. This makes the CLI much more pipe-friendly and suitable for automated workflows!
@meneleHanal Ae contributed a thoughtful enhancement with #342 PR, addressing #191. She updated the
fedify inbox
command to display not just the activity type, but also the type of object contained within each activity—transforming output like "Create" into the more informative "Create(Note)" or "Undo" into "Undo(Follow)". This seemingly simple change required making the display function asynchronous to fetch the enclosed objects, significantly improving the debugging experience for developers!
@woaol벨 tackled an important developer experience issue with #329 PR, solving #306. Previously, the
fedify init
command would often install outdated versions of Fedify packages like @fedify/redis
because version numbers were hardcoded in the CLI. They created a getLatestVersion()
function that dynamically retrieves package versions from local metadata files, ensuring that developers always get the latest versions of all Fedify packages when initializing a new project. This improvement includes comprehensive test coverage and eliminates the frustration of starting a project with outdated dependencies!
Finally, @kodingwarriorJaeyeol Lee made a significant contribution with #309 PR, implementing #269—NestJS integration! They created the
@fedify/nestjs
package with a FedifyModule
that seamlessly integrates Fedify into NestJS applications. This includes proper middleware implementation, dependency injection support through NestJS's module system, and compatibility with both CommonJS and ESM environments. This opens up Fedify to the large NestJS developer community, making it easier than ever to build ActivityPub-enabled applications with this popular enterprise framework!
These contributions showcase the incredible talent and dedication of the OSSCA participants. From core infrastructure improvements to developer experience enhancements, each contribution makes Fedify better for the entire community. Thank you all for your hard work and welcome to the Fedify contributor family! 🚀
We're looking forward to seeing more amazing contributions from the OSSCA program and the broader community. If you're interested in contributing to Fedify, check out our GitHub repository and join us in building the future of federated social web! 🌟
@kodingwarriorJaeyeol Lee Discourse ActivityPub 플러그인에서 이것 저것 테스트해보고 있는데, mastodon과 다르게 hackers pub에는 Discourse에서 팔로우를 걸어도 이쪽에 특별히 팔로우 신청이 들어왔다거나 하는 메시지가 보이진 않네요! 그리고 로그를 보면 inbox delivery에 실패했다는 기록이 보입니다.
@rkttu남정현
@kodingwarriorJaeyeol Lee 헛… 상호운용성 문제가 있나 보군요. 혹시 Discourse 서버 도메인이 어떻게 되나요?
와~ 이제 Hackers'Pub의 PWA를 재설치하면 귀여운 고양이를 볼 수 있습니다.
코딩 에이전트 쓸 때마다 인간의 두뇌가 위대한 걸 새삼 깨닫는다. 특히 에이전트에게 맥락 꼬박꼬박 주입할 때마다 맥락을 능동적으로 획득하고 장기적으로 기억하고 순간적으로 인출해내는 인간의 능력이 대단한 것 같음
TUI 마스토돈 클라이언트에서 자동 새로고침 기능을 드디어 며칠(...)만에 정상 작동하게 고쳤다. 이제 나 혼자 마스토돈 탐라 힐끗힐끗 보는 용도로는 좋을듯 하다
DBMS 같은 데에서 파일을 관리 할 때엔 항상 4096 바이트 단위의 페이지 형태로 관리합니다. 왜그럴까요? 여러가지 이유가 있는데, 보통은 OS도 4096 바이트 단위로 파일 시스템을 관리하기 때문입니다. 그래서 캐시 같은 OS의 여러 가속 장치들의 도움을 받을 수 있죠.
근데 정말로 그럴까요?
그게 궁금해서 직접 한번 페이지 파일 매니저를 구현해서 실험해봤습니다. 통계적으로 유의하게 빠르네요.
TIL: 빈 파일을 만들어서 열고, seek로 적당히 건너뛴 다음 거기서부터 write를 하면, 건너 뛴 부분은 전부 0으로 알아서 채워주고 파일 크기도 자연스럽게 늘어난다.
이걸 왜 제가 몰랐는지 설명해주실분
스플래시 스크린 바꾸고 스크린샷 찍으려는 시도...
srvx에 기여했다!
바이브 코딩(5분만에 생성하고 4시간동안 뜯어고치기)
@robin 오… 기대하고 있습니다!
이런 거 필요했는데 잘 됐다!
일하기 좋은 카페/코워킹/워케이션 지도를 개편하게 되서 소식을 공유합니다. 네이버 지도 리스트에 1000개를 넘게 등록할 수 없어서, 지도를 카테고리별로 다시 분리하면서 여러 지도를 편하게 찾아보실 수 있도록 링크트리로 통합 페이지를 만들었습니다. :-D
@rkttu남정현 오… 너무 유용한데요? 공유 감사합니다!
일하기 좋은 카페/코워킹/워케이션 지도를 개편하게 되서 소식을 공유합니다. 네이버 지도 리스트에 1000개를 넘게 등록할 수 없어서, 지도를 카테고리별로 다시 분리하면서 여러 지도를 편하게 찾아보실 수 있도록 링크트리로 통합 페이지를 만들었습니다. :-D
나는 모듈끼리 circular dependent한걸 허용하는게 낫다고 생각한다. 코드를 쪼개는데에는 제한이 있으면 안된다.
Hackers' Pub PWA 재설치 해도 스플래시 스크린에도 고양이가 나오지 않는군요. 이건 고쳐야 한다.
바이브 코딩(5분만에 생성하고 4시간동안 뜯어고치기)
보고서 쓰는데 자꾸 투머치토커 본능이
https://fonts.google.com/specimen/Google+Sans+Code
구글에서 프로그래머를 위해 공개한 폰트.
RedBase라고 혹시 아시나요. Stanford에서 교육용으로 학생들이 직접 만들게끔 하는 DBMS인데요, 이걸 Python 버전으로 만들어보고 있습니다. 이름하야 BlueBase. 완성되면 과제용 구현부만 비워둔채로 공유할게요. 많은 기대 바람(?)
1.8 마일스톤 까지 얼마 안남아서 푸쉬 겸 이슈 남은거 있으면 좀 가져갈까 했는데, 다 할당되어 있어서 신경은 안써도 되겠군. 대시보드나 마저 만들어야지
Fedify를 활용하여 제가 만드는 텍스트 전용 블로깅 플랫폼인 타이포 블루에 연합우주 기능을 구현했습니다. 많은 관심 부탁드립니다!
연합우주 연동 기능이 추가되었습니다.
오늘부터 타이포 블루에서 연합우주 기능을 활성화하면 블로그가 연합우주에서 발견 가능해집니다.
마스토돈, 미스키 등 ActivityPub 플랫폼 사용자들이 블로그의 업데이트를 팔로우할 수 있습니다.
연합우주에서의 반응(댓글, 리액션 등)을 타이포 블루에서 받아볼 수 있습니다.
수정 테스트!
RxJS의 pipe
를 흉내내서 뭔가 만들고 있는데, pipe
안에 들어가는 함수가 operation oriented가 되도록 유도한다. 즉, x.pipe(f(y))
가 f(y,x)
로 해석되어야하니, f
는 data oriented가 아닌 operation oriented가 되어야하는 것이다. 근데, 나도 일반적으로 operation oriented를 선호하긴하지만 JS의 관례는 그게 아니다. 그래서 f
를 pipe
를 통해서 쓰지 않을 경우에 어떤 사람들은 생소하게 느낄거 같다. 나는 x
가 this
처럼 사용되고(data oriented), pipe
는 메소드 확장의 역할을 맡게 하고 싶다.
어떻게 하는게 맞을까?
와! 런타임을 세 개나 지원하니까 테스트 통과하는 쾌감도 세 배!
8月3日(日)にOSC 2025 京都で開催される「Fediverseのつくりかた 〜開発者・管理者たちの現場から〜」セミナーで、「BotKit by Fedify:誰でも簡単に作れるActivityPubボット」というテーマでオンラインにて約10分間発表します。普段からフェディバースボットの制作に興味がある方には、きっと興味深く聞いていただけるのではないかと思います。参加費も無料ですので、ぜひ多くの方のご参加をお待ちしております。
in을 종종 int로 오타내는데 뭔가... 뭔가 좀 그렇다...
요즘 gemini-cli를 많이 쓰고 있는데 이게 TUI라서 복붙 같은 것도 미묘하게 잘 안 되고 텍스트도 깨지고 하는 게 짜증난 나머지 내 코딩 에이전트를 만들겠답시고 Angel이라는 걸 만들기 시작했다. https://github.com/lifthrasiir/angel
소프트웨어 스택은 Go + TypeScript + React. 프론트엔드를 내가 만들어도 되지만 사실 React에 그렇게 자신이 있는 건 아니라서 100% 바이브 코딩을 해 보겠다는 목표로 하고는 있는데 결국 디버깅은 내가 다 하고 있다는 함정이 있다. 이를테면 사진에 나와 있는 코드는 JS에서 String.prototype.split
이 받는 limit 인자의 해석 관련된 질문인데 이거랑 관련된 버그로 2시간 정도를 날렸다. (JS는 놀랍게도 'a,b,c'.split(',', 2)
하면 ['a','b']
가 나온다. ['a','b,c']
가 아니라!!!! 그럼 왜 처음에 그렇게 짜 줬는데???)
What is the biggest reason that makes you hesitate to adopt #Fedify?
시간이 지날 수록 Cursor랑 대화할 때 사용하는 주어가 바뀌는게 재밌네.
- 초반에는 "나 지금 XX를 만들고 싶어" 와 같은 식으로, 내가 작업의 메인이니까 넌 검색해와 같은 느낌에 가까웠다.
- 조금 익숙해지니까 점점 "너가 XX를 만들어 와" 라고 일을 위임하는 어조로 바꼈다.
- 그러다가 오늘 코드를 지칭할 때 무의식적으로 "우리가 만든 코드"라는 표현을 사용했다. 개발 사이클을 여러 번 돌리다보니 공동 저작물이라는 인식이 나도 모르게 생겼나보다.
질 수 없다 책 쓰러 감요
OSSCA 중간레포트 쓰는데 대략잡아서 5페이지 정도 되는 분량이 뽑히는데 이게 맞나.... 내 성향이 들어가니까 예시보다 너무 투머치해짐...
감동적인 아침이다
슬랙에 프로세싱 처리 완료 알림만 있음
에러 없고 😗
공부할건 많은데 일하느라 시간이 없다. 이러다 은퇴하고 몰아서 할듯
애플 실리콘 맥에서 Windows VM을 돌리고 계시거나, 퀄컴 프로세서를 쓰는 윈도우 PC를 사용하시는 분들 중에서 Discord ARM64 네이티브 버전을 찾고 계시다면 아래 레딧 스레드에 올라온 링크에서 ARM64 개발용 빌드를 일단 설치해보세요. 일렉트론 앱들은 ARM64 빌드가 필수입니다.
https://www.reddit.com/r/Surface/comments/1l0z1qh/discord_arm64_native_canary_build_now_available
tsconfig에 stripInternal
란게 있군요?
JS에선 Java처럼 package-level visible property를 못만들다보니, 상호 참조가 많은 클래스를 정의할때 죄다 public으로 해야하는게 별로네. 내부 클래스와 그걸 래핑한 유저한테 노출하는 클래스(또는 인터페이스)를 따로 만들어야 하나.
모던 C++도 C++이다.
마크다운 기반의 콘텐츠만 가지고 웹 사이트를 만들면서도, Hugo, mkdocs, Jekyll 등등 온갖 도구 쓸 필요 없이 브라우저에 얹히는 스크립트만 갖고 비슷한 걸 만들어볼 순 없을까 심술이 나서 ChatGPT와 Claude로 만들어본 물건인데 꽤나 쓸만한게 나왔네요.
덕분에 식탁보 홈페이지를 Bootstrap 기반으로 빠르게 리뉴얼할 수 있었습니다. :-D
https://github.com/yourtablecloth/yourtablecloth.github.io/blob/main/docs/index.html
ソフトウェアのバージョン番号「0.3.0」は日本語でどう読みますか?「零点三点零」?それとも、「ゼロ点三点ゼロ」?