
洪 民憙 (Hong Minhee) 
@hongminhee@hollo.social
1,099 following1,872 followers
An intersectionalist, feminist, and socialist living in Seoul (UTC+09:00). @tokolovesme's spouse. Who's behind @fedify, @hollo, and @botkit. Write some free software in #TypeScript, #Haskell, #Rust, & #Python. They/them.
서울에 사는 交叉女性主義者이자 社會主義者. 金剛兔(@tokolovesme)의 配偶者. @fedify, @hollo, @botkit 메인테이너. #TypeScript, #Haskell, #Rust, #Python 等으로 自由 소프트웨어 만듦.
- Website
- Hackers' Pub
is it good for iot education (rpi)
thonny.org
Thonny, Python IDE for beginners
@bgl Different goals, really. AssemblyScript is its own statically-typed language that happens to look like TypeScript: it accepts a strict subset of the syntax, wants explicit types like i32/f64 rather than dynamic values, and doesn't implement JavaScript's actual object and prototype semantics. You write new code specifically within those constraints to get compact WebAssembly out. Oseo is trying to keep full ECMA-262 dynamic semantics, arbitrary shapes, any, all of it, and still reach native code, with types and JSDoc used only as opt-in hints that fall back to a compiled generic path whenever they're wrong. AssemblyScript trades JavaScript semantics for a clean path to WebAssembly; Oseo is betting it doesn't have to make that trade. Similar-looking syntax, close to opposite premises.
That JavaScript/TypeScript runtime idea I mentioned has mutated a bit.
Once I actually thought about it, writing another Node.js/Deno/Bun-shaped runtime didn't seem especially useful; there are enough of those already. What I actually want to try is an ahead-of-time JavaScript/TypeScript compiler in roughly the SBCL/Chez Scheme tradition: native code, with a generic implementation always available and specialized versions picked by cheap runtime guards. A failed guard just falls through to code that's already compiled, rather than needing an interpreter or a deopt path. There are probably adjacent projects doing pieces of this, so I won't claim the territory is empty, but I haven't seen this exact shape applied to JavaScript/TypeScript. I've codenamed it Oseo (鼯鼠; flying squirrel in Sino-Korean).
It's still just a compiler experiment, not something I'd call presentable yet, so the repo stays closed for now. Once it works well enough, the first thing I want to try is switching the Fedify CLI, currently built with deno compile, over to Oseo and seeing what breaks. Fedify is the ActivityPub server framework I also maintain, so it should make a reasonably unforgiving first customer. I'll keep picking at Oseo for the next few months and post again when something interesting starts working.
Major updates were made to the delightful fediverse curated lists..
💎 delightful fediverse experience
- 52 new projects added
- 50 projects marked unmaintained
- 15 projects updated
New list categories:
- Professional networks
- Instant messaging
- Search engines
- Security and privacy
https://delightful.coding.social/delightful-fediverse-experience
💎 delightful fediverse development
- 18 new projects added
- 20 projects marked unmaintained
- 5 projects updated
- 7 projects removed
- Improved table of contents
- Listed SWICG / SocialCG task forces
- More improvements pending
New list categories:
- SWICG Task forces
- Data portability
- Developer hubs
- Data formats
https://delightful.coding.social/delightful-fediverse-development
💎 delightful fediverse clients
- 16 new projects added
- 33 projects marked unmaintained
- 5 projects updated
- 3 projects removed
- Separate section for unmaintained
https://delightful.coding.social/delightful-fediverse-clients
delightful.coding.social
delightful fediverse clients
Delightful curated lists of free software, open science and information sources.
"artist-alley implements ArchivePub, an open federation protocol built on the ActivityPub data model with DAM-shaped extensions for asset sharing, workflow state, and brand workspaces."
"Content-addressed federation:
Every reference to asset bytes uses a content-addressed URI:
cas://<sha256>?content-type=image/png&size=12345"
https://artist-alley.org/docs/archivepub
#ActivityPub #fedidev #ArchivePub
artist-alley.org
ArchivePub
ArchivePub — the open, ActivityPub-shaped federation protocol that lets independently-operated DAM instances share assets, reviews, and workflow state. Wire format, trust model, and the canonical protocol context.
I Regret Migrating to Codeberg https://lobste.rs/s/4cpv1m #vibecoding
https://xn--gckvb8fzb.com/i-regret-migrating-to-codeberg/
xn--gckvb8fzb.com
I Regret Migrating to Codeberg
A brief comment on Codeberg’s new terms, and why a free-software host deciding which projects are welcome worries me more than the bans themselves.
@evan @siliconsjang Oh, yes! I once introduced SiliconBeest before!
A friend of mine, @siliconsjang, released SiliconBeest v1.0.0 today. It's a #fediverse server built on #Cloudflare Workers, D1, R2, and Queues, using Fedify.
I like the starting point: after watching fediverse servers go down together during Cloudflare outages, they thought, why not just run on Cloudflare directly?
They're aiming for something cheap enough that a small instance can stay on Cloudflare's free plan, and a somewhat bigger one can fit in the $5/month tier. It's still early; a lot is missing, and Mastodon/Misskey API compatibility is more of a long-term goal.
I'm glad to see Fedify put to use for something like this. Worth checking out.
The source code is on GitHub under AGPL 3.0.
github.com
GitHub - SJang1/siliconbeest: Fediverse in Cloudflare Workers + live serverless code
Fediverse in Cloudflare Workers + live serverless code - SJang1/siliconbeest
#SiliconBeest looks really interesting! The previous implementation of #ActivityPub on #CloudFlare, #Wildebeest, was kind of a hassle to spin up. I'm interested to see what the uptake is with this one. The creator @siliconsjang says they want to make it fit in the $5/month tier at CloudFlare, which sounds pretty good. Also, cool to see that it uses #Fedify for federation.
github.com
GitHub - SJang1/siliconbeest: Fediverse in Cloudflare Workers
Fediverse in Cloudflare Workers. Contribute to SJang1/siliconbeest development by creating an account on GitHub.
Just created my CodeFloe account!
codefloe.com
洪 民憙 (Hong Minhee)
A software engineer from Seoul. An advocate of F/OSS and fediverse. Hack into East Asian languages.
Now that #codeberg has manifested their anti-AI view with a 70% in favor vote (https://codeberg.org/Codeberg/org/pulls/1253), we're happy to welcome (once again) all the people which have to/want to move their repositories off Codeberg but still want to stay on a Forgejo-based instance.
Bonus: on top you'll get better uptime, faster site responses and faster CI runners - all for free :)
tl;dr: after this ToU change, keeping AI-generated code on Codeberg would violate these and repositories will be in danger of deletion.
codeberg.org
Proposal Assembly 2026: ToU extension to prohibit LLM-extrusions
Here is the proposed addition for the ToU that @Gusted and I agreed on post-assembly for the upcoming membership vote. 🙏 The discussion for this proposal is available for Codeberg e. V. members in the forum: https://forum.codeberg.org/d/139-resolutions-for-assembly-on-codeberg-taking-a-stand-a...
Now that #codeberg has manifested their anti-AI view with a 70% in favor vote (https://codeberg.org/Codeberg/org/pulls/1253), we're happy to welcome (once again) all the people which have to/want to move their repositories off Codeberg but still want to stay on a Forgejo-based instance.
Bonus: on top you'll get better uptime, faster site responses and faster CI runners - all for free :)
tl;dr: after this ToU change, keeping AI-generated code on Codeberg would violate these and repositories will be in danger of deletion.
codeberg.org
Proposal Assembly 2026: ToU extension to prohibit LLM-extrusions
Here is the proposed addition for the ToU that @Gusted and I agreed on post-assembly for the upcoming membership vote. 🙏 The discussion for this proposal is available for Codeberg e. V. members in the forum: https://forum.codeberg.org/d/139-resolutions-for-assembly-on-codeberg-taking-a-stand-a...
Ghostty and libghostty are now on Zig 0.16! This was done by a [paid!] contributor over a few weeks. Through this process, the Ghostty non-profit also paid for hours to contribute over a dozen patches upstream to Zig, translate-c, and arocc which help the entire ecosystem. Really amazing work (not by me!) and happy to be upgraded. :)
arocc: https://github.com/Vexu/arocc/pulls?q=author%3Avancluever+is%3Aclosed
github.com
Pull requests · Vexu/arocc
A modern fully featured C compiler. Contribute to Vexu/arocc development by creating an account on GitHub.
Culture change is hard. Sooooo many people got here "first" and think their claim is the only correct one. Has always been thus ...
One thing I can think of is remind people that r/fediverse is not exactly the place where "the fediverse" is developed, managed, or happening.
Then follow this dev and see what is up! I care much more that the software and the instance are acting like decent neighbours than I do about the infra its hosted on.
LLVM21 is a stinker and has worse codegen in general, and a bug forced disabled loop auto-vectorization. Turned out to be a blessing: we clearly identified areas we were over-reliant on implicit compiler optimizations and were able to explicitly restructure our code to what we really wanted.
The result is that we now have clean generic SIMD subroutines in places we previously relied on auto-vectorization. And we did it better and as a result produced faster code (see below). Pure ASCII throughput improved more than 20% (30% on Linux) which is insane and is purely because we wrote better SIMD than an auto-vectorizer can. Lit.
We also found it stopped inlining automatically in certain places which destroyed some benchmarks based on real world corpuses. As a result, we now explicitly inline those backed by benchmarks. Wonderful.
"Exotic"-sized integers (e.g. u13) also cause poor LLVM codegen and some performance pitfalls were fixed by adding padding to power-of-two sizes. I know Zig is working on a sema fix for this to avoid LLVM ever seeing these.
Note when I said "in general" above I mean that this was consistently across macOS aarch64, Linux aarch64, and Linux x86_64. Just across the board bad codegen.
Some things slowed down more than can be attributed to noise. I'm looking into that now but they're minor benchmarks. The important ones are parity or better.
Yeah, I'm noticing that more and more. Nothing is able to pass the purity tests. Nobody is good enough. So, doing ANYTHING means we're going to berate you for it.
I try to avoid going straight to the conspiracy theories, but it makes a lot of sense. No better way to discredit something than "false flag"
@benpate i can think of worse companies to host with tbh. Funnily enough these same people probably don't get that a significant portion of the fediverse is actually behind cloudflare's CDNs.
I think these "do as I say" holier than thou types are the bane of the decentralised web. Like, if I wanted to drive people away from open social projects, that's exactly how I'd do it: hire a small group of people to consistently be assholes to other's. It's like 101 from the CIA field guide to sabotage 🚩
A developer in Korea just built a Fediverse server that runs directly on CloudFlare.
/r/fediverse users responded:
"this is cancer"
"you are a horrible person"
???
Can you please help me with a genuine question: what would make the #Fediverse a more welcoming place?
Yes, humans are just grumpy sometimes. But a real solution can't just be more HOA members reading the rules at the door.
What do YOU think would make a difference here?
Optique, a type-safe combinatorial CLI parser for TypeScript, just shipped 1.2.0.
Modifiers are chainable now: option(…).map(…).withDefault(…). deferredValue() defers a fallback until the handler asks for it.
Four new packages:
@optique/prompt@optique/clack@optique/standard-schema@optique/derived-defaults
@optique/discover gains lifecycle hooks and a static-module generator, and optique.dev has a new look.
github.com
Optique 1.2.0: fluent modifiers, deferred values, new integrations, and a redesigned site · dahlia/optique · Discussion #877
Optique 1.2.0 adds a method-call style for modifiers, a deferredValue() parser for fallbacks that should only resolve inside a handler, and four new packages: @optique/prompt, @optique/clack, @opti...
maybe sometimes it could be subject to misunderstanding for those who don't know about some differences
eg. 質問 is more like "asking in a confrontational way" in modern mandarin chinese but it's just plain "asking" in japanese and korean
hollo.social
中國·日本·臺灣 等의 非韓國語 話者들을 向한 質問: 如…
中國·日本·臺灣 等의 非韓國語 話者들을 向한 質問: 如斯하게 作成된 國漢文混用體 韓國語 文章을 理解 可能한가요?
中國·日本·臺灣 等의 非韓國語 話者들을 向한 質問: 如斯하게 作成된 國漢文混用體 韓國語 文章을 理解 可能한가요?
- 大體로 理解 可能하다22 (45%)
- 어느 程度 理解 可能하다23 (47%)
- 理解 不可能하다4 (8%)
hollo.social
中國·日本·臺灣 等의 非韓國語 話者들을 向한 質問: 如…
中國·日本·臺灣 等의 非韓國語 話者들을 向한 質問: 如斯하게 作成된 國漢文混用體 韓國語 文章을 理解 可能한가요?
This quote was not authorized by the quoted post's author.
the new hackers' pub is looking really nice. seeing that botkit now supports FEP-044f I wonder if that means full QP support will soon arrive here and Hollo
hackers.pub
BotKit 0.5.0: A new design language, multi-bot instances, and consent-respecting quotes
BotKit 0.5.0 introduces significant updates to the framework, headlined by the ability to host multiple bots from a single process through a new multi-bot instance architecture. This release brings a visual overhaul to both the documentation site and the automatically generated bot pages, replacing external dependencies with a self-contained, customizable design system that improves visitor privacy. A major technical addition is the support for FEP-044f, which implements a consent-based handshake for quoting messages to ensure better compatibility with Mastodon’s quoting mechanisms. Developers can now utilize a new Redis-backed repository for shared production environments, complementing existing storage options with robust concurrency handling through short-lived locks. The update includes breaking changes for custom repository implementations and shifts bot sessions to a read-only model to support lazy resolution of bot identities. These enhancements provide developers with greater flexibility in deploying complex bot fleets while maintaining high standards for privacy and Fediverse interoperability.
We're pleased to announce BotKit 0.5.0. This release changes how both the docs site and every bot's own pages look, and it stops limiting a server to one bot: a single process can now host a whole fleet of them. Quoting, and being quoted, goes through a consent step under FEP-044f, and a Redis-backed repository joins the SQLite and PostgreSQL ones for shared production storage. A few of these changes are breaking; see below for what to check before you upgrade.
A new look for botkit.fedify.dev
Until this release, botkit.fedify.dev read like a stock VitePress site: a workable but generic shell wrapped around the docs, with none of BotKit's own personality showing through.
The theme and the landing page are both new. The palette now matches the real logo greens instead of a generic default, and headlines are set in Space Grotesk, paired with Inter for everything else; the display font is self-hosted, so no visitor's IP is handed to a font CDN. The new landing page frames BotKit's dinosaur mascot inside its signature unassembled-model-kit sprue frame, then leads with a tabbed installer for Deno, npm, pnpm, and Yarn and a one-file bot example before getting into what BotKit actually does: messages, events, multi-bot instances, and the pages it builds for a bot without any extra work from you.

The deployment guides grew alongside the new landing page: they were split apart and fleshed out, and a new Cloudflare Workers guide joins the existing Deno Deploy, Docker, and self-hosting guides.
A new look for your bot's pages
The pages BotKit serves for your bot (its profile, its posts, its follower list) got the same attention, in the opposite direction. Until now they were built on Pico CSS pulled from an external CDN: a fine default, but a generic one that made every BotKit-hosted bot look like a demo of the same template, and that quietly sent every visitor's browser off to fetch a stylesheet from someone else's server.
That's gone. Bot pages now use a self-contained design system, bundled with the package and served from BotKit's own content-addressed, cache-forever path: no external CDN, no build step, on either Deno or Node.js. The whole look is driven by a single accent color you choose (twenty names, the same legend Pico CSS uses, so your existing choice of color still works), tinting links, the follow button, and small highlights, while everything else stays quiet so your bot's name, avatar, and posts are what a visitor actually notices. A new PagesOptions.theme option ("auto", "light", or "dark") controls the color scheme independently of the accent. A repost is now marked and attributed to its original author instead of blending into the bot's own timeline.

If you want to go further than the accent color allows, PagesOptions.css still lets you inject custom CSS on top of BotKit's own stylesheet.
Multi-bot instances
Until this release, a BotKit process could only ever be one bot. Running a second bot meant standing up a whole second server, even when the two bots could easily have shared the same infrastructure. That limitation, raised in #16, is gone: the new createInstance() function creates an Instance that owns the shared plumbing (the key–value store, the message queue, the repository, and HTTP handling), and any number of bots can live on it side by side, each with its own actor identity and event handlers.
For a fixed, known set of bots, Instance.createBot() takes an identifier and a profile:
import { createInstance, text } from "@fedify/botkit";
import { MemoryKvStore } from "@fedify/fedify";
const instance = createInstance<void>({ kv: new MemoryKvStore() });
const greetBot = instance.createBot("greet", {
username: "greetbot",
name: "Greeting Bot",
});
greetBot.onFollow = async (session, followRequest) => {
await followRequest.accept();
await session.publish(text`Welcome, ${followRequest.follower}!`);
};
For a family of bots resolved on demand (one per region, one per customer, thousands of them backed by a database), pass a dispatcher function instead of a fixed identifier, and BotKit resolves and federates each one lazily:
const weatherBots = instance.createBot(async (ctx, identifier) => {
if (!identifier.startsWith("weather_")) return null;
const region = await db.getRegion(identifier.slice("weather_".length));
if (region == null) return null;
return { username: identifier, name: `${region.name} Weather Bot` };
});
weatherBots.onMention = async (session, message) => {
const code = session.bot.identifier.slice("weather_".length);
await message.reply(text`Current weather: ${await db.getWeather(code)}`);
};
Incoming activities are routed only to the bots they actually concern: the followed bot, the owner of a liked or replied-to message, mentioned bots, and bots followed by the sender. Multi-bot instances also serve a list of hosted bots at the web root, with each bot's own pages moving to /@{username}; a reserved instance actor signs shared-inbox requests when there's no single bot whose key obviously should.
None of this touches single-bot deployments: createBot() keeps working exactly as it always has, with the bot's pages staying at the web root and its data migrated to the new storage layout automatically on startup. If you maintain a custom Repository implementation, though, this is a breaking change worth planning for: every method now takes the owning bot's identifier as its first parameter, Session.bot is a read-only ReadonlyBot instead of a mutable Bot, and local object URIs carry the owning bot's identifier (old-format URIs are still recognized and permanently redirected, so links other servers stored keep working). The full picture, including how to move an existing single-bot deployment onto a multi-bot instance later, is in the new Instance concept document.
Thanks to @moreal, whose early work-in-progress explorations of this problem surfaced its two hardest design questions (mapping usernames to identifiers for dynamic bots, and routing object URIs that used to carry no owner information) well before this implementation settled on its final shape.
Consent-respecting quotes with FEP-044f
BotKit has supported quoting since 0.2.0, but only in the Misskey family's style: a quoteUrl property and a Link tag, sent without ever asking the quoted author. Mastodon 4.4 and 4.5 do things differently: they verify quotes through FEP-044f's consent handshake before showing them as quotes at all. Without that handshake, a BotKit bot's quotes never rendered as quotes on Mastodon, and quotes of a BotKit bot showed up as unverifiable.
BotKit now handles the FEP-044f handshake in both directions. When you quote a message, it sets the FEP-044f quote property and sends a QuoteRequest to the quoted author, alongside the Create it already sent. Publishing stays non-blocking: the post goes out immediately, and the quote is upgraded once (or if) approval arrives:
const message = await session.publish(text`This message quotes another one.`, {
quoteTarget: quoted,
});
console.log(message.quoteApprovalState); // "pending"
On the receiving side, a new quotePolicy option (on createBot(), and per message on Session.publish()) controls how your bot answers incoming quote requests: automatically for everyone ("public", the default), automatically for followers only, never ("nobody"), or held for manual review through the new Bot.onQuoteRequest event:
bot.onQuoteRequest = async (session, request) => {
if (request.state === "pending") await request.accept();
};
Bot.onQuoteAccepted, Bot.onQuoteRejected, and Bot.onQuoteRevoked cover what happens next for quotes your own bot sent, Message.quoteApproved reports whether an incoming quote carries a valid authorization stamp, and AuthorizedMessage.unauthorizeQuote() lets you revoke one you previously granted. The legacy quoteUrl and Misskey-style tags are still sent alongside the new property, so nothing about quoting on Misskey and its relatives changes. The full design is spread across #27 through #33.
A Redis repository (@fedify/botkit-redis)
BotKit has had a SQLite repository since 0.3.0 and a PostgreSQL one since 0.4.0, but neither is the natural fit for a bot that runs as several worker processes sharing one store, which is exactly the shape a Redis-backed deployment usually takes. The new @fedify/botkit-redis package fills that gap with RedisRepository, built directly on Redis strings, sets, and sorted sets rather than going through a generic key–value abstraction:
import { createBot, MemoryKvStore } from "@fedify/botkit";
import { RedisRepository } from "@fedify/botkit-redis";
const bot = createBot({
username: "mybot",
kv: new MemoryKvStore(),
repository: new RedisRepository({ url: "redis://localhost:6379/0" }),
});
Because several workers can share one Redis instance, the read-modify-write paths that matter most under concurrency (message updates, follower bookkeeping, quote authorization indexes) are protected by short-lived locks that get renewed while a slow update is still running, rather than by assuming only one process ever touches the data at a time. The package supports both a connection URL it manages itself and an existing node-redis client you inject and keep control of, and it's available for both Deno and Node.js. #12 and #35 cover the rest of it.
Smaller improvements
The npm package's TypeScript declaration files no longer accidentally include the runtime Temporal polyfill code, which had been leaking into consumers' .d.ts output. Fedify was upgraded to 2.3.1, Hono to 4.12.27, and LogTape to 2.2.3.
As always, the full list of changes is in CHANGES.md, and every API mentioned above is documented at botkit.fedify.dev. Thank you to everyone who filed issues, opened discussions, and tried BotKit out.
If you build something with BotKit, run into a rough edge, or just want to talk through an idea before opening an issue, GitHub Discussions is the place for exactly that. For something closer to real time, BotKit's chat now lives on Matrix at #fedify:matrix.org. Drop in and say hello.
matrix.to
You're invited to talk on Matrix
You're invited to talk on Matrix
中國·日本·臺灣 等의 非韓國語 話者들을 向한 質問: 如斯하게 作成된 國漢文混用體 韓國語 文章을 理解 可能한가요?
- 大體로 理解 可能하다22 (45%)
- 어느 程度 理解 可能하다23 (47%)
- 理解 不可能하다4 (8%)
@arkjun 感謝합니다…!
@kanghun2001 感謝합니다!
弔喪 다녀왔다…
@bootlegrydia 謝謝!🙏🏼
@perillamint 感謝합니다!
@haruboshi 感謝합니다…!
I didn't know that the fediverse community drawing app https://oeee.cafe had an app in the google play store, nor that my compliment to the chicken made the cut to be in a featured screenshot lol

