pkg update's avatar

pkg update

@pkgupdt@hl.pkgu.net · 96 following · 80 followers

A hobbyist photographer, football fan and ex software engineer.

This account is for my personal records. I mostly post in Korean, but I can communicate in English and Japanese.

I use tags for my photo posts.

BlueskyBlog/Profile

@pkgu.net

https://pkgu.net

pkg update's avatar
pkg update

@pkgupdt@hl.pkgu.net · Reply to 맹꽁이's post

@sunwoo1524 구글 제미니도 한번 써보세요. 번역은 챗gpt보다 좀더 잘하는 느낌이 들었습니다.

pkg update's avatar
pkg update

@pkgupdt@hl.pkgu.net

펜 달린 태블릿 산 김에 드로잉 앱 깔아서 이거저거 해보는데, 생각보다 재밌군... + 역시 난 두꺼운 연필 좋아하네. ㅋㅋ

pkg update's avatar
pkg update

@pkgupdt@hl.pkgu.net

영어로 대한민국 이름 찾을 때 난감하긴 함.

Korea / South Korea / Republic of Korea / Korea, Republic of / Korea (South) 까지가 일반적?인 표기들.

그리고...

Daehanminguk 은 도대체가 이해가 안 가지만 실제로 있었습니다. ㅋㅋㅋ

pkg update's avatar
pkg update

@pkgupdt@hl.pkgu.net · Reply to 洪 民憙 (Hong Minhee)'s post

@hongminhee 확실히 기본 램이 늘어난 게 도움이 되겠네요. 😊 C 계열 제외하면 개발환경도 나쁘지 않고, 생각날 때가 점점 많아지고 있습니다.;

pkg update's avatar
pkg update

@pkgupdt@hl.pkgu.net · Reply to 오늘라듐드셨나요? :pointless_verified:'s post

@Native 기본형 모델이 참 괜찮죠. M1 깡통 쓰다가 램하고 내장 스토리지 때문에 넘어왔는데 AMD APU가 cpu 성능은 동급이어도 gpu/npu에서 한계가 뚜렷하네요. 😓

pkg update's avatar
pkg update

@pkgupdt@hl.pkgu.net

알리발 AMD APU 미니 PC 싼 맛에 쓰고 있는데, 이거저거 좀 해보려니 결국은 할인 들어간 맥미니 M4라 생각나긴 하네... 리눅스는 그냥 OCI 인스턴스에서 굴리고 넘어가야 하나.;

pkg update's avatar
pkg update

@pkgupdt@hl.pkgu.net

RP> 담임 샘이 은둔 고수였다, 라니 ㅋㅋㅋ

드라코's avatar
드라코

@draco@pointless.chat

ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ웃기네.

게임이 십수년이상 고이면 나이먹은 은둔고수들이 많으니 저렇게 되는구나.

pkg update's avatar
pkg update

@pkgupdt@hl.pkgu.net

벌써 11년이 흘렀습니다. 세월호 희생자분들의 명복을 빕니다. 유족분들의 아픔이 조금이나마 덜어지는 세상이 되도록 함께 하겠습니다.

pkg update's avatar
pkg update

@pkgupdt@hl.pkgu.net

요즘엔 바뀌고 있는데, 해외 스포츠에서 영어 해설 중계를 원어 중계로 표시하는 경우가 많음. EPL이야 영어가 현지 언어이긴 한데, 라 리가나 세리에와 영어가 무슨 관계가 있는 거야... ㅋㅋㅋ + 해설은 중계방송국의 언어로 직접 하는 거니 원어라는 표현 자체도 잘못되었음. 국내 해설진은 번역진이 아님. 현지 중계라면 또 모르겠지만 의미가 다르고.

pkg update's avatar
pkg update

@pkgupdt@hl.pkgu.net · Reply to pkg update's post

나트륨을 소듐으로 부르자는 식의 이름 변경도 웃기는 이야기임. 영어 문서 읽는 사람들 편하자고 언중의 말을 바꾸라는 억지인데, 특권-사대 의식에 쩔어있는 발상임.

pkg update's avatar
pkg update

@pkgupdt@hl.pkgu.net

東京, 上海를 동경, 상해로 읽어서는 안 된다고 생각했었는데, 요즘엔 영어권 사람들이 emoji, nikon을 이모지, 나이컨으로 읽는 거 보고 거 아무려면 어떠냐, 편한대로 쓰자, 어차피 다들 그러더라, 고 입장이 바뀌었음.

원어 표기? 에스파냐 왕국을 스페인으로 부르는 게 원어에 가까운 표기인가? ㅋㅋ

geeknews_bot's avatar
geeknews_bot

@geeknews_bot@sns.lemondouble.com

OpenAI, GPT 4.1 공개
------------------------------
- GPT-4.1, GPT-4.1 mini, GPT-4.1 nano 3개의 모델 공개
- GPT-4o 대비 전반적으로 개선된 성능을 제공하며, 특히 *코딩, 지시 따르기, 긴 문맥 이해* 에서 두드러지는 성능 향상
- 세모델 모두 최대 *100만 토큰의 컨텍스트 윈도우* 을 지원하여 대형 코드베이스 및 복잡한 문서 분석에 적합함
-
지연 시간…
------------------------------
https://news.hada.io/topic?id=20334&utm_source=googlechat&utm_medium=bot&utm_campaign=1834

ももんがちゃん's avatar
ももんがちゃん

@momongachan@fedibird.com

陽気な大阪のおじいちゃん(80)が手荷物検査で「爆弾入っとんねんガハハ」とボケて200人が避難を余儀なくされた大阪関西万博初日

sankei.com/article/20250415-6B

pkg update's avatar
pkg update

@pkgupdt@hl.pkgu.net · Reply to 125에 본진테러 막는거면 개이득 아니냐's post

@enbay 현 단계에서는 그 정도인 거 같습니다. C++은 학습 데이터가 부족한지 품질이 확 떨어지더라고요.

pkg update's avatar
pkg update

@pkgupdt@hl.pkgu.net

LLM한테 코딩을 시켜본 소감은, C++은 컴파일 가능한 코드 뽑기 단계에서 내가 포기했고, Python은 인간이 손수? 수정 좀 하면 돌아가는 수준이었고, 더 단순한? 스트립트 언어들은 안 되잖아!라고 몇 번 갈구면 꽤 쓸만하게 나왔음. 언어 자체의 복잡성 + 예제의 풍부함이 주요 원인으로 생각됨.

다만, 영어로 (Input, Output) 명세를 명확하게 지정해 줘야 함. 무얼 받아서 무얼 내놓아야 하는지, 프롬프트를 슈도 코드 수준으로 자세하진 않더라도 명세서 수준으로는 정확하게 줘야 함. 아직 LLM은 추론하는 게 아니라 Transform하는 도구임.

즉 뭘 만들지 그 본체?는 사람이 "잘" 지정해줘야 하고, 대신 언어/라이브러리 매뉴얼이나 예제 뒤지는 수고는 대신 해 줄 수 있었음. 이 정도만 해도 생산성에는 큰 도움이 되긴 하는데 프로그래머가 필요 없어지려면 아직은 갈 길이 멀다고 생각함. 최신예의, 추론한다는 모델들은 다를지 궁금하네.

나나나나미's avatar
나나나나미

@nnanananami@planet.moe

최근 일본 웹에서 성적인 광고가 너무 많이 늘어나서 사회적 문제가 되고 있는데, 그 원인을 짚는 기사. digital.asahi.com/articles/AST
신문 잡지 같은 전통 광고 시장에서는 미디어 측에서 광고를 직접 검수하고 싣는데, 웹 광고는 그게 아니라 웹페이지는 광고 공간을 판매하면 구글이나 메타 등 플랫폼에서 계약한 광고들이 자동으로 뜨는 구조라 웹사이트 측에서 광고 내용을 미리 제어할 수가 없다.
웹사이트 운영측에서는 그런 광고가 뜨면 자사만 이미지 타격을 입기 때문에 인력을 들여서 필터링 강화 대응을 하고는 있지만 완벽하지 않다고.

pkg update's avatar
pkg update

@pkgupdt@hl.pkgu.net · Reply to 125에 본진테러 막는거면 개이득 아니냐's post

@enbay 말씀대로 가벼운 건 AVX 등 cpu로 하고 무거운 것들은 따로 돌리는 방법을 시도해봐야겠네요. 감사합니다. 😁

pkg update's avatar
pkg update

@pkgupdt@hl.pkgu.net · Reply to 125에 본진테러 막는거면 개이득 아니냐's post

@enbay 아 복사 문제도 있겠군요. 알려주셔서 감사합니다. 😊 SDK도 불안정하고 해서 다른 시스템을 찾아봐야 할 거 같습니다.;

pkg update's avatar
pkg update

@pkgupdt@hl.pkgu.net · Reply to pkg update's post

이런 수준이면 Ryzen AI는 사면 안 되겠는데... 경쟁사들에 비해서 지원할 생각이 있는지 궁금할 지경.

pkg update's avatar
pkg update

@pkgupdt@hl.pkgu.net

AMD APU openCL 지원은... 정말 열악하구만. 깡 cpu로 미는 것보다 느린 경우도 생기네. 외장 GPU compute 쪽에서 이렇게 밀리지는 않던데, 인텔에 비함 apu는 그냥 라이트 게임만 돌리란 건가. -_-;;

pkg update's avatar
pkg update

@pkgupdt@hl.pkgu.net

망원 STM 나오는 거 보고 별 거? 없으면 걍 70-200 F4 가야지.

:vrchat_full: Gameguard's avatar
:vrchat_full: Gameguard

@gameguard.moe@gameguard.moe

아이폰 벨소리로 만든거 공유합니다
윈도우 10에서는 Apple TV, Apple Music, Apple Device 앱이 설치되어있다면 제거하셔야합니다.
iTunes 를 실행 후 기기를 연결하고 소리 부분에 드래그하신뒤에 동기화하시면 사용 가능합니다.

Driftveil City - Pokémon / Toothless (Marimba Ringtone)

https://drive.google.com/file/d/1kjXtncFL8fiMZHIQt1bfmdVkA_UPPg6y/view?usp=sharing

pkg update's avatar
pkg update

@pkgupdt@hl.pkgu.net

그러고보니 비행기에서 영화 파묘를 봤었다.

뛰어난 화면 연출과 형편 없는 캐릭터들이 얽혀서 아쉬움이 짙게 남았었다. 그 배우들로도 아예 어긋난 인물을 연기하기란 무척 어려웠을 것이다. 감독에게 허술한 각본을 채울 능력이 없었는데, 다행히 흥행한만큼 몇 번의 기회가 더 주어질테니 각본가를 잘 만나야 할 듯.

몇몇 장면은 정말 대단했지만 전체를 보면 헛웃음만 나오는 영화였다.

pkg update's avatar
pkg update

@pkgupdt@hl.pkgu.net

내 노트 정리 순서는 블루 펜 -> 연필로 가필 -> 스캔(종이는 파쇄) -> 필요시 디지털로 가필 후 태깅 및 아카이빙, 인데 너무 단계가 많은 거 같기도 하고. 흠...

ねぐるみ:misskey_loading::ablobcatphotobomb:'s avatar
ねぐるみ:misskey_loading::ablobcatphotobomb:

@mumumuphoto@misskey.io

pkg update's avatar
pkg update

@pkgupdt@hl.pkgu.net

창의 아름다움은 그 그림자에서 잘 드러난다. 얼마나 많이 궁리했을지, 보며 감탄 하고 있었다.

Aya Sopha, Istanbul, Turkey.
洪 民憙 (Hong Minhee)'s avatar
洪 民憙 (Hong Minhee)

@hongminhee@hollo.social

Don't build from scratch! It's complex. See why using the framework is the smarter way to develop for the fediverse in my new post:

https://hackers.pub/@hongminhee/2025/why-use-fedify

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

@hongminhee@hackers.pub

So, you're captivated by the fediverse—the decentralized social web powered by protocols like ActivityPub. Maybe you're dreaming of building the next great federated app, a unique space connected to Mastodon, Lemmy, Pixelfed, and more. The temptation to dive deep and implement ActivityPub yourself, from the ground up, is strong. Total control, right? Understanding every byte? Sounds cool!

But hold on a sec. Before you embark on that epic quest, let's talk reality. Implementing ActivityPub correctly isn't just one task; it's like juggling several complex standards while riding a unicycle… blindfolded. It’s hard.

That's where Fedify comes in. It's a TypeScript framework designed to handle the gnarliest parts of ActivityPub development, letting you focus on what makes your app special, not reinventing the federation wheel.

This post will break down the common headaches of DIY ActivityPub implementation and show how Fedify acts as the super-powered pain reliever, starting with the very foundation of how data is represented.

Challenge #1: Data Modeling—Speaking ActivityStreams & JSON-LD Fluently

At its core, ActivityPub relies on the ActivityStreams 2.0 vocabulary to describe actions and objects, and it uses JSON-LD as the syntax to encode this vocabulary. While powerful, this combination introduces significant complexity right from the start.

First, understanding and correctly using the vast ActivityStreams vocabulary itself is a hurdle. You need to model everything—posts (Note, Article), profiles (Person, Organization), actions (Create, Follow, Like, Announce)—using the precise terms and properties defined in the specification. Manual JSON construction is tedious and prone to errors.

Second, JSON-LD, the encoding layer, has specific rules that make direct JSON manipulation surprisingly tricky:

  • Missing vs. Empty Array: In JSON-LD, a property being absent is often semantically identical to it being present with an empty array. Your application logic needs to treat these cases equally when checking for values. For example, these two Note objects mean the same thing regarding the name property:
    // No name property
    {
      "@context": "https://www.w3.org/ns/activitystreams",
      "type": "Note",
      "content": ""
    }
    // Equivalent to:
    {
      "@context": "https://www.w3.org/ns/activitystreams",
      "type": "Note",
      "name": [],
      "content": ""
    }
  • Single Value vs. Array: Similarly, a property holding a single value directly is often equivalent to it holding a single-element array containing that value. Your code must anticipate both representations for the same meaning, like for the content property here:
    // Single value
    {
      "@context": "https://www.w3.org/ns/activitystreams",
      "type": "Note",
      "content": "Hello"
    }
    // Equivalent to:
    {
      "@context": "https://www.w3.org/ns/activitystreams",
      "type": "Note",
      "content": ["Hello"]
    }
  • Object Reference vs. Embedded Object: Properties can contain either the full JSON-LD object embedded directly or just a URI string referencing that object. Your application needs to be prepared to fetch the object's data if only a URI is given (a process called dereferencing). These two Announce activities are semantically equivalent (assuming the URIs resolve correctly):
    {
      "@context": "https://www.w3.org/ns/activitystreams",
      "type": "Announce",
      // Embedded objects:
      "actor": {
        "type": "Person",
        "id": "http://sally.example.org/",
        "name": "Sally"
      },
      "object": {
        "type": "Arrive",
        "id": "https://sally.example.com/arrive",
        /* ... */
      }
    }
    // Equivalent to:
    {
      "@context":
      "https://www.w3.org/ns/activitystreams",
      "type": "Announce",
      // URI references:
      "actor": "http://sally.example.org/",
      "object": "https://sally.example.com/arrive"
    }

Attempting to manually handle all these vocabulary rules and JSON-LD variations consistently across your application inevitably leads to verbose, complex, and fragile code, ripe for subtle bugs that break federation.

Fedify tackles this entire data modeling challenge with its comprehensive, type-safe Activity Vocabulary API. It provides TypeScript classes for ActivityStreams types and common extensions, giving you autocompletion and compile-time safety. Crucially, these classes internally manage all the tricky JSON-LD nuances. Fedify's property accessors present a consistent interface—non-functional properties (like tags) always return arrays, functional properties (like content) always return single values or null. It handles object references versus embedded objects seamlessly through dereferencing accessors (like activity.getActor()) which automatically fetch remote objects via URI when needed—a feature known as property hydration. With Fedify, you work with a clean, predictable TypeScript API, letting the framework handle the messy details of AS vocabulary and JSON-LD encoding.

Challenge #2: Discovery & Identity—Finding Your Actors

Once you can model data, you need to make your actors discoverable. This primarily involves the WebFinger protocol (RFC 7033). You'd need to build a server endpoint at /.well-known/webfinger capable of parsing resource queries (like acct: URIs), validating the requested domain against your server, and responding with a precisely formatted JSON Resource Descriptor (JRD). This JRD must include specific links, like a self link pointing to the actor's ActivityPub ID using the correct media type. Getting any part of this wrong can make your actors invisible.

Fedify simplifies this significantly. It automatically handles WebFinger requests based on the actor information you provide through its setActorDispatcher() method. Fedify generates the correct JRD response. If you need more advanced control, like mapping user-facing handles to internal identifiers, you can easily register mapHandle() or mapAlias() callbacks. You focus on defining your actors; Fedify handles making them discoverable.

// Example: Define how to find actors
federation.setActorDispatcher(
  "/users/{username}",
  async (ctx, username) => { /* ... */ }
);
// Now GET /.well-known/webfinger?resource=acct:username@your.domain just works!

Challenge #3: Core ActivityPub Mechanics—Handling Requests and Collections

Serving actor profiles requires careful content negotiation. A request for an actor's ID needs JSON-LD for machine clients (Accept: application/activity+json) but HTML for browsers (Accept: text/html). Handling incoming activities at the inbox endpoint involves validating POST requests, verifying cryptographic signatures, parsing the payload, preventing duplicates (idempotency), and routing based on activity type. Implementing collections (outbox, followers, etc.) with correct pagination adds another layer.

Fedify streamlines all of this. Its core request handler (via Federation.fetch() or framework adapters like @fedify/express) manages content negotiation. You define actors with setActorDispatcher() and web pages with your framework (Hono, Express, SvelteKit, etc.)—Fedify routes appropriately. For the inbox, setInboxListeners() lets you define handlers per activity type (e.g., .on(Follow, ...)), while Fedify automatically handles validation, signature verification, parsing, and idempotency checks using its KV Store. Collection implementation is simplified via dispatchers (e.g., setFollowersDispatcher()); you provide logic to fetch a page of data, and Fedify constructs the correct Collection or CollectionPage with pagination.

// Define inbox handlers
federation.setInboxListeners("/inbox", "/users/{handle}/inbox")
  .on(Follow, async (ctx, follow) => { /* Handle follow */ })
  .on(Undo, async (ctx, undo) => { /* Handle undo */ });

// Define followers collection logic
federation.setFollowersDispatcher(
  "/users/{handle}/followers",
  async (ctx, handle, cursor) => { /* ... */ }
);

Challenge #4: Reliable Delivery & Asynchronous Processing—Sending Activities Robustly

Sending an activity requires more than a simple POST. Networks fail, servers go down. You need robust failure handling and retry logic (ideally with backoff). Processing incoming activities synchronously can block your server. Efficiently broadcasting to many followers (fan-out) requires background processing and using shared inboxes where possible.

Fedify addresses reliability and scalability using its MessageQueue abstraction. When configured (highly recommended), Context.sendActivity() enqueues delivery tasks. Background workers handle sending with automatic retries based on configurable policies (like outboxRetryPolicy). Fedify supports various queue backends (Deno KV, Redis, PostgreSQL, AMQP). For high-traffic fan-out, Fedify uses an optimized two-stage mechanism to distribute the load efficiently.

// Configure Fedify with a persistent queue (e.g., Deno KV)
const federation = createFederation({
  queue: new DenoKvMessageQueue(/* ... */),
  // ...
});
// Sending is now reliable and non-blocking
await ctx.sendActivity({ handle: "myUser" }, recipient, someActivity);

Challenge #5: Security—Avoiding Common Pitfalls

Securing an ActivityPub server is critical. You need to implement HTTP Signatures (draft-cavage-http-signatures-12) for server-to-server authentication—a complex process. You might also need Linked Data Signatures (LDS) or Object Integrity Proofs (OIP) based on FEP-8b32 for data integrity and compatibility. Managing cryptographic keys securely is essential. Lastly, fetching remote resources risks Server-Side Request Forgery (SSRF) if not validated properly.

Fedify is designed with security in mind. It automatically handles the creation and verification of HTTP Signatures, LDS, and OIP, provided you supply keys via setKeyPairsDispatcher(). It includes key management utilities. Crucially, Fedify's default document loader includes built-in SSRF protection, blocking requests to private IPs unless explicitly allowed.

Challenge #6: Interoperability & Maintenance—Playing Nicely with Others

The fediverse is diverse. Different servers have quirks. Ensuring compatibility requires testing and adaptation. Standards evolve with new Federation Enhancement Proposals (FEPs). You also need protocols like NodeInfo to advertise server capabilities.

Fedify aims for broad interoperability and is actively maintained. It includes features like ActivityTransformers to smooth over implementation differences. NodeInfo support is built-in via setNodeInfoDispatcher().

Challenge #7: Developer Experience—Actually Building Your App

Beyond the protocol, building any server involves setup, testing, and debugging. With federation, debugging becomes harder—was the message malformed? Was the signature wrong? Is the remote server down? Is it a compatibility quirk? Good tooling is essential.

Fedify enhances the developer experience significantly. Being built with TypeScript, it offers excellent type safety and editor auto-completion. The fedify CLI is a powerful companion designed to streamline common development tasks.

You can quickly scaffold a new project tailored to your chosen runtime and web framework using fedify init.

For debugging interactions and verifying data, fedify lookup is invaluable. It lets you inspect how any remote actor or object appears from the outside by performing WebFinger discovery and fetching the object's data. Fedify then displays the parsed object structure and properties directly in your terminal. For example, running:

$ fedify lookup @fedify-example@fedify-blog.deno.dev

Will first show progress messages and then output the structured representation of the actor, similar to this:

// Output of fedify lookup command (shows parsed object structure)
Person {
  id: URL "https://fedify-blog.deno.dev/users/fedify-example",
  name: "Fedify Example Blog",
  published: 2024-03-03T13:18:11.857Z, // Simplified timestamp
  summary: "This blog is powered by Fedify, a fediverse server framework.",
  url: URL "https://fedify-blog.deno.dev/",
  preferredUsername: "fedify-example",
  publicKey: CryptographicKey {
    id: URL "https://fedify-blog.deno.dev/users/fedify-example#main-key",
    owner: URL "https://fedify-blog.deno.dev/users/fedify-example",
    publicKey: CryptoKey { /* ... CryptoKey details ... */ }
  },
  // ... other properties like inbox, outbox, followers, endpoints ...
}

This allows you to easily check how data is structured or troubleshoot why an interaction might be failing by seeing the actual properties Fedify parsed.

Testing outgoing activities from your application during development is made much easier with fedify inbox. Running the command starts a temporary local server that acts as a publicly accessible inbox, displaying key information about the temporary actor it creates for receiving messages:

$ fedify inbox
✔ The ephemeral ActivityPub server is up and running: https://<unique_id>.lhr.life/
✔ Sent follow request to @<some_test_account>@activitypub.academy.
╭───────────────┬─────────────────────────────────────────╮
│ Actor handle: │ i@<unique_id>.lhr.life                  │
├───────────────┼─────────────────────────────────────────┤
│   Actor URI:  │ https://<unique_id>.lhr.life/i          │
├───────────────┼─────────────────────────────────────────┤
│  Actor inbox: │ https://<unique_id>.lhr.life/i/inbox    │
├───────────────┼─────────────────────────────────────────┤
│ Shared inbox: │ https://<unique_id>.lhr.life/inbox      │
╰───────────────┴─────────────────────────────────────────╯

Web interface available at: http://localhost:8000/

You then configure your developing application to send an activity to the Actor inbox or Shared inbox URI provided. When an activity arrives, fedify inbox only prints a summary table to your console indicating that a request was received:

╭────────────────┬─────────────────────────────────────╮
│     Request #: │ 2                                   │
├────────────────┼─────────────────────────────────────┤
│ Activity type: │ Follow                              │
├────────────────┼─────────────────────────────────────┤
│  HTTP request: │ POST /i/inbox                       │
├────────────────┼─────────────────────────────────────┤
│ HTTP response: │ 202                                 │
├────────────────┼─────────────────────────────────────┤
│       Details  │ https://<unique_id>.lhr.life/r/2    │
╰────────────────┴─────────────────────────────────────╯

Crucially, the detailed information about the received request—including the full headers (like Signature), the request body (the Activity JSON), and the signature verification status—is only available in the web interface provided by fedify inbox. This web UI allows you to thoroughly inspect incoming activities during development.

Screenshot of the Fedify Inbox web interface showing received activities and their details.
The Fedify Inbox web UI is where you view detailed activity information.

When you need to test interactions with the live fediverse from your local machine beyond just sending, fedify tunnel can securely expose your entire local development server temporarily. This suite of tools significantly eases the process of building and debugging federated applications.

Conclusion: Build Features, Not Plumbing

Implementing the ActivityPub suite of protocols from scratch is an incredibly complex and time-consuming undertaking. It involves deep dives into multiple technical specifications, cryptographic signing, security hardening, and navigating the nuances of a diverse ecosystem. While educational, it dramatically slows down the process of building the actual, unique features of your federated application.

Fedify offers a well-architected, secure, and type-safe foundation, handling the intricacies of federation for you—data modeling, discovery, core mechanics, delivery, security, and interoperability. It lets you focus on your application's unique value and user experience. Stop wrestling with low-level protocol details and start building your vision for the fediverse faster and more reliably. Give Fedify a try!

Getting started is straightforward. First, install the Fedify CLI using your preferred method. Once installed, create a new project template by running fedify init your-project-name.

Check out the Fedify tutorials and Fedify manual to learn more. Happy federating!

:kenzen::_shi::_ra::_ra::_ni::_lya::_n:'s avatar
:kenzen::_shi::_ra::_ra::_ni::_lya::_n:

@c1@misskey.io

:blobcamera:

루미논카노네스🌨️'s avatar
루미논카노네스🌨️

@atLuminon@byeolvit.space

のどかだね。

📸 : Voigtländer BESSA-R, CANON Serenar 50mm f/1.8 I
🎞 : KODAK Professional PORTRA 160
🏙️ : Kokurakita-ku, Kitakyushu City, Japan

화창한 날씨, 무라사키강 너머로 신칸센이 도심을 가로지르고 있는 모습.
Older →