Profile img

개발곰

@gaebalgom@hackers.pub · 24 following · 32 followers

개발곰의 해커스펍 계정 - 개발 외적인 내용은 yuri.garden과 트위터에서 찾아주세요.

프론트엔드를 기반으로 JS/TS 전반에 관심이 많습니다. 요즘에는 홈서버 구축을 어떻게 할지 관심을 두고 있습니다.

ImageGitHub
@dodok8
ImageMisskey
@gaebalgom@yuri.garden
ImageTwitter
@gaebalgom

Fedify 2.0.0 is here!

This is the biggest release in Fedify's history. Here are the highlights:

  • Modular architecture — The monolithic @fedify/fedify package has been broken up into focused, independent packages: @fedify/vocab, @fedify/vocab-runtime, @fedify/vocab-tools, @fedify/webfinger, and more. Smaller bundles, cleaner imports, and the ability to extend ActivityPub with custom vocabulary types.
  • Real-time debug dashboard — The new @fedify/debugger package gives you a live dashboard at /__debug__/ showing all your federation traffic: traces, activity details, signature verification, and correlated logs. Just wrap your Federation object and you're done.
  • ActivityPub relay support — First-class relay support via @fedify/relay and the fedify relay CLI command. Supports both Mastodon-style and LitePub-style relay protocols (FEP-ae0c).
  • Ordered message delivery — The new orderingKey option solves the “zombie post” problem where a Delete arrives before its Create. Activities sharing the same key are guaranteed to be delivered in FIFO order.
  • Permanent failure handlingsetOutboxPermanentFailureHandler() lets you react when a remote inbox returns 404 or 410, so you can clean up unreachable followers instead of retrying forever.

Other changes include content negotiation at the middleware level, @fedify/lint for shared linting rules, @fedify/create for quick project scaffolding, CLI config files, native Node.js/Bun CLI support, and many bug fixes.

This release includes significant contributions from Korea's OSSCA participants. Huge thanks to everyone involved!

This is a major release with breaking changes—please check the migration guide before upgrading.

Full release notes: https://github.com/fedify-dev/fedify/discussions/580

Fedify 2.0.0을 릴리스했습니다!

Fedify 역사상 가장 큰 릴리스입니다. 주요 변경 사항을 소개합니다:

  • 모듈형 아키텍처 — 기존의 단일 @fedify/fedify 패키지를 @fedify/vocab, @fedify/vocab-runtime, @fedify/vocab-tools, @fedify/webfinger 등 독립적인 패키지들로 분리했습니다. 번들 크기가 줄어들고, 임포트가 깔끔해지며, 커스텀 어휘 타입으로 ActivityPub을 확장할 수도 있습니다.
  • 실시간 디버그 대시보드 — 새로운 @fedify/debugger 패키지로 /__debug__/ 경로에 라이브 대시보드를 띄울 수 있습니다. 연합 트래픽의 트레이스, 액티비티 상세, 서명 검증, 로그까지 한눈에 확인할 수 있습니다. 기존 Federation 객체를 감싸기만 하면 됩니다.
  • ActivityPub 릴레이 지원@fedify/relay 패키지와 fedify relay CLI 명령어로 릴레이 서버를 바로 띄울 수 있습니다. Mastodon 방식과 LitePub 방식 모두 지원합니다(FEP-ae0c).
  • 순서 보장 메시지 전달 — 새로운 orderingKey 옵션으로 “좀비 포스트” 문제를 해결합니다. DeleteCreate보다 먼저 도착하는 문제가 더 이상 발생하지 않습니다. 같은 키를 공유하는 액티비티는 FIFO 순서가 보장됩니다.
  • 영구 전달 실패 처리setOutboxPermanentFailureHandler()로 원격 인박스가 404나 410을 반환할 때 대응할 수 있습니다. 도달 불가능한 팔로워를 정리하는 등의 처리가 가능합니다.

이 외에도 미들웨어 수준의 콘텐츠 협상, @fedify/lint, @fedify/create, CLI 설정 파일, 네이티브 Node.js/Bun CLI 지원, 다수의 버그 수정 등이 포함되어 있습니다.

이번 릴리스에는 한국 OSSCA (오픈소스 컨트리뷰션 아카데미) 참가자분들의 큰 기여가 담겨 있습니다. 참여해 주신 모든 분께 감사드립니다!

브레이킹 체인지가 포함된 메이저 릴리스입니다. 업그레이드 전에 마이그레이션 가이드를 꼭 확인해 주세요.

전체 릴리스 노트: https://github.com/fedify-dev/fedify/discussions/580

3
0
0

Why I made gaji - TypeScript DSL for GitHub Actions with auto codegen

Image

개발곰 @gaebalgom@hackers.pub

The developer of gaji introduces a tool designed to replace traditional YAML-based GitHub Actions with TypeScript. Inspired by experiences at the Toss Client DevOps Team, the author argues that YAML is fundamentally ill-suited for expressing complex behaviors and lacks necessary type checking, which leads to frequent runtime errors and slow development cycles. Unlike traditional linters that catch errors after they are written, gaji utilizes a Rust-based binary to automatically generate TypeScript types directly from action metadata, enabling real-time IDE autocomplete and compile-time validation. The post compares gaji with other tools like actionlint and existing TypeScript workflow libraries, highlighting its unique ability to support custom and internal actions through local code generation. While the tool remains bound by certain platform-level constraints of GitHub Actions, its implementation in complex CI/CD pipelines proves its efficiency in managing intricate workflows. This project offers a compelling solution for developers looking to transform fragile infrastructure configurations into robust, type-safe code.

Read more →
0

왜 gaji인가? - TS로 안전하게 GitHub Actions 작성하기

Image

개발곰 @gaebalgom@hackers.pub

GitHub Actions를 작성할 때 겪는 YAML의 구조적 한계와 타입 검사의 부재를 해결하기 위해 개발된 TypeScript(TS) 기반 도구인 gaji를 소개합니다. 저자는 Toss 인턴 과정에서 수많은 워크플로우를 다루며 느낀 불편함을 바탕으로, 데이터 표현 언어인 YAML 대신 프로그래밍 언어인 TypeScript를 사용하여 동작을 정의하고 실수를 미연에 방지하는 방식을 제안합니다. gaji는 사용자가 참조하는 모든 액션으로부터 로컬에서 즉시 타입을 생성하는 자동 코드젠(code generation) 방식을 채택하여, 커스텀 액션이나 사내 액션에서도 완벽한 자동완성과 타입 체크를 지원하는 것이 특징입니다. 기존의 린터 방식이나 중앙 집중식 타입 관리 도구와 차별화되는 이 도구는 Rust의 빠른 성능과 TypeScript의 범용성을 결합하여 복잡한 워크플로우의 가독성과 유지보수성을 극적으로 향상시킵니다. 비록 최종 산출물은 여전히 YAML이라는 플랫폼의 제약이 있지만, gaji는 개발자가 CI/CD 인프라 구축 과정에서 겪는 피로도를 줄이고 더 안전한 배포 환경을 설계하는 데 유용한 솔루션이 될 것입니다.

Read more →
5

Image개발곰 shared the below article:

Building a New Excel Library in One Week

Image

Haze @nebuleto@hackers.pub

SheetKit is a high-performance Rust-based spreadsheet library designed for Node.js to address the limitations of existing Excel processing tools. Developed over a single intensive week using an architect-led workflow with coding agents, this library leverages napi-rs to provide comprehensive support for the OOXML specification, including complex features like charts, conditional formatting, and extensive formula functions. To overcome the memory overhead and garbage collection pressure typical of JavaScript-heavy Excel libraries, the architecture utilizes a specialized raw buffer FFI protocol and lazy-loading mechanisms. These optimizations allow SheetKit to handle massive datasets with a significantly reduced memory footprint, occasionally outperforming native Rust implementations in specific write scenarios due to efficient string interning within the V8 engine. The project introduces advanced capabilities such as streaming readers for forward-only processing and copy-on-write saving to bypass unnecessary re-serialization of unchanged data parts. This development represents a significant step forward in Node.js data processing, offering a robust and scalable solution for developers managing high-volume or complex spreadsheet workflows.

Read more →
5

Image개발곰 shared the below article:

일주일만에 새로운 엑셀 라이브러리를 만들다

Image

Haze @nebuleto@hackers.pub

SheetKit은 기존 Node.js 엑셀 라이브러리들의 성능 한계와 기능 제약을 해결하기 위해 Rust로 개발된 고성능 스프레드시트 라이브러리입니다. 저자는 대량의 데이터 처리와 동적 템플릿 생성을 위해 Rust 코어 기반에 napi-rs를 활용한 Node.js 바인딩 구조를 설계했으며, 코딩 에이전트와의 긴밀한 협업을 통해 단 일주일 만에 초기 배포부터 v0.5.0 릴리스까지 달성했습니다. 특히 자바스크립트 객체 생성에 따른 가비지 컬렉션(garbage collection) 압박을 줄이기 위해 이진 버퍼(binary buffer)를 통한 데이터 전송 방식을 도입하고, 지연 로딩(lazy loading)과 스트리밍 리더 기능을 통해 대용량 파일 처리 효율을 극대화했습니다. 벤치마크 결과 기존 라이브러리 대비 압도적인 메모리 절감과 속도 향상을 보여주었으며, 특정 쓰기 시나리오에서는 V8 엔진의 최적화 덕분에 Rust 네이티브보다 빠른 성능을 기록하기도 했습니다. 현재 164개의 수식 함수와 43개의 차트 타입을 지원하며 실제 업무 현장에 성공적으로 적용 중인 SheetKit은 Node.js 환경에서 대규모 엑셀 데이터를 다루는 개발자들에게 강력하고 효율적인 솔루션을 제공합니다.

Read more →
9
0
1
0
1
4
1
2
1
0
0
0
0
1

Fresh와의 안 좋은 첫 만남: @fedify/fresh 제작기 - 1

Image

개발곰 @gaebalgom@hackers.pub

Deno 팀에서 개발하는 Fresh 프레임워크를 Fedify 프로젝트에 통합하는 과정에서 겪은 문제점을 공유합니다. Fresh 2.X 버전으로 업데이트되면서 기존 코드와의 호환성 문제가 발생했고, Fedify 패키지 구조 변경으로 인해 Fresh 통합을 위한 별도 패키지를 만들어야 했습니다. 개발 환경 설정 중 `node_modules` 관련 오류와 Preact 렌더링 문제가 발생했으며, Fedify 미들웨어 적용 시 Vite의 SSR Module Runner가 CJS를 지원하지 않아 서버 실행에 실패했습니다. Vite 설정에서 외부 의존성을 지정하여 개발 서버 문제를 해결했지만, 빌드 후 실행 시 CJS 관련 문제가 다시 발생하여 Rollup 옵션을 조정해야 했습니다. 이 글은 Fresh와 Fedify를 통합하려는 개발자들이 겪을 수 있는 어려움을 해결하는 데 도움이 될 것입니다.

Read more →
4

Image개발곰 shared the below article:

브라우저 스터디 기록 (1)

Image

Jaeyeol Lee @kodingwarrior@hackers.pub

이 글은 Web Browser Engineering 교재를 독학하며 연습문제를 풀이하는 과정을 담고 있습니다. 저자는 추상화 수준에 대한 고민을 드러내며, URL 클래스의 request 메서드 대신 Connection 클래스를 도입하여 소켓 관리를 더 자연스럽게 처리했습니다. 또한, 타입 힌트 적용과 pytest를 이용한 유닛 테스트 환경 구축 등 실습 환경을 풍성하게 구성하는 데 LLM의 도움을 받아 효율성을 높였습니다. 연습문제 풀이에서는 keep-alive 지원의 중요성을 강조하며, TCP handshake 비용 절감 여부를 직접 실험해볼 것을 권장합니다. 리다이렉션 문제에서는 Location 헤더의 다양한 케이스 처리와 최대 리다이렉션 횟수 제한을 고려해야 함을 지적합니다. 캐싱 문제에서는 Cache-Control 헤더의 다양한 옵션에 대한 처리 방법을 제시하고, 압축 문제에서는 Transfer-Encoding: chunked 헤더 처리의 중요성을 강조합니다. 전반적으로 이 글은 단순한 문제 풀이를 넘어, 브라우저 엔진의 동작 원리를 깊이 이해하고 실제 코드에 적용하는 과정을 보여줍니다. 독자들은 이 글을 통해 연습문제 풀이에 대한 힌트를 얻을 뿐만 아니라, 브라우저 개발에 대한 실질적인 인사이트를 얻을 수 있을 것입니다.

Read more →
7
1

We're excited to announce that has been awarded a service agreement by the Image@sovtechfundSovereign Tech Agency! The Sovereign Tech Fund is investing €192,000 in Fedify's development over 2025–2026 to strengthen the fediverse ecosystem.

This investment will enable us to significantly expand Fedify's capabilities and make it easier for developers to build federated applications. The commissioned work focuses on improving developer experience, adding comprehensive debugging tools, and ensuring Fedify remains at the forefront of innovation.

Here are the key milestones we'll be delivering:

  • Web framework integrations: Official adapters for Next.js, Elysia, Fastify, and Koa, making it seamless to add federation to existing applications

  • ActivityPub debug & development tools: Real-time debug dashboard with WebSocket monitoring, federation lifecycle hooks, and implementation checklist CLI to make federation interactions transparent and debuggable

  • Storage & infrastructure enhancements: SQLiteKvStore for robust file-based storage across Node.js, Deno, and Bun, plus performance optimizations for production deployments

  • Comprehensive documentation & examples: Specialized tutorials for building federated blogs, social networks, and content platforms, with complete working examples and migration guides

  • Observability & monitoring: Full OpenTelemetry metrics, performance benchmarking tools, and federation health dashboards for production environments

  • Advanced features & standards: FEP-ef61 (Portable Objects) support and implementation of emerging Fediverse Enhancement Proposals to keep Fedify at the cutting edge

All developments will be open source and available for the entire community to use, contribute to, and build upon.

https://www.sovereign.tech/tech/fedify

7
13
3
0
6
0
1
1
2

The monorepo has grown to 16 packages!

We've been working hard to make Fedify more modular and easier to integrate with your favorite tools and platforms. From the core framework to database drivers, from CLI tools to web framework integrations—we've got you covered.

Our packages now include:

  • Core framework and CLI tools
  • Web framework integrations: Express, Hono, H3, Elysia, NestJS, Next.js, SvelteKit
  • Database drivers: PostgreSQL, Redis, SQLite, AMQP/RabbitMQ
  • Platform integrations: Cloudflare Workers, Deno KV
  • Testing utilities

Each package is available on JSR and/or npm, making it easy to pick exactly what you need for your ActivityPub implementation.

What integration would you like to see next? Let us know!

A table showing 16 Fedify packages with three columns: Package name, registry availability (JSR and npm links), and Description. The packages include the core @fedify/fedify framework, CLI toolchain, database drivers (PostgreSQL, Redis, SQLite, AMQP/RabbitMQ), web framework integrations (Express, Hono, H3, Elysia, NestJS, Next.js, SvelteKit, Cloudflare Workers), Deno KV integration, and testing utilities. Most packages are available on both JSR and npm registries, with some exceptions like @fedify/denokv (JSR only) and @fedify/elysia, @fedify/nestjs, @fedify/next (npm only).
1
0
1

We're excited to announce the release of BotKit 0.3.0! This release marks a significant milestone as now supports .js alongside , making it accessible to a wider audience. The minimum required Node.js version is 22.0.0. This dual-runtime support means you can now choose your preferred runtime while building with the same powerful BotKit APIs.

One of the most requested features has landed: poll support! You can now create interactive polls in your messages, allowing followers to vote on questions with single or multiple-choice options. Polls are represented as ActivityPub Question objects with proper expiration times, and your bot can react to votes through the new onVote event handler. This feature enhances engagement possibilities and brings BotKit to feature parity with major platforms like Mastodon and Misskey.

// Create a poll with multiple choices
await session.publish(text`What's your favorite programming language?`, {
  class: Question,
  poll: {
    multiple: true,  // Allow multiple selections
    options: ["JavaScript", "TypeScript", "Python", "Rust"],
    endTime: Temporal.Now.instant().add({ hours: 24 }),
  },
});

// Handle votes
bot.onVote = async (session, vote) => {
  console.log(`${vote.actor} voted for "${vote.option}"`);
};

The web frontend has been enhanced with a new followers page, thanks to the contribution from Hyeonseo Kim (Image@gaebalgom개발곰)! The /followers route now displays a paginated list of your bot's followers, and the follower count on the main profile page is now clickable, providing better visibility into your bot's audience. This improvement makes the web interface more complete and user-friendly.

For developers looking for alternative storage backends, we've introduced the SqliteRepository through the new @fedify/botkit-sqlite package. This provides a production-ready SQLite-based storage solution with ACID compliance, write-ahead logging (WAL) for optimal performance, and proper indexing. Additionally, the new @fedify/botkit/repository module offers MemoryCachedRepository for adding an in-memory cache layer on top of any repository implementation, improving read performance for frequently accessed data.

This release also includes an important security update: we've upgraded to 1.8.8, ensuring your bots stay secure and compatible with the latest ActivityPub standards. The repository pattern has been expanded with new interfaces and types like RepositoryGetMessagesOptions, RepositoryGetFollowersOptions, and proper support for polls storage through the KvStoreRepositoryPrefixes.polls option, providing more flexibility for custom implementations.

2
0
0

systemd와 bash를 이용해서 재부팅 시 현재 저장소가 최신이면 빌드를 생략하고 아니면 빌드를 하도록 한 다음 실행되도록 스크립트를 짰습니다. 나름 배포 파이프 라인을 구성해본건데 이게 베스트 프랙티스인지는 확신이 안서네요.

사실 작성은 claude가 거의 다 했죠. 특히 systemd 설정은요. https://claude.ai/share/124ada60-168e-4c01-ad64-74bc67de6e54

3
0
0
1
3

단문(Note)과 긴 게시글(Article) 모두에서 Markdown을 지원할 뿐만 아니라 구문강조와 TeX 수식을 지원한다는 점에서 Hackers' Pub은 연합우주에서 가장 소프트웨어 프로그래머가 쓰기에 적합한 플랫폼이라고 자부합니다.

5

홈서버 곧 도착하면 어떤 서비스를 올려볼지 고민이네요 혹시 추천해 주실만한 서비스 있으신가요? 일단 아래는 생각 중인 목록입니다.

2