Linkblog Service - Implementation Plan

Overview

A personal bookmarking API built with NestJS + TypeScript + Supabase. Stores articles with notes and publishes them as a public RSS feed for the blogroll at luther.io/blogroll.

Architecture

Client (curl/scripts) --> NestJS API --> Supabase (Postgres)
                              |
                              +--> GET /feed (public RSS 2.0)
                              +--> CRUD /links (API key protected)

Key Decisions

Data Model

Table: links

Column Type Constraints
id integer PK
url text  
title text  
summary text  
created_at timestamptz default now()
updated_at timestamptz default now()

Endpoints

Method Path Auth Description
POST /links API key Create a link
GET /links API key List all links (desc by created_at)
GET /links/:id API key Get a single link
PATCH /links/:id API key Update a link
DELETE /links/:id API key Delete a link (204)
GET /feed Public RSS 2.0 feed
GET /health Public Health check for App Runner

GitHub Issues

Issue Title Depends On Status
#1 Initialize Repository with Development Tooling Closed
#2 Create implementation plan Closed
#3 Provision Supabase project & create links table Closed
#4 Set up NestJS project skeleton #1 Closed
#5 Create Supabase client provider #4 Open
#6 Implement links service (CRUD via Supabase) #5 Open
#7 Implement links controller & API-key guard #6 Open
#8 Implement RSS Feed endpoint (/feed) #6 Open

Implementation Phases

Phase 1: Foundation (Issues #1–#4) ✅

Goal: Project scaffolded, database ready.

Phase 2: Supabase Client (Issue #5)

Goal: NestJS can talk to Supabase.

Phase 3: Core API (Issues #6, #7)

Goal: Full CRUD for links, protected by API key.

Controller & API Key Guard (Issue #7)

Phase 4: RSS Feed (Issue #8)

Goal: Public RSS feed for luther.io consumption.

Phase 5: Deployment (no issue yet)

Goal: Dockerized and deployable to AWS App Runner.

Dependency Graph

Phase 1:  #1 (tooling) ──> #4 (skeleton) ──> #5 (supabase client)
          #2 (plan)                                │
          #3 (schema)                              v
                                              #6 (service) ──┬──> #7 (controller + guard)
                                                             └──> #8 (RSS feed)