이것으로 BotKit 0.2.0에 넣으려고 생각했던 기능은 다 추가했다. 이대로 0.2.0 출시하면 되려나? 뭔가 놓친 게 없으려나? 🤔

洪 民憙 (Hong Minhee)
@hongminhee@hackers.pub · 909 following · 631 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
Coming soon in #BotKit 0.2.0: Native #quote post support!
We're excited to share a preview of the upcoming quoting features in BotKit 0.2.0. This update will make it easier for your bots to engage with quoted content across the fediverse.
The quoting feature set includes:
- Detecting when someone quotes your bot's posts with the new
Bot.onQuote
event handler - Accessing quoted content through the
Message.quoteTarget
property - Creating quote posts using the
quoteTarget
option inSession.publish()
andMessage.reply()
methods
Here's a quick example of how you can use the quote detection:
bot.onQuote = async (session, quote) => {
// The quote parameter is a Message object representing the post that quoted your bot
await quote.reply(text`Thanks for quoting my post, ${quote.actor}!`);
// You can access the original quoted message
const originalPost = quote.quoteTarget;
console.log(`Original message: ${originalPost?.text}`);
};
And creating quote posts is just as simple:
// Quote in a new post
await session.publish(
text`I'm quoting this interesting message!`,
{ quoteTarget: someMessage }
);
// Or quote in a reply
await message.reply(
text`Interesting point! I'm quoting another relevant post here.`,
{ quoteTarget: anotherMessage }
);
Remember that quoting behavior may vary across different #ActivityPub implementations—some platforms like Misskey display quotes prominently, while others like Mastodon might implement them differently.
Want to try these features right now? You can install the development version from JSR:
deno add jsr:@fedify/botkit@0.2.0-dev.90+d6ab4bdc
We're looking forward to seeing how you use these quoting capabilities in your bots!
혹시 자야되는 때를 넘긴 것 아닌가요? 졸음을 참고 작업하면 어떤식으로든 탈이 나는 경험을 자주하고 나니, 이제 졸리면 잡니다. 세상 안무너진다하고.ㅎㅎ @hongminhee洪 民憙 (Hong Minhee)
@lionhairdino 네, 평소보다 좀 늦게 잤던 것 같네요. 그래서 그런가 봐요.
“자고 일어나서 마저 해야지!” 하고 자고 일어났는데 어디까지 했고 뭘 해야 하는지 다 까먹었다.
Deno 표준 라이브러리에 parseMediaType()
이라는 유용한 함수가 있었구나… 그것도 모르고 맨날 만들어서 썼네.
Aider와 함께하는 바이브코딩이라는 주제로 글감을 관리하기 위한 타래
친구가 외국 반도체회사에 다니는데 이름만 들으면 다 아는 세계에서 손꼽히는 회사다. 1년 전쯤에, 친구가 자기 팀에서 예전부터 쓰고있는 시뮬레이션 코드가 너무 복잡해서 리팩토링 하고 싶다고 나를 찾아왔다. 한 2, 3000줄 되는 Numpy 코드였다.
나는 시뮬레이션의 의미 자체는 전혀 이해를 못하니(이래서 보안문제도 익스큐즈 할수 있었을 것이다), 그냥 코드의 모양만 보고 이상한 부분을 조금씩 고쳐나갔다. 그... 전형적인 물리학자들의 실험실 코드였다(코드를 못짜는건 이해를 하는데, 거기에 대해 한치의 부끄러움도 느끼지 않는다는 점이 뒷목을 잡게 만든다). Numpy 함수도 제대로 활용을 못해놨길래, 나도 Numpy 잘 못쓰지만 대충 이런 함수가 아마 있겠지... 하고 검색해서 찾아내서 교체하고 이런걸 반복했다.
이것저것 고친 다음에 잘돌아가나 한번 실행을 해봤는데, 이럴수가. 시뮬레이션이 1000배 빨라졌다. 아니 뭐, 한 2배 3배 빨라졌으면 내 솜씨라고 자부할텐데, 1000배 빨라진거는 그냥 원래 코드가 똥통이었다고 해석할수 밖에 없다. 구라안치고 정말 1000배다. 1000배의 성능향상의 보답으로 나는 교촌치킨웨지콤보세트를 현장에서 받아먹었다.
그 이후에 어떤 일이 있었냐. 기존 시뮬레이션 코드로는 하루에 시뮬레이션을 2, 3번정도밖에 돌리지 못했는데, 1000배 빨라지고 나니까 결과가 수십초만에 나오니 하루에 수백번 돌릴수 있게 된것이다(내가 고친 코드가 전부는 아니어서 1000배 향상은 아닌데, 가장 큰 병목이긴 해서 결국 100배 이상이라는 듯). 그때부터 100배 많아진 데이터를 처리하기 위한 인프라가 필요해졌다. 그래서 거기 개발팀이 데이터베이스와 데이터 파이프라인 구축을 시작하게 되었다고 한다. 그 팀에서는 일종의 특이점이 시작된것이다;;
결론: 교촌치킨웨지콤보 세트는 개맛있었다.
기분 전환 삼아 어제부터 오랜만에 BotKit 작업을 좀 했는데, 생각보다 빨리 0.2.0 릴리스가 가능할 것 같은 느낌? 추가하려던 기능 세 개 중에 두 개나 벌써 완료되었다.
We're excited to introduce emoji reactions in the upcoming #BotKit 0.2.0 release!
With the new Message.react()
method, your bot can now react to messages using standard Unicode #emojis:
await message.react(emoji`👍`);
#Custom_emoji support is also included, allowing your bot to react with server-specific emojis:
const emojis = bot.addCustomEmojis({
// Use a remote image URL:
yesBlob: {
url: "https://cdn3.emoji.gg/emojis/68238-yesblob.png",
mediaType: "image/png",
},
// Use a local image file:
noBlob: {
file: `${import.meta.dirname}/emojis/no_blob.png`,
mediaType: "image/webp",
},
});
await message.react(emojis.yesBlob);
Reactions can be removed using the AuthorizedReaction.unreact()
method:
const reaction = await message.react(emoji`❤️`);
await reaction.unreact();
Want to try these features now? You can install the development version from JSR today:
deno add jsr:@fedify/botkit@0.2.0-dev.84+c997c6a6
We're looking forward to seeing how your bots express themselves with this new feature!
Continuing our emoji reaction feature announcement, we're also introducing two new event handlers—Bot.onReact
and Bot.onUnreact
—that let your bot respond when users react to posts:
// When someone adds an emoji reaction to a post
bot.onReact = async (session, reaction) => {
// Only respond when the reaction is to your bot's post
if (reaction.message.actor.id?.href === session.actorId.href) {
console.log(`${reaction.actor.preferredUsername} reacted with ${reaction.emoji}`);
// You can respond differently based on the emoji
if (reaction.emoji === "❤️") {
await session.publish(
text`Thanks for the love, ${reaction.actor}!`,
{ visibility: "direct" }
);
}
}
};
// When someone removes their emoji reaction
bot.onUnreact = async (session, reaction) => {
if (reaction.message.actor.id?.href === session.actorId.href) {
console.log(`${reaction.actor.preferredUsername} removed their ${reaction.emoji} reaction`);
// Optional: respond to reaction removal
await session.publish(
text`I noticed you removed your ${reaction.emoji} reaction, ${reaction.actor}.`,
{ visibility: "direct" }
);
}
};
These event handlers open up interesting interaction possibilities—your bot can now track popular reactions, respond to specific emoji feedback, or create interactive experiences based on reactions.
Want to try these features now? You can install the development version from JSR today:
deno add jsr:@fedify/botkit@0.2.0-dev.86+cdbb52a2
The full documentation for these features will be available when BotKit 0.2.0 is officially released!
ttps://github.com/malkoG/pitch-connect/
일단 fedify를 응용한 프로젝트 하나 도즈어어언!!!!!
@kodingwarriorJaeyeol Lee 참고로 Hackers' Pub은 Fresh 2.0 알파 버전을 미리 쓰고 있습니다. ㅎㅎㅎ Hackers' Pub 코드 참고하실 때 혼란스러우실까봐… Fresh 1.x랑 API가 꽤 달라졌어요.
ttps://github.com/malkoG/pitch-connect/
일단 fedify를 응용한 프로젝트 하나 도즈어어언!!!!!
@hongminhee洪 民憙 (Hong Minhee) 애플리케이션은 UI 때문에⋯
@curry박준규 맞아요… 적어도 CLI 정도만 되어도 할 만한데, GUI는 어려운 것 같아요.
@hongminhee洪 民憙 (Hong Minhee) 앗, 전설의(?) 책 tapl을 갖고 계시다니! 저는 그 책 너무 비싸서 도서관에서 잠깐 열람만 했었어요.
@curry박준규 저도 중고로 구하긴 했었습니다. ㅎㅎㅎ
역시 애플리케이션 만드는 것보다 라이브러리 만드는 게 더 재밌는 것 같다. 다들 이럴까, 내가 유독 그런 걸까?
We're excited to introduce emoji reactions in the upcoming #BotKit 0.2.0 release!
With the new Message.react()
method, your bot can now react to messages using standard Unicode #emojis:
await message.react(emoji`👍`);
#Custom_emoji support is also included, allowing your bot to react with server-specific emojis:
const emojis = bot.addCustomEmojis({
// Use a remote image URL:
yesBlob: {
url: "https://cdn3.emoji.gg/emojis/68238-yesblob.png",
mediaType: "image/png",
},
// Use a local image file:
noBlob: {
file: `${import.meta.dirname}/emojis/no_blob.png`,
mediaType: "image/webp",
},
});
await message.react(emojis.yesBlob);
Reactions can be removed using the AuthorizedReaction.unreact()
method:
const reaction = await message.react(emoji`❤️`);
await reaction.unreact();
Want to try these features now? You can install the development version from JSR today:
deno add jsr:@fedify/botkit@0.2.0-dev.84+c997c6a6
We're looking forward to seeing how your bots express themselves with this new feature!
TypeScript에서 쓰는 브랜디드 타입(branded type) 패턴, 그럭저럭 쓸만하네.
거의 15년 전에 야심 넘치게 Benjamin C. Pierce의 Types and Programming Languages를 한 권 장만했지만 아직도 아주 깨끗하다. 앞으로도 읽을 일이 없을 것 같다… ㅋㅋㅋ
TypeScript에서 쓰는 브랜디드 타입(branded type) 패턴, 그럭저럭 쓸만하네.
어 hackers.pub과 hollo.social 은 다른건가? 목적도 다른가보구나?!
@minhoryang Hollo는 ActivityPub을 지원하는 1인 사용자용 설치형 마이크로블로그입니다. 저 hollo.social 인스턴스는 제가 직접 운영하고 있고요. Hackers' Pub은 아예 다른 코드베이스고 설치형도 아니예요!
마스타돈에서 댓글다는 https://hackers.pub/authorize_interaction?uri= 이 API가 아직 없나보네요?
@minhoryang 네, Hackers' Pub은 Mastodon 호환 API는 구현 안 하고 있어요. (앞으로도 구현 안 할 예정입니다.)
We're excited to announce that #BotKit 0.2.0 will introduce custom emoji support! This feature allows your bots to express themselves with more personality and engagement.
What's included:
- Add custom emojis to your bot with
Bot.addCustomEmojis()
- Use emoji in messages with the
customEmoji()
function - Support for both local image files and remote URLs as emoji sources
- Full integration with BotKit's text formatting system
Simple example:
// Define custom emojis
const emojis = bot.addCustomEmojis({
botkit: { file: "./botkit.png", type: "image/png" },
fedify: { url: "https://fedify.dev/logo.png", type: "image/png" }
});
// Use in messages
await session.publish(
text`Hello world! ${customEmoji(emojis.botkit)}`
);
Want to try it early? You can install the development version from JSR today:
deno add jsr:@fedify/botkit@0.2.0-dev.82+8a0438e6
@hongminhee洪 民憙 (Hong Minhee) Sonnet Thinking이 아닌데도 Gemini가 더 빠른가요?
@bglbgl gwyng 네! 훨씬 빠른 것 같은데요?
바이브 코딩에 줄곧 Claude Sonnet 3.7만 쓰다가, 오늘 Gemini 2.5 Pro를 써 봤는데, 코딩을 더 잘 하는지는 잘 모르겠지만 응답 속도 하나만은 훨씬 빨라서 좋다. 바이브 코딩을 하다가 결국 답답함을 못 참고 내가 직접 코딩하게 되는 까닭 중 하나가 기다림의 지루함이었는데, 그 부분이 많이 완화된달까?
하스켈 패키지 서버 에러 나서 라이브러리 문서를 못보니까 코딩을 못하네!
터미널에 대해 궁금한 점이 생겨 자료를 찾다 보니 Windows Console Team에서 연재한 시리즈물을 발견했는데, 그 내용이 참 유익했다.
Windows Command-Line Series:
- Backgrounder
- The Evolution of the Windows Command-Line
- Inside the Windows Console
- Introducing the Windows Pseudo Console (ConPTY)
- Unicode and UTF-8 Output Text Buffer
콘솔 앱이 터미널과 입출력을 주고 받는 것을 공기처럼 당연하다고 생각했는데, 그 과정에는 커서 이동이나 개행 등과 같은 제어 문자를 렌더링하거나 SIGINT 같은 시그널을 발생시켜주는 처리가 존재했다. 터미널과 콘솔 앱이 서로 분리된 구조가 과거 물리 터미널로부터 비롯된 것도 흥미로웠고 말이다. 사실 이해 못 한 부분이 아직 많아서 다음에 또 읽어볼 생각이다.
암호학에 나오는 Alice와 Bob을 가은이와 나은이로 번역하는 생각
As someone who has developed several #ActivityPub software implementations (Fedify, Hollo, BotKit, and Hackers' Pub), I believe one of the most frustrating features to implement in the #fediverse is #custom_emoji.
The challenges are numerous:
First, there's no standardization. ActivityPub specifications don't define how custom emoji should work, leading to inconsistent implementations across different servers like Mastodon and Misskey.
Rendering is particularly problematic. Emojis must display properly across different contexts (in text, as reactions, in emoji pickers) while maintaining quality at various sizes. Animated emojis add another layer of complexity.
Perhaps most concerning is the poor #accessibility. Most implementations simply use the emoji code (like :party_blob:
) as the alt
text, which provides no meaningful information to screen reader users (in particular, non-English speakers) about what the emoji actually depicts or means.
What really dampens my motivation to implement this feature is knowing I'm investing significant effort into something that ultimately creates accessibility barriers. It's disheartening to work hard on a feature that excludes part of the community.
동료가 ChatGPT랑 사적이고 감정적인 대화도 점점 더 많이 나누고 있다고 한다. 그리고 그런 서비스 만들면 잘될거같다는데(이미 발전된게 꽤 있음). 근데 나는 도저히 저런 대화를 AI랑 못하겠던데 좀 신기하다. 이건 내가 LLM이 의식이 없다고 꽤 강하게 확신해서 그런거 같은데, 의식이 있다고 생각하는 사람들과 (절대 다수의) 그딴거 1도 신경안쓰는 사람들은 잘만 쓸것이다.
@bglbgl gwyng 그런데 사실 스스로 이외에는 사람들도 의식이 있는지 아주 확신할 수는 없죠… ㅋㅋㅋ 사실 사람한테 의식이 없을 수도 있다는 것은 너무 비현실적인 회의일 수도 있지만, 강아지는 어떤가, 새는 어떤가, 벌레는, 버섯은… 같은 식으로 나아가다 보면 LLM한테 의식이 있다고 볼 수도 있는 건가, 싶은 생각도 들긴 합니다. ㅎㅎㅎ
@hongminhee洪 民憙 (Hong Minhee)
@ayoAyo Ayco We have a roadmap repo for the RFC process: https://github.com/withastro/roadmap
We often have pretty good minimal user docs in the Stage 3/proposal, but even Stage 1 to just propose something encourages adding "end-goal" code examples of what it could look like if you're updating/changing/creating an API.
As for writing about our docs workflow, we've mostly focused on our community contributor process & guides like Astro Docs Docs (AD²) https://contribute.docs.astro.build , but a great idea!
@sarah11918Sarah Rainsberger
@ayoAyo Ayco Thanks for sharing the links! These would help me a lot!
@ayoAyo Ayco
@hongminhee洪 民憙 (Hong Minhee) It can be so helpful during design! Some people do it first-first. At Astro with our RFC process, minimal "docs" are updated as the feature is developed.
For Astro's new experimental Fonts API, we held not only an open API bash, but an API *docs* bash! After 2 hours looking at the draft docs ("Oh, it works like this? Oh, you expect people to do this? Oh, this is what it takes to explain how to use it?")... some design changes were implemented for sure, and everyone wins!
@sarah11918Sarah Rainsberger
@ayoAyo Ayco Wow! I had no idea Astro used this approach too. The concept of an API docs bash is brilliant! I completely agree that creating docs first helps validate the user experience early and dramatically improves development efficiency. Honestly, I didn't realize this was a more common practice. I'd love to hear more about your RFC process! Are there any blog posts or public resources about Astro's documentation workflow?
@ayoAyo Ayco
@hongminhee洪 民憙 (Hong Minhee) It can be so helpful during design! Some people do it first-first. At Astro with our RFC process, minimal "docs" are updated as the feature is developed.
For Astro's new experimental Fonts API, we held not only an open API bash, but an API *docs* bash! After 2 hours looking at the draft docs ("Oh, it works like this? Oh, you expect people to do this? Oh, this is what it takes to explain how to use it?")... some design changes were implemented for sure, and everyone wins!
@hongminhee洪 民憙 (Hong Minhee) I never start writing code before I gather enough context for the problem. Listening to possible customer's voices and collecting prior arts are one of the most important part of designing solutions.
@domatdo도막도 Exactly!
@hongminhee洪 民憙 (Hong Minhee) back in the day, we used to call this a "specification"
@TakTak! Haha, that might be a right word to call it!
For my library and CLI projects, I've been writing documentation before writing any code. It helps me imagine the final interface early on, which usually leads to better design. Sure, sometimes I miss implementation details and have to revise later, but hey—it's just docs. Docs are easy to change.
This tiny habit has surprisingly big payoffs. When I focus on how things will be used rather than how they'll be built, I end up with interfaces that actually make sense.
Anyone else do this? Curious about your experience with documentation-first approaches.
RE: https://hollo.social/@hongminhee/01964c76-ef1e-7994-b3f0-57f967742566
@hongminhee洪 民憙 (Hong Minhee) 잘하셨습니다! 휴식이 중요하죠. 왠지 인기 웹툰의 독자가 댓글로 작가를 응원하는 마음으로 민희 님의 건강을 응원하게 됩니다.
@curry박준규 감사합니다… ㅎㅎㅎㅎ
갑자기 Hackers' Pub 코딩에 손에 안 잡혀서 다른 코딩이나 좀 해야겠다… 그것도 잘 안 잡히면 코딩 자체가 손에 안 잡히는 걸테니 그냥 놀아야지.
어제는 결국 그냥 잤다… ㅋㅋㅋ
갑자기 Hackers' Pub 코딩에 손에 안 잡혀서 다른 코딩이나 좀 해야겠다… 그것도 잘 안 잡히면 코딩 자체가 손에 안 잡히는 걸테니 그냥 놀아야지.
Side quest sneak peek: a browser extension that visualizes (Service Worker) Cache Storage for web sites.
Decided to build this after seeing how difficult it is too see what's stored in Service Worker cache. They can (accidentally) take up quite a lot of storage space.
Repo: https://github.com/cheeaun/stakataka
Not released yet, under review in Chrome Web Store.
살면서 RTL 언어 지원을 한 번도 해 본 적이 없어서 무섭게 느껴진다. 아마 서양 프로그래머들도 CJK 보면 이런 느낌일까?
Sometimes I'm quite amazed by my own code 😳
The RTL work last year was quite insane https://mastodon.social/@cheeaun/112932794480750449
git submodule은 맨날 다시봐도 또 까먹는데 이게 내 문제일까 git submodule의 문제일까...
@bglbgl gwyng 저는 서브모듈 자주 쓰는 편이라 그런지 이젠 편하긴 한데, 자주 안 쓰면 그럴 것 같긴 해요.
I've been considering what to add in the next version of BotKit (v0.2.0) and wanted to share my current plans. After reviewing feedback and examining the #ActivityPub ecosystem, I've identified three key features that would significantly enhance the framework's capabilities:
-
Custom emoji support. This would allow bots to use server-defined custom emojis in their messages, making communication more expressive and allowing better integration with instance culture.
-
Emoji reactions. I plan to implement both sending and receiving emoji reactions to messages. This provides a lightweight interaction model that many users prefer for simple acknowledgments or responses. This would manifest as new event handlers (like
Bot.onReaction
) and methods (likeMessage.react()
). -
Quote posts. The ability to reference other posts with commentary is an important discourse feature in the fediverse. Supporting both sending quotes and detecting when bot posts have been quoted would enable more sophisticated conversational patterns.
These additions should make #BotKit more capable while maintaining its simple, developer-friendly API. I expect implementation to involve extending the Message
class and adding new Text
processing capabilities, all while keeping backward compatibility with existing bots. Having built both Hollo and Hackers' Pub, I already have deep familiarity with how various ActivityPub implementations handle these features across the fediverse. I welcome any community feedback on priorities or implementation details before I begin coding.
러스트 넣으니까 그냥 빌드 체감 1시간이네 틱톡 스크롤 50번은 내린듯
@z9mb1wwj 이래서 성능 좋은 컴퓨터를 쓰고 싶어지는 것 같아요…
리누스 토발즈의 ‘깃(Git)’ 20주년 소회 “별일 아니었다”
“나는 그냥 내게 필요해서 ‘깃’을 만들었다. 만들고 4개월만에 흥미를 잃었다. 20년 중...
ちなみにLinuxではDebian系がamd64、RedHat系がx86_64の表記を好むらしい
Microsoftはx64表記になることが多い
https://onoredekaiketsu.com/x86-64-x64-amd64-what-is-the-difference-between-these/
@joonnotnotJoon 오, 후원 감사합니다!
洪 民憙 (Hong Minhee) shared the below article:
웹 접근성이 UI 설계에 중요한 이유
김무훈 @iamuhun@hackers.pub
웹 접근성의 중요성과 WAI-ARIA 표준을 바탕으로 한 의미론적인 UI를 설계한 사례를 블로그에 공개했습니다.
전문성 검증이 필요한 분야이다 보니, 퇴고 과정에 접근성 전문가 @resistan 님의 도움을 받았습니다.
@saengmotmi생못미
@jasonkim자손킴 안녕하세요, 어서 오세요!