洪 民憙 (Hong Minhee)'s avatar

洪 民憙 (Hong Minhee)

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

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

@hongminhee@hackers.pub


What is LogTape?

LogTape is a logging library designed specifically for the modern JavaScript ecosystem. It stands out with its zero-dependency architecture, universal runtime support across Node.js, Deno, Bun, browsers, and edge functions, and a library-first design philosophy that allows library authors to add logging without imposing any burden on their users. When LogTape isn't configured, logging calls have virtually no performance impact, making it the only truly unobtrusive logging solution available.

For a comprehensive overview of LogTape's capabilities and philosophy, see our introduction guide.

Milestone achievement

We're excited to announce LogTape 1.0.0, marking a significant milestone in the library's development. This release represents our commitment to API stability and long-term support. The 1.0.0 designation signals that LogTape's core APIs are now stable and ready for production use, with any future breaking changes following semantic versioning principles.

This milestone builds upon months of refinement, community feedback, and real-world usage, establishing LogTape as a mature and reliable logging solution for JavaScript applications and libraries.

Major new features

High-performance logging infrastructure

LogTape 1.0.0 introduces several performance-oriented features designed for high-throughput production environments. The new non-blocking sink option allows console, stream, and file sinks to buffer log records and flush them asynchronously, preventing logging operations from blocking your application's main thread.

import { configure, getConsoleSink } from "@logtape/logtape";

await configure({
  sinks: {
    console: getConsoleSink({ 
      nonBlocking: {
        bufferSize: 1000,
        flushInterval: 50
      }
    })
  },
  // ...
});

The new fromAsyncSink() function provides a clean way to integrate asynchronous logging operations while maintaining LogTape's synchronous sink interface. This enables scenarios like sending logs to remote servers or databases without blocking your application.

import { fromAsyncSink } from "@logtape/logtape";

const webhookSink = fromAsyncSink(async (record) => {
  await fetch("https://logs.example.com", {
    method: "POST",
    body: JSON.stringify(record)
  });
});

For file operations specifically, the new getStreamFileSink() function in the @logtape/file package leverages Node.js PassThrough streams to deliver optimal I/O performance with automatic backpressure management.

New sink integrations

This release significantly expands LogTape's integration capabilities with two major new sink packages. The @logtape/cloudwatch-logs package enables direct integration with AWS CloudWatch Logs, featuring intelligent batching, exponential backoff retry strategies, and support for structured logging through JSON Lines formatting.

import { getCloudWatchLogsSink } from "@logtape/cloudwatch-logs";

const sink = getCloudWatchLogsSink({
  logGroupName: "/aws/lambda/my-function",
  logStreamName: "my-stream",
  region: "us-east-1"
});

The @logtape/windows-eventlog package brings native Windows Event Log support with cross-runtime compatibility across Deno, Node.js, and Bun. This integration uses runtime-optimized FFI implementations for maximum performance while maintaining proper error handling and resource cleanup.

Beautiful development experience

The new @logtape/pretty package transforms console logging into a visually appealing experience designed specifically for local development. Inspired by Signale, it features colorful emojis for each log level, smart category truncation that preserves important context, and perfect column alignment that makes logs easy to scan.

LogTape pretty formatter output showing colorful console logs with emojis and perfect alignment

import { configure, getConsoleSink } from "@logtape/logtape";
import { prettyFormatter } from "@logtape/pretty";

await configure({
  sinks: {
    console: getConsoleSink({ formatter: prettyFormatter })
  },
  // ...
});

As shown above, the pretty formatter supports true color terminals with rich color schemes, configurable icons, and intelligent word wrapping that maintains visual consistency even for long messages.

Ecosystem integration

Perhaps most significantly, LogTape 1.0.0 introduces adapter packages that bridge the gap between LogTape's library-friendly design and existing logging infrastructure. The @logtape/adaptor-winston and @logtape/adaptor-pino packages allow applications using these established logging libraries to seamlessly integrate LogTape-enabled libraries without changing their existing setup.

// Quick setup with winston
import "@logtape/adaptor-winston/install";
// Or with custom configuration
import { install } from "@logtape/adaptor-winston";
import winston from "winston";

const logger = winston.createLogger({/* your config */});
install(logger);

These adapters preserve LogTape's structured logging capabilities while routing everything through your preferred logging system, making adoption of LogTape-enabled libraries frictionless for existing applications.

Developer experience enhancements

This release includes several quality-of-life improvements for developers working with LogTape. The new getLogLevels() function provides programmatic access to all available log levels, while the LogMethod type offers better type inference for logging methods.

Browser compatibility has been improved, particularly for the @logtape/otel package, which previously had issues in browser environments due to Node.js-specific imports. The package now works seamlessly across all JavaScript runtimes without throwing module resolution errors.

Breaking changes and migration guide

LogTape 1.0.0 includes one notable breaking change: the removal of the deprecated LoggerConfig.level property. This property was deprecated in version 0.8.0 in favor of the more descriptive LoggerConfig.lowestLevel property.

If your configuration still uses the old property, simply rename it:

// Before (deprecated)
{ category: ["app"], level: "info", sinks: ["console"] }
// After
{ category: ["app"], lowestLevel: "info", sinks: ["console"] }

For more complex filtering requirements, consider using the LoggerConfig.filters option instead, which provides more flexibility and supports inheritance from parent loggers.

Complete package ecosystem

LogTape 1.0.0 represents the culmination of a comprehensive package ecosystem, now consisting of 11 specialized packages that address different aspects of logging infrastructure. This modular approach allows you to install only the packages you need, keeping your dependency footprint minimal while accessing powerful logging capabilities when required.

Package JSR npm Description
@logtape/logtape JSR npm Core logging functionality
@logtape/adaptor-pino JSR npm Pino adapter
@logtape/adaptor-winston JSR npm winston adapter
@logtape/cloudwatch-logs JSR npm AWS CloudWatch Logs sink
@logtape/file JSR npm File sinks
@logtape/otel JSR npm OpenTelemetry sink
@logtape/pretty JSR npm Beautiful text formatter
@logtape/redaction JSR npm Data redaction
@logtape/sentry JSR npm Sentry sink
@logtape/syslog JSR npm Syslog sink
@logtape/windows-eventlog JSR npm Windows Event Log sink

Getting started

Whether you're new to LogTape or upgrading from a previous version, getting started with 1.0.0 is straightforward. For new projects, begin with a simple configuration and gradually add the packages and features you need:

import { configure, getConsoleSink } from "@logtape/logtape";

await configure({
  sinks: { console: getConsoleSink() },
  loggers: [
    { category: "my-app", lowestLevel: "info", sinks: ["console"] }
  ]
});

Existing applications using winston or Pino can immediately benefit from LogTape-enabled libraries by installing the appropriate adapter. For comprehensive migration guidance and detailed feature documentation, visit our documentation site.

The 1.0.0 release represents not just a version number, but a commitment to the stability and maturity that production applications require. We're excited to see what you'll build with LogTape.

유루메 Yurume's avatar
유루메 Yurume

@yurume@hackers.pub

번아웃으로 아직 고생하는 가운데, 갑자기 삘이 와서 지난 1주간 170쪽짜리 소설을 Gemini로 써 버렸다. 소재가 너무 잔혹해서 (R-18G 수준) 그대로 공개하기에는 꺼려진다는 문제가 있을 뿐; 줄거리 자체는 내가 예상한 것 이상으로 잘 나왔는데 퇴고를 열심히 해서 그런 것 같다. 구체적으로 어떻게 된 거냐 하면,

  1. Gemini 2.5 Flash로 짧은 초안 작성 (1판)
  2. 이 초안의 중간 즈음에서 두 개의 새 줄거리를 만들어서 전체 줄거리 수가 3개가 됨
  3. 이대로는 안되겠다 싶어서 Flash의 제안을 일부 받아 들여 줄거리를 하나로 재조정 (2판)
  4. 이 시점에서 Gemini 2.5 Pro한테 평가를 부탁하고, 평가 내용을 다시 Flash에게 되먹여서 액션 아이템을 만들어 퇴고를 반복 (3~7판)
  5. 이 참에 번역도 맡겨야지 싶어서 Flash한테 먼저 초벌 번역을 시킴 (번역 1판)
  6. 초벌 번역을 Pro한테 주고 고쳐야 하는 부분을 그 이유와 함께 나열하게 함
  7. Flash한테 수정된 번역과 수정한 이유들을 주고 판단하게 시킨 다음 최종 번역본을 완성 (번역 2판)
  8. 마지막으로 Pro한테 전체 번역문을 주고 전체 번역 안에서의 일관성이 깨진 게 있는지 확인

이랬는데, 가장 곤란했던 건 역시 4였다. 왜냐하면 내용이 너무 길어서 텍스트 창에는 한 번에 안 들어가고(...), 잘라서 넣으면 이제 뭔 짓을 해도 앞부분을 까먹어 버렸기 때문이다. 최종적으로 동작한 방법은 소설을 최대 32KB 크기가 되도록 쪼갠 뒤 파일로 나눠어 업로드하고, 업로드가 끝난 뒤에 몇장까지 있는지 확인하고 뒤가 잘린 문장이 있는지 확인해서 뭔가 문제가 있으면 평가를 하지 않고 멈추라고 지시한 것. 혹시 이런 일 해야 하는 분은 참고하시길.

...뭐 이렇게 말하긴 했는데 사실 Flash한테 글 쓰기는 다 맡겼지만 세부적으로는 상당히 손을 많이 거쳤다. 한국어나 영어 번역이나 둘 다 그랬음. 나름 노력한 것도 있고 이 전체 내용을 다시 Flash한테 되먹였더니 찬사 일색(!!!!!)이라 진짠가 싶어서 어디 올려야 할 것 같긴 한데 소재가 소재다 보니 공개도 간단하지 않다는 게 곤란하다. 호옥시 관심 있으신 분께서는 메일로 pdf 파일을 보내 드리겠습니다.

소설 "싱크로니시티"의 한국어판 목차. 이하 다음과 같은 내용임:

싱크로니시티 Synchronicity
2025-06-22T00Z (7.4판), Gemini 2.5 Flash를 이용해 작성됨

프롤로그 - 2
1: 마리오네트 Marionette - 3
2: 태동 Genesis - 7
3: 틀 Frame - 13
4: 수치 Shame - 23
5: 목격 Witness - 37
6: 고난 Ordeal - 50
7: 울림 Resound - 65
8: 결점 Flaw - 73
9: 촉매 Catalyst - 82
10: 개조 Augment - 90
11: 의식 Ritual - 102
12: 쇼 Show - 108
13: 갈채 Acclaim - 117
14: 욕구 Desire - 130
15: 목도 Encounter - 141
16: 이미지 Image - 147
17: 진화 Evolution - 158
에필로그 - 163
'작가'의 변 - 164
작가의 변 - 166
'서평' - 170
ALT text details소설 "싱크로니시티"의 한국어판 목차. 이하 다음과 같은 내용임: 싱크로니시티 Synchronicity 2025-06-22T00Z (7.4판), Gemini 2.5 Flash를 이용해 작성됨 프롤로그 - 2 1: 마리오네트 Marionette - 3 2: 태동 Genesis - 7 3: 틀 Frame - 13 4: 수치 Shame - 23 5: 목격 Witness - 37 6: 고난 Ordeal - 50 7: 울림 Resound - 65 8: 결점 Flaw - 73 9: 촉매 Catalyst - 82 10: 개조 Augment - 90 11: 의식 Ritual - 102 12: 쇼 Show - 108 13: 갈채 Acclaim - 117 14: 욕구 Desire - 130 15: 목도 Encounter - 141 16: 이미지 Image - 147 17: 진화 Evolution - 158 에필로그 - 163 '작가'의 변 - 164 작가의 변 - 166 '서평' - 170
Maddy's avatar
Maddy

@maddyunderstars@aus.social

Hi all,

For the past year I've been working on an activitypub federated instant messenger called Shoot.
I haven't had time to work on it for a while because of my job, so I'm making it public to see if anyone would be interested in helping out.

You can find the server repo here: github.com/MaddyUnderStars/sho
and the client repo here: github.com/MaddyUnderStars/sho

Featureset currently includes:
- Dm channels
- Friends/relationships
- Guilds
- Guild channels
- Guild invites
- Voice calls (not yet federated)
- Mostly working federation with itself
- Iffy federation with other platforms

There's no official instance yet, but I could host one if there is interest.

What I need help with most is:
- Frontend development. The client code is very hacky and gross, let alone the UI haha
- Safety features
- Probably general architecture stuff

Thanks all

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

@hongminhee@hollo.social · Reply to 雪あすか🔞's post

@askyq いいえいいえ、お疲れ様でした!🙏🏼

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

@hongminhee@hackers.pub

2025 오픈소스 컨트리뷰션 아카데미 참여형 멘티 모집이 이번주 일요일까지입니다! Fedify 프로젝트에도 많이 지원해 주세요!

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

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

@zundan なるほど!教えていただきありがとうございます!

zunda's avatar
zunda

@zundan@mastodon.zunda.ninja · Reply to 洪 民憙 (Hong Minhee)'s post

@hongminhee メンテナンス中のようです

> DBバックアップ中なので、これ終わったらメンテ始めます
> 9時からちょっとずれます
https://kmy.blue/@askyq/114718416579105704

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

@hongminhee@hollo.social · Reply to のえる's post

@noellabo なるほど!教えていただきありがとうございます!

のえる's avatar
のえる

@noellabo@fedibird.com · Reply to 洪 民憙 (Hong Minhee)'s post

メンテ予告でてましたね

🦊's avatar
🦊

@root@k.lapy.link

진짜네요

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

@hongminhee@hollo.social

今kmy.blueにアクセスできないみたい。502エラーが出てる。

甘瀬ここあ's avatar
甘瀬ここあ

@cocoa@hackers.pub

今日の進捗

apsigが作成したSignature-Inputのパースに成功 (Fedify)
ALT text detailsapsigが作成したSignature-Inputのパースに成功 (Fedify)
洪 民憙 (Hong Minhee)'s avatar
洪 民憙 (Hong Minhee)

@hongminhee@hackers.pub

LogTape 다음 버전부터는 널리 쓰이는 로깅 라이브러리인 Pino와 winston에 대한 어댑터를 함께 제공할 예정입니다.

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

@hongminhee@hollo.social

The next release of will include adapters for popular logging libraries Pino and winston.

Fedify: an ActivityPub server framework's avatar
Fedify: an ActivityPub server framework

@fedify@hollo.social

Fedify 1.6.2 has been released as a hotfix to address compatibility issues with certain Mastodon servers.

This release resolves interoperability problems with Mastodon instances running bleeding-edge versions that include RFC 9421 HTTP Message Signatures support. These versions contain a bug that causes 500 Internal Server Error responses when receiving RFC 9421 signatures, affecting communication with several major servers including mastodon.social.

The fix extends Fedify's double-knocking mechanism to retry requests with draft-cavage-http-signatures-12 when receiving 5xx error responses, in addition to the existing 4xx error handling. This ensures continued federation compatibility while Mastodon addresses the underlying issue in their implementation.

This is a temporary workaround that will be reverted in a future release once Mastodon fixes their RFC 9421 implementation and affected servers are updated. The change maintains backward compatibility and does not affect the behavior with servers that properly handle RFC 9421 signatures.

Users are encouraged to update to 1.6.2 to ensure reliable federation with affected Mastodon servers.

Chee Aun 🤔's avatar
Chee Aun 🤔

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

@hongminhee honestly imo, the support for multiple runtimes is reason enough to use it 👍

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

@hongminhee@hackers.pub

LogTape을 다른 로깅 라이브러리들과 비교하는 문서를 작성해 보았습니다!

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

@hongminhee@hollo.social

I've written a document comparing LogTape with other logging libraries!

MoonBit's avatar
MoonBit

@moonbitlang@mastodon.social

🚀MoonBit Beta is here!
After 2 years of fast iteration, MoonBit enters its stable phase with regard to language syntax!
✨Built-in async
🛠 Fast tooling and IDE-aware error handling

Read more:
moonbitlang.com/blog/beta-rele

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

@hongminhee@hackers.pub · Reply to しろまだら's post

@shiromadara 少し古典的かもしれませんが、『達人プログラマー』(The Pragmatic Programmer)はいかがでしょうか。個人的には学生時代に読んで大きな影響を受けた本です。

しろまだら's avatar
しろまだら

@shiromadara@hackers.pub

開発チーム向けに書籍を買おうかと思うのですが、なにかおすすめありますか?
若手エンジニアの頃にこの本に出逢えてたらなぁ…という本とか。
あとは特に関係なく、ご自身が好きな本があれば知りたいです👀
的な…
これを書きながら「このSF小説にグッと来てエンジニアになったんだ!」とか、そんな話も聞いてみたいかも、と思った🦕

今期からスクラム開発を本格的に実践することになり、まずは自分とエンジニア向けにエッセンシャルスクラムを買うことにしました。
あとは新規事業開発部門ということもあり、エンジニアも知っておいて損はなさそうな本(私がコンサル時代に使ってた本)として、超速フレームワーク考える技術・書く技術は買う予定。

youknowone's avatar
youknowone

@youknowone@hackers.pub · Reply to 洪 民憙 (Hong Minhee)'s post

@hongminhee hackers.pub 을 구동시키는 Fedify 프로젝트라고 광고하셔야죠 ㅋㅋ

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

@hongminhee@hollo.social · Reply to 주영택's post

@soomtong表記(표기)<ruby> 태그利用(이용)한 것입니다. 제가 쓴 건 Hackers' Pub이 아니라 Hollo라는 ActivityPub 프로토콜 具顯(구현) 소프트웨어인데, Hollo에서는 國漢文混用體(국한문 혼용체)에 한글 讀音(독음)을 달아주는 機能(기능)이 있어서 自動(자동)으로 붙게 됩니다. Hackers’ Pub에서는 手動(수동)으로 <ruby> 태그를 쓰셔야 할 것 같네요. 😅

Encyclia's avatar
Encyclia

@encyclia@fietkau.social

Encyclia was shown as a speed demo at @fediforum on June 7. 🙂 You can find the 5 minute video on Peertube: spectra.video/w/tSjP7WnV3pBakD or on YouTube: youtube.com/watch?v=8QipWHAaUE

In case you've been waiting: the project hasn't been forgotten, @julian is just having a busy few months at the day job since April now. 😓 We'll probably be making more progress again later in the summer!

:dog: 즈미나 (다이어트 중: 6.19 - 12.XX)'s avatar
:dog: 즈미나 (다이어트 중: 6.19 - 12.XX)

@Yozumina@serafuku.moe

나도 해커스펍 계정을 만들어야 되나?

헤카's avatar
헤카

@heka@baram.me

오 티머니애플페이 instagram.com/p/DK8NdbmvhWf/

もちもちずきん :teto_zuho: 🍆's avatar
もちもちずきん :teto_zuho: 🍆

@Yohei_Zuho@mstdn.y-zu.org

Fedify本の売上80冊超えた

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

@hongminhee@hollo.social · Reply to 檀馨 (단형/ダンキヨウ)'s post

@nesroch 오, 「用途廢棄(용도폐기)」도 좋은 것 같아요!

檀馨 (단형/ダンキヨウ)'s avatar
檀馨 (단형/ダンキヨウ)

@nesroch@mastodon.online · Reply to 洪 民憙 (Hong Minhee)'s post

@hongminhee 원단어의 뜻은 「도태(淘汰)」에 가까운데, 여러가지 이유로 별로 적당하지 않다고 생각된다면 「용도폐기(用途癈棄)」 정도가 어떨까 싶네요.

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

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

@ranolp 네, 저도 여러 代案(대안)을 생각해 봤는데, 말씀하신 「除去(제거) 豫定(예정)」이 가장 直接的(직접적)으로 와닿긴 하네요.

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

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

日本語(일본어)에서는 「非推奬(비추장)」이라는 말을 쓴다는데, 韓國語(한국어)에서는 「推奬(추장)」이라는 말을 잘 쓰지 않으니 「非推薦(비추천)乃至(내지)는 「非奬勵(비장려)程度(정도)가 되려나? 듣고 보니 「止揚(지양)」 같은 말로 翻譯(번역)해도 좋을 것 같기도…?

← Newer
Older →