洪 民憙 (Hong Minhee)'s avatar

洪 民憙 (Hong Minhee)

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

한날's avatar
한날

@hannal@hackers.pub

이미지로만 보던 그 유명한 파도 그림을 보고 왔습니다. 실제로 보니 질감과 세밀함이 정말 감동스럽더라고요. 작품 교체를 하는데, 후지산이나 파도 그림은 전반기에 전시하는 것 같아요. 전반기는 11월 2일까지.

"국립 "청주" 박물관에서 전시합니나. "충주" 아니에요. 이상 충주에 가서 밥 먹고 청주에 가서 관람한 1인이었슴미다.

https://cheongju.museum.go.kr/www/speclExbiView.do?key

파도
ALT text details파도
청주 국립 박물관 청명관 입구
ALT text details청주 국립 박물관 청명관 입구
산책로
ALT text details산책로
산책로
ALT text details산책로
Jaeyeol Lee's avatar
Jaeyeol Lee

@kodingwarrior@hackers.pub

@z9mb1 @catamorphic @msy @joonnot @d01c2 @icecream_mable @minju2996 @2chanhaeng @lionhairdino @akastoot @jihyeok @linea @woaol @theeluwin @rangho @robin @1ho @nebuleto @moreal @harei106 @realfishbread @jcha0713 @hyunjoon @krepe90 @cetaceanightsky @aioo @ink_punctuation @yg1ee

오늘 Hackers' Public 행사 첫번째 모임에 와주셔서 정말 감사합니다! 정말 즐거웠습니다! 잘 들어가세요!



RE: https://hackers.pub/@kodingwarrior/0198e9db-763b-7135-aa89-1808e9e99227

Jaeyeol Lee's avatar
Jaeyeol Lee

@kodingwarrior@hackers.pub

Hackers' Public @ Seoul 1회차 모임 (1차 모집)

서울에서 열리는 Hackers' Pub 오프라인 밋업, "Hackers' Public @ Seoul"이 2025월 9월 14일(일) 처음으로 개최됩니다. 처음 열리는 밋업인 만큼, 참여하는 많은 분들이 재밌게 느낄 수 있는 소재 위주로 연사자 분들을 섭외했습니다.

  • 일시 : 9월 14일 (일) 오후 3시 ~ 오후 6시
  • 장소 : 서울특별시 성동구 상원길 26, 튜링의사과
  • 주제
    • Code As A Canvas : 코드에서 예술작품이 되기까지 (@jakeseo)
    • 폰트는 어떻게 만들어지는가 - NeoDGM 사례로 살펴보는 개발 후일담 (@dalgona)

강연이 끝나고 난 뒤에 자유롭게 네트워킹하는 시간을 가질 예정입니다. 각자 얘기하고 싶은 주제를 들고 오시면 좋습니다.

참여 신청

오프라인 밋업은 여기서 참여신청이 가능합니다. https://event-us.kr/hackerspubseoul/event/110961

  • 모집 기간
    • 1차 모집 : 8월 27일 ~ 9월 1일 (Hackers' Pub에서만 모집)
    • 2차 모집 : 9월 3일 ~ 9월 7일 (Hackers' Pub 외부에서도 공개적으로 모집)

주의사항

  • 본 행사는 Hackers' Pub에서 진행하는 오프라인 행사이며, Hackers' Pub 계정을 가지지 않은 분이 신청하셨을 경우 환불처리될 수 있습니다.
  • Hackers' Pub 외부에서 유입하시는 경우, 각 모집기간이 끝나고 24시간 안에는 Hackers' Pub에 가입이 되어 있으셔야 참여자로 확정됩니다.
洪 民憙 (Hong Minhee)'s avatar
洪 民憙 (Hong Minhee)

@hongminhee@hackers.pub

오늘은 Hackers' Public 첫 번째 모임! 다들 튜링의 사과(@TuringAppleDev)에서 오후 3시에 모여요!

Yichm's avatar
Yichm

@yichm@g0v.social

滅人器

在滅火器指示牌的「火」字,因為頂上的兩點特別暗淡,使得整字形似「人」字。於是,「滅火器」三字成了「滅人器」。
ALT text details在滅火器指示牌的「火」字,因為頂上的兩點特別暗淡,使得整字形似「人」字。於是,「滅火器」三字成了「滅人器」。
在滅火器指示牌的「火」字,因為頂上的兩點特別暗淡,使得整字形似「人」字。於是,「滅火器」三字成了「滅人器」。
ALT text details在滅火器指示牌的「火」字,因為頂上的兩點特別暗淡,使得整字形似「人」字。於是,「滅火器」三字成了「滅人器」。
洪 民憙 (Hong Minhee)'s avatar
洪 民憙 (Hong Minhee)

@hongminhee@hollo.social

By the way, if anyone wants to create an server, there's also @botkit as an option.

Evan Prodromou's avatar
Evan Prodromou

@evan@cosocial.ca · Reply to Evan Prodromou's post

The update was hard; the jsonld.js library was choking on the FEP's context document because Codeberg Pages, where FEP context documents are hosted, is unreliable.

I ended up adding a feature to the `activitystrea.ms` NodeJS library to let you pre-cache a context document, so it didn't have to go fetch it at run time. While I was under the hood, I also fixed a couple of bugs that made it hard to work with extra context documents.

The bot server is now working; I'm going to add more contexts.

Evan Prodromou's avatar
Evan Prodromou

@evan@cosocial.ca

I updated the server software to use FEP-5711, the inverse properties FEP. It is a way to declare two-way relations; if X has an `inbox` property with value Y, then Y has an `inboxOf` property with value X. It helps with navigation when you're using the ActivityPub API, and it also helps with spoofing (since both objects agree on the relationship).

w3id.org/fep/5711

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

@hongminhee@hackers.pub

완전 기대…!!



RE: https://hackers.pub/@robin/0199434c-edb7-7e5b-8213-8de18d73b8c1

robin's avatar
robin

@robin@hackers.pub

밋업때 뭔가 보여줘야 할 거 같아서 열심히 달리는중

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

@fedify@hollo.social

We've just published an experimental pre-release version 1.9.0-pr.431.1597 that adds CommonJS support to all npm packages in the Fedify ecosystem! 🧪

What's new

This experimental build addresses one of the most requested features—better compatibility with CommonJS-based Node.js applications, especially NestJS projects. The pre-release eliminates the need for Node.js's --experimental-require-module flag and resolves dual package hazard issues.

Note: While we now support CommonJS for legacy project compatibility, we still recommend using ESM or migrating to Deno for the best experience with Fedify.

Who should test this?

  • NestJS developers using Fedify who need CommonJS compatibility
  • Legacy CommonJS-based Node.js projects that had trouble integrating Fedify
  • Anyone who previously needed experimental Node.js flags to use Fedify

How to test

Install the experimental pre-release version:

npm install @fedify/fedify@1.9.0-pr.431.1597
# or for specific integrations
npm install @fedify/nestjs@1.9.0-pr.431.1597

You should now be able to use standard require() syntax without any experimental flags.

What we're looking for

  • Does CommonJS import work correctly in your legacy project?
  • Are you able to remove the --experimental-require-module flag?
  • Any issues or regressions compared to the current stable version?

Your feedback on this experimental build is invaluable for ensuring this major compatibility improvement works smoothly before the official 1.9.0 release!

Erin 💽✨'s avatar
Erin 💽✨

@erincandescent@erincandescent.net

Whoa, as of 10 days ago we have functions to go between a Uint8Array and a Base64 Normal/URL Padded/Unpadded string in JavaScript without having to go via a String of “bytes” and manually juggle the padding in every major browser.

What a time to be alive.

이찬행's avatar
이찬행

@2chanhaeng@hackers.pub

페디파이 빡시게 기여해서 2.0 뜨면 블로그 만들어서 블스 떠야지

robin's avatar
robin

@robin@hackers.pub

무슨 연합우주 스캐너 같은 게 있나...?

/api/v1/instance
/.well-known/host-meta
/status.php
/statistics.json
ALT text details/api/v1/instance /.well-known/host-meta /status.php /statistics.json
洪 民憙 (Hong Minhee)'s avatar
洪 民憙 (Hong Minhee)

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

久しぶりにブログに記事を書きました。「オープンソース開発の近況

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

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

오랜만에 블로그에 글을 썼습니다: 〈오픈 소스 開發(개발) 近況(근황)〉.

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

@hongminhee@hollo.social

I wrote a post on my blog after a long time: Recent open source development updates.

infinite love ⴳ's avatar
infinite love ⴳ

@trwnh@mastodon.social · Reply to Emelia 👸🏻's post

@thisismissem @mariusor @oranadoz @hongminhee +1, an image and a descriptor are different things and should be treated as different things. content negotiation is not a solution here -- the same information should be returned for the same resource (modulo whichever representation you ask for or receive).

infinite love ⴳ's avatar
infinite love ⴳ

@trwnh@mastodon.social · Reply to marius's post

@mariusor @hongminhee > the same URL can represent both

bad idea. an identifier should unambiguously refer to exactly 1 thing

infinite love ⴳ's avatar
infinite love ⴳ

@trwnh@mastodon.social · Reply to Evan Prodromou's post

@evan @hongminhee more and more i am thinking that Link was a bad idea from a data modeling perspective. "assume bare href instead of bare id" is something that can never make sense. if we really want to maintain validity of Link then it should *always* be embedded as an anonymous object:

icon: {
type: Image
url:
{
type: Link
href: foo
height: 400
width: 400
mediaType: image/png
}
}

here, Image.url means "representation of the Image"

:rss: Zennのトレンド's avatar
:rss: Zennのトレンド

@zenn_dev@rss-mstdn.studiofreesia.com

TypeScriptの型推論でCLIバリデーションをなくせた話
zenn.dev/hongminhee/articles/2

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

@hongminhee@hackers.pub

일본의 기술 블로깅 플랫폼인 Zenn 첫 페이지에 내가 Optique에 관해 썼던 글인 「TypeScriptの型推論でCLIバリデーションをなくせた話」(TypeScript의 타입 추론으로 CLI 유효성 검사를 필요 없게 만든 이야기)가 떴다!

일본 기술 블로깅 플랫폼 Zenn의 Tech 섹션 스크린샷. 페이지에는 여러 기술 관련 글들이 나열되어 있으며, 그 중 빨간 원으로 강조된 「TypeScriptの型推論でCLIバリデーションをなくせた話」(TypeScript의 타입 추론으로 CLI 유효성 검사를 필요 없게 만든 이야기) 제목의 글이 20개의 좋아요와 12개의 댓글을 받으며 주목받고 있다. 해당 글은 TypeScript와 CLI 파서 라이브러리인 Optique에 관한 내용을 다루고 있다.
ALT text details일본 기술 블로깅 플랫폼 Zenn의 Tech 섹션 스크린샷. 페이지에는 여러 기술 관련 글들이 나열되어 있으며, 그 중 빨간 원으로 강조된 「TypeScriptの型推論でCLIバリデーションをなくせた話」(TypeScript의 타입 추론으로 CLI 유효성 검사를 필요 없게 만든 이야기) 제목의 글이 20개의 좋아요와 12개의 댓글을 받으며 주목받고 있다. 해당 글은 TypeScript와 CLI 파서 라이브러리인 Optique에 관한 내용을 다루고 있다.
Evan Prodromou's avatar
Evan Prodromou

@evan@cosocial.ca · Reply to 洪 民憙 (Hong Minhee)'s post

@hongminhee It's a place where our loosey goosey style goes into nondeterminism. We should tighten it up in the next version. My main answer would be: publishers, don't do that.

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

@hongminhee@hollo.social

Today I discovered an interesting inconsistency in Activity Streams specs while investigating a Fedify issue.

The question: How should we interpret URLs like "icon": "https://example.com/avatar.png"?

JSON-LD context (https://www.w3.org/ns/activitystreams): @type: "@id" → “This is an IRI reference, dereference it to fetch an ActivityStreams object.”

Activity Streams Primer: “assume that a bare string is the href of a Link object, not an id” (no dereferencing)

Result: JSON-LD processor-based implementations try to parse PNG files as JSON and fail.

Turns out w3c/activitystreams#595 already discusses the same issue for href properties. I added a note that icon, image, etc. have the same problem.

Once again reminded of how tricky spec work can be…

Anuj Ahooja's avatar
Anuj Ahooja

@quillmatiq@mastodon.social · Reply to Anuj Ahooja's post

Direct link to the video: spectra.video/w/2mSF49ZFZPYJ9d

Anuj Ahooja's avatar
Anuj Ahooja

@quillmatiq@mastodon.social · Reply to Emelia 👸🏻's post

@thisismissem I mention the work you and @hongminhee are doing with @hollo in there. Really excited about it!

Anuj Ahooja's avatar
Anuj Ahooja

@quillmatiq@mastodon.social

@snarfed.org and I sat down with @deadsuperhero on Decentered!

First half is us talking about @anewsocial, and the second half is Sean letting me rave about all the exciting work being done on the open social web by @hongminhee, @cheeaun, @gabboman, @thisismissem, and so many others.

wedistribute.org/podcast/s2e5-

Evan Prodromou's avatar
Evan Prodromou

@evan@cosocial.ca

I keep forgetting Barack Obama is on the Fediverse.

threads.com/@barackobama/post/

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

@hongminhee@hollo.social

LogTape 1.1.0 is out! This release brings “fingers crossed” logging—buffer debug logs quietly, then get the full context when errors occur. Plus a new emit() API for integrating external log sources. Check it out:

https://hackers.pub/@hongminhee/2025/logtape-110

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

@hongminhee@hackers.pub

LogTape 1.1.0 is here, and it focuses on making your logging smarter and more flexible. This release introduces two major features we think you'll love.

Introducing fingers crossed logging

Tired of noisy production logs? Wish you had the full story when an error finally pops up? Our new “fingers crossed” logging pattern was built for exactly that.

With fingers crossed logging, LogTape buffers your debug and low-level logs in memory instead of immediately outputting them. When an error occurs, it flushes the entire buffer—giving you the complete sequence of events leading up to the problem. Once the error is logged, subsequent logs pass through normally until the next trigger event.

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

await configure({
  sinks: {
    console: fingersCrossed(getConsoleSink(), {
      triggerLevel: "error",  // Buffer until an error occurs
      maxBufferSize: 500,     // Keep last 500 records
    }),
  },
  loggers: [
    { category: [], sinks: ["console"], lowestLevel: "debug" },
  ],
});

It's the best of both worlds: clean logs when things are running smoothly, and rich, detailed context the moment an issue occurs. Stop choosing between too much noise and not enough information.

Category isolation for complex applications

For applications with multiple modules or services, the new category isolation feature prevents one component's errors from flushing unrelated logs:

fingersCrossed(getConsoleSink(), {
  isolateByCategory: "descendant",  // Only flush related categories
})

You can choose how categories relate to each other—flush child categories when a parent triggers, parent categories when a child triggers, or both. This surgical precision keeps your logs focused and relevant.

Direct log emission for external systems

Integrating logs from external systems just got a lot easier. With the new Logger.emit() method, you can now feed logs from Kafka, legacy applications, or any other source directly into LogTape while preserving their original timestamps and metadata.

const logger = getLogger(["my-app", "integration"]);

// Preserve the original timestamp from an external system
logger.emit({
  timestamp: kafkaMessage.originalTimestamp,
  level: "info",
  message: [kafkaMessage.content],
  rawMessage: kafkaMessage.content,
  properties: {
    source: "kafka",
    partition: kafkaMessage.partition,
    offset: kafkaMessage.offset,
  },
});

This new low-level API gives you full control over the log record, allowing you to leverage LogTape's powerful filtering, formatting, and sink ecosystem for any log source. It's particularly valuable for:

  • Migrating from other logging systems while preserving historical context
  • Aggregating logs from multiple sources with accurate timestamps
  • Building custom adapters for specialized logging scenarios

Bug fixes and improvements

Beyond the headline features, we've strengthened LogTape's reliability across the ecosystem. Check out the full changelog for complete details.

@logtape/file

  • Fixed potential data loss during high-volume logging by ensuring all buffered logs are fully written before disposal
  • Changed getStreamFileSink() to properly implement AsyncDisposable for cleaner resource management

@logtape/sentry

  • Improved cross-runtime compatibility by introducing a structural interface that avoids type conflicts
  • Fixed template metadata preservation for better Sentry breadcrumb formatting
  • Removed unnecessary Node.js dependencies for broader runtime support

@logtape/pretty

  • Added support for displaying structured data properties directly in pretty-formatted output (thanks to Matthias Feist for the contribution)

Why upgrade?

Upgrading to 1.1.0 is a no-brainer. It's fully backward-compatible and makes your setup more powerful. The fingers crossed feature alone will change how you debug in production. Imagine getting a complete stack trace with full context for every error, without the performance hit of constant verbose logging.

If you're new to LogTape, this release shows what we're all about: building tools that solve real-world problems. We don't think you should have to choose between noisy logs and insufficient context. LogTape adapts to what you need, buffering logs when things are quiet and providing rich detail when it matters most.

Getting started

Upgrade to LogTape 1.1.0:

npm update @logtape/logtape
# or
deno add jsr:@logtape/logtape@^1.1.0

The new features are opt-in, so your existing configuration continues working exactly as before. When you're ready, explore fingers crossed logging for cleaner production logs or use emit() for advanced integration scenarios.

Let us know what you think of the new features! We're always active in our GitHub discussions and would love to hear your feedback.

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

@hongminhee@hackers.pub

LogTape 1.1.0 is here, and it focuses on making your logging smarter and more flexible. This release introduces two major features we think you'll love.

Introducing fingers crossed logging

Tired of noisy production logs? Wish you had the full story when an error finally pops up? Our new “fingers crossed” logging pattern was built for exactly that.

With fingers crossed logging, LogTape buffers your debug and low-level logs in memory instead of immediately outputting them. When an error occurs, it flushes the entire buffer—giving you the complete sequence of events leading up to the problem. Once the error is logged, subsequent logs pass through normally until the next trigger event.

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

await configure({
  sinks: {
    console: fingersCrossed(getConsoleSink(), {
      triggerLevel: "error",  // Buffer until an error occurs
      maxBufferSize: 500,     // Keep last 500 records
    }),
  },
  loggers: [
    { category: [], sinks: ["console"], lowestLevel: "debug" },
  ],
});

It's the best of both worlds: clean logs when things are running smoothly, and rich, detailed context the moment an issue occurs. Stop choosing between too much noise and not enough information.

Category isolation for complex applications

For applications with multiple modules or services, the new category isolation feature prevents one component's errors from flushing unrelated logs:

fingersCrossed(getConsoleSink(), {
  isolateByCategory: "descendant",  // Only flush related categories
})

You can choose how categories relate to each other—flush child categories when a parent triggers, parent categories when a child triggers, or both. This surgical precision keeps your logs focused and relevant.

Direct log emission for external systems

Integrating logs from external systems just got a lot easier. With the new Logger.emit() method, you can now feed logs from Kafka, legacy applications, or any other source directly into LogTape while preserving their original timestamps and metadata.

const logger = getLogger(["my-app", "integration"]);

// Preserve the original timestamp from an external system
logger.emit({
  timestamp: kafkaMessage.originalTimestamp,
  level: "info",
  message: [kafkaMessage.content],
  rawMessage: kafkaMessage.content,
  properties: {
    source: "kafka",
    partition: kafkaMessage.partition,
    offset: kafkaMessage.offset,
  },
});

This new low-level API gives you full control over the log record, allowing you to leverage LogTape's powerful filtering, formatting, and sink ecosystem for any log source. It's particularly valuable for:

  • Migrating from other logging systems while preserving historical context
  • Aggregating logs from multiple sources with accurate timestamps
  • Building custom adapters for specialized logging scenarios

Bug fixes and improvements

Beyond the headline features, we've strengthened LogTape's reliability across the ecosystem. Check out the full changelog for complete details.

@logtape/file

  • Fixed potential data loss during high-volume logging by ensuring all buffered logs are fully written before disposal
  • Changed getStreamFileSink() to properly implement AsyncDisposable for cleaner resource management

@logtape/sentry

  • Improved cross-runtime compatibility by introducing a structural interface that avoids type conflicts
  • Fixed template metadata preservation for better Sentry breadcrumb formatting
  • Removed unnecessary Node.js dependencies for broader runtime support

@logtape/pretty

  • Added support for displaying structured data properties directly in pretty-formatted output (thanks to Matthias Feist for the contribution)

Why upgrade?

Upgrading to 1.1.0 is a no-brainer. It's fully backward-compatible and makes your setup more powerful. The fingers crossed feature alone will change how you debug in production. Imagine getting a complete stack trace with full context for every error, without the performance hit of constant verbose logging.

If you're new to LogTape, this release shows what we're all about: building tools that solve real-world problems. We don't think you should have to choose between noisy logs and insufficient context. LogTape adapts to what you need, buffering logs when things are quiet and providing rich detail when it matters most.

Getting started

Upgrade to LogTape 1.1.0:

npm update @logtape/logtape
# or
deno add jsr:@logtape/logtape@^1.1.0

The new features are opt-in, so your existing configuration continues working exactly as before. When you're ready, explore fingers crossed logging for cleaner production logs or use emit() for advanced integration scenarios.

Let us know what you think of the new features! We're always active in our GitHub discussions and would love to hear your feedback.

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

@hongminhee@hollo.social

TypeScriptの型推論を活用してCLIのバリデーションコードを削除できた話を書きました。「バリデーションせずパースせよ」(Parse, don't validate )の考え方をCLIパーサーに適用したOptiqueというライブラリを作った経緯について。

TypeScriptの型推論でCLIバリデーションをなくせた話

← Newer
Older →