- Check off issue #27 (Instrument all APIs with api_requests_total,
api_response_duration_seconds, api_data_freshness_seconds)
- Check off issue #180 (Add Prometheus metrics endpoint to holidays service)
Both tracking issues are closed; ROADMAP.md now reflects their completed status.
- Phase 0 unchecked items now link to #2, #3, #4
- Phase 4 unchecked items now link to #7, #8, #27
- Phase 5 unchecked item now links to #30
- STATUS.md Last updated set to 2026-06-02
- STATUS.md new Completed This Cycle entry for 2026-06-02 Sprint Planning Cycle
Closesleeworks-agents/api-company#171Closesleeworks-agents/api-company#170
kustomize build flux/ = PASS
leeworks-agents/vin-decoder data layer (#120) and Fastify server (#121)
are confirmed merged. Previous PR #160 closed due to merge conflicts and
ROADMAP.md regressions (incorrectly unchecked completed items).
kustomize build flux/ = PASS
- flux/monitoring/prometheusrule-apis.yaml: extend all 5 SLO alert
rules to include vin-decoder in the job regex filter
- flux/monitoring/grafana-dashboard-apis.yaml: update all PromQL
expressions to include vin-decoder in the api regex filter;
update dashboard description
- flux/monitoring/vin-decoder-dashboard.yaml: new dedicated Grafana
dashboard for VIN Decoder showing request rate by route, 5xx error
rate, P50/P95/P99 latency by route, and data freshness gauge
- flux/monitoring/kustomization.yaml: add vin-decoder-dashboard.yaml
- flux/vin-decoder/servicemonitor.yaml: Prometheus ServiceMonitor
for auto-discovery of /metrics on the vin-decoder service
- flux/vin-decoder/kustomization.yaml: add servicemonitor.yaml
Closesleeworks-agents/api-company#129
Add checkout step for leeworks-agents/vin-decoder and copy
vin-decoder/openapi.yaml into docs-site/public/specs/vin-decoder.yaml
so the vin-decoder.astro Redoc page renders correctly.
Closesleeworks-agents/api-company#148
- Update meta description to include VIN Decoder
- Change hero text from 'all three APIs' to 'all four APIs'
- Add VIN Decoder column to the pricing table with same 4-tier rates
- Add link to /vin-decoder docs page in the CTA row
npm run build exits 0; /pricing route builds successfully.
Closesleeworks-agents/api-company#141
Create flux/vin-decoder/ with namespace, HelmRelease, ExternalSecret, and
kustomization files mirroring the existing API Flux manifest structure.
Register vin-decoder in the root flux/kustomization.yaml so Flux picks it up.
Image automation is handled by existing flux/image-automation/ manifests
(ImageRepository and ImagePolicy for vin-decoder already present).
kustomize build flux/ passes with no errors.
Closesleeworks-agents/api-company#140
Add vin-decoder as 4th entry to the APIS array in scripts/publish-openapi.js
and add RAPIDAPI_VIN_API_ID / RAPIDAPI_VIN_VERSION_ID secrets to the
publish-openapi.yaml CI workflow env block.
Closesleeworks-agents/api-company#138
Closes leeworks-agents/api-company#133
Closes leeworks-agents/api-company#134
Closes leeworks-agents/api-company#135
Closes leeworks-agents/api-company#136
- flux/image-automation/imagerepositories.yaml: add vin-decoder ImageRepository
pointing at registry.leeworks.dev/vin-decoder/api (#133)
- flux/image-automation/imagepolicies.yaml: add vin-decoder ImagePolicy
with semver range >=0.1.0 (#133)
- flux/monitoring/gatus-helmrelease.yaml: add VIN Decoder API endpoint check
targeting https://vin.leeworks.dev/v1/health with Slack alert (#134)
- docs/pre-launch-checklist.md: add vin-decoder to Infrastructure, DNS & TLS,
Functional Verification, and Legal sections; update status page line to
reference all four APIs (#135)
- docs/secrets-checklist.md: add items #11-13 for vin-decoder GITEA_TOKEN,
gitea-registry, and rapidapi-proxy-secret; add detail sections for each (#136)
kustomize build flux/ passes with zero errors.
Closes leeworks-agents/api-company#131
Closes leeworks-agents/api-company#130
- docs/rapidapi-listings.md: add Section 4 — VIN Decoder API with
title, tagline, short/long description, tier table (Free/Basic/Pro/Ultra),
endpoint descriptions, and keywords. Mirrors style of existing three
API sections. Tiers match the spec from issue #131.
- docs/dns.md: add vin.leeworks.dev as 8th subdomain in records table,
verification dig command, action-required count (7→8), and status
checklist entry. Updated last-updated date to 2026-05-30.
- Add docs-site/src/pages/vin-decoder.astro: Redoc reference page
rendering /specs/vin-decoder.yaml (matches pattern of existing API pages)
- Copy apis/vin-decoder/openapi.yaml to docs-site/public/specs/vin-decoder.yaml
so Redoc can serve the spec
- Add VIN Decoder card to index.astro hero grid (4th API)
- Add docs-site/src/pages/blog/vin-decoder.mdx: 1,500+ word SEO blog post
'How to Decode a VIN Number with Node.js Using Free NHTSA Data'
with meta description, working code examples, VIN structure explanation,
NHTSA vPIC background, and use-case context
- npm run build exits 0; /vin-decoder and /blog/vin-decoder routes present
Closesleeworks-agents/api-company#123Closesleeworks-agents/api-company#124
All 5 sections written and copy-paste ready (pending RapidAPI URLs from #44):
1. Hacker News Show HN post (150-300 word body)
2. Reddit posts for r/webdev, r/SideProject, r/learnprogramming (with code examples)
3. Indie Hackers milestone post (MRR /bin/bash, stack, lessons learned)
4. Product Hunt listing: tagline (58 chars), description (211 chars), maker note, gallery placeholders
5. Email waitlist message: subject + 3-4 paragraph body with quick-start curl example
All sections marked DRAFT until issue #44 RapidAPI URLs are available.
Pre-publish checklist included at bottom of document.
Closesleeworks-agents/api-company#115
- Appended VIN Decoder feasibility session to research/RESEARCH_LOG.md
- NHTSA vPIC: no rate limits, public domain, 1981-present coverage
- Competitor audit: 28,500+ combined RapidAPI subscribers across 4 listings
- Legal/ToS: 17 U.S.C. 105 public domain confirmed, no redistribution restrictions
- Decision: BUILD confirmed
- Added apis/vin-decoder/openapi.yaml with:
- GET /decode?vin={vin} - full single VIN decode
- POST /batch - up to 50 VINs per request
- GET /health - service health + cache stats
- Full OAS 3.1 schema (nullable fields use type arrays)
- Passes redocly lint with zero errors
Closesleeworks-agents/api-company#117
Add flux/{zip-enrichment,holidays,air-quality}/servicemonitor.yaml so
Prometheus (kube-prometheus-stack) can auto-discover and scrape each
API service once deployed.
Each ServiceMonitor:
- Selects pods via app.kubernetes.io/name label
- Scrapes /metrics on the http port every 30s
- Uses release: kube-prometheus-stack label to match Prometheus selector
- Lives in the same namespace as the API service
Add each servicemonitor.yaml to its kustomization.yaml resources list.
kustomize build flux/ passes with no errors.
Closesleeworks-agents/api-company#110
Create docs/pre-launch-checklist.md with all sections required before
public launch: Infrastructure, DNS & TLS (all 7 subdomains including
grafana.leeworks.dev), Functional Verification, Legal & Monetisation,
and Post-Launch steps.
Also link the checklist from README.md.
Closesleeworks-agents/api-company#112
Closesleeworks-agents/api-company#102
Documents why ZIP Enrichment, Holidays, and Air Quality were chosen:
- ZIP: 10-15k RapidAPI subscriber demand; USPS/Census free dataset
- Holidays: 50k subs on top competitor (AbstractAPI); Nager.Date gap
- AQI: 8k subs on top competitor; OpenAQ open dataset fills -49/mo gap
RapidAPI competitor subscriber counts documented for all 3 categories.
Identifies 3 new API candidates with data sources and demand evidence:
1. Business Hours API — OSM opening_hours — high revenue potential
2. Vehicle VIN Decoder — NHTSA vPIC (gov data) — high revenue potential
3. Time Zone by Coordinates — timezone-boundary-builder — medium-high
Decision: build VIN Decoder next (strongest paid demand evidence,
government data source, simple API surface).
Closesleeworks-agents/api-company#100
- scripts/publish-openapi.js: Node.js script using only built-in modules
(https, fs, path — no extra deps) that uploads each API's openapi.yaml
to the RapidAPI Platform API via PUT multipart/form-data.
- Reads RAPIDAPI_KEY/RAPIDAPI_PLATFORM_KEY from environment.
- Skips silently per API if API ID / version ID not set.
- Skips all uploads if RAPIDAPI_KEY not set (exits 0).
- Exits non-zero on any HTTP error.
- Logs: '✓ Published {api-name} spec to RapidAPI' on success.
- Passes 'node --check' syntax validation.
- .gitea/workflows/publish-openapi.yaml: triggers on push to main when
apis/*/openapi.yaml changes.
- Runs Redocly CLI lint (fails pipeline on spec errors).
- Detects changed specs via git diff.
- Calls publish-openapi.js; no secrets = skip, not crash.