RSS Amplifier

Joel Holmes · Jan 1, 2001

Architecture

0
Sign in to vote or save

This page did not load. You can still read it on the original site — the toolbar below keeps your place in the directory.

System Context C4Context title System Context — Lynx within joel.holmes.haus Person(admin, "Admin", "Uses the joel.holmes.haus UI to manage feeds and websites") Boundary(platform, "joel.holmes.haus Platform") { System(ui, "joel.holmes.haus", "Go-app WASM admin SPA") System(lynx, "Lynx", "Web feed and website archiving service") System(magpie, "Magpie", "Central resource index — receives website…

System Context

C4Context title System Context — Lynx within joel.holmes.haus Person(admin, "Admin", "Uses the joel.holmes.haus UI to manage feeds and websites") Boundary(platform, "joel.holmes.haus Platform") { System(ui, "joel.holmes.haus", "Go-app WASM admin SPA") System(lynx, "Lynx", "Web feed and website archiving service") System(magpie, "Magpie", "Central resource index — receives website resources from Lynx") System(shrike, "Shrike", "Search — indexes enriched website text from Lynx") } SystemDb(postgres, "PostgreSQL", "Feeds, websites, and website metadata") SystemDb(minio, "MinIO / S3", "Archived HTML and readable text blobs") SystemQueue(kafka, "Kafka", "magpie.v1.Resource · shrike.v1.TextExtractedEvent") Rel(admin, ui, "Uses") Rel(ui, lynx, "ConnectRPC") Rel(lynx, postgres, "Reads / writes") Rel(lynx, minio, "Stores archived content") Rel(lynx, kafka, "Publishes resource events") Rel(kafka, magpie, "magpie.v1.Resource") Rel(kafka, shrike, "TextExtractedEvent")

Container Diagram

C4Container title Lynx — Internal Containers Boundary(lynx, "Lynx") { Container(api, "cmd/api", "Go / ConnectRPC h2c :9000", "FeedService · WebsiteService · Enricher goroutine") Container(worker, "cmd/worker", "Go / Kafka", "FeedConsumer · WebsiteConsumer · Enricher pipeline goroutine") Container(ui, "cmd/ui", "Go-app WASM :8000", "Browser SPA — calls cmd/api via ConnectRPC HTTP client") Container(feedSvc, "feed.Service", "Go", "CRUD for feeds") Container(websiteSvc, "website.Service", "Go", "Create (publishes Kafka event) · CRUD") Container(enricher, "enrichment.Enricher", "Go / goroutine", "7-step pipeline: fetch → metadata → archive HTML → readable → archive → persist → magpie") ContainerDb(feedRepo, "FeedRepo", "PostgreSQL / squirrel", "feeds table") ContainerDb(websiteRepo, "WebsiteRepo + MetadataRepo", "PostgreSQL / squirrel", "websites · website_metadata tables") } SystemDb(postgres, "PostgreSQL", "") SystemDb(minio, "MinIO / S3", "websites/{uuid}/original.html · readable.txt") SystemQueue(kafka, "Kafka", "") Rel(api, feedSvc, "delegates") Rel(api, websiteSvc, "delegates") Rel(api, enricher, "Enqueue()") Rel(worker, feedSvc, "FeedConsumer") Rel(worker, websiteSvc, "WebsiteConsumer") Rel(worker, enricher, "Enqueue()") Rel(feedSvc, feedRepo, "CRUD") Rel(websiteSvc, websiteRepo, "CRUD") Rel(websiteSvc, kafka, "Publish magpie.v1.Resource") Rel(enricher, websiteRepo, "UpdateNameIfBlank · UpsertMetadata") Rel(enricher, minio, "PutObject") Rel(enricher, kafka, "TextExtractedEvent") Rel(feedRepo, postgres, "SQL") Rel(websiteRepo, postgres, "SQL")

Overview

Lynx is structured as a multi-binary Go monorepo. Three runnable binaries share business logic through the lib/ package tree.

Read on joelholmes.dev

Comments

Nothing yet. Say the first thing.

    Sign in to join the conversation.