- 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.
Closesleeworks-agents/api-company#101
- Create docs-site/src/pages/pricing.astro with accessible table markup
showing all 4 tiers (Free/Basic/Pro/Ultra) for all 3 APIs
- Add <caption> and scope attributes for accessibility
- Responsive overflow-x wrapper for mobile
- CTA buttons linking to RapidAPI (placeholder # until listings live)
- Revenue disclaimer: subscriptions managed via RapidAPI marketplace
- Add /pricing link to nav in Base.astro layout
- npm run build passes with no errors
Adds .gitea/workflows/smoke-test.yaml as a manual workflow_dispatch trigger
that runs four echo commands. When the Act Runner comes online (#77) the
operator can fire this from the Gitea Actions UI to confirm runner
registration and job dispatch work before any real tooling is needed.
Closesleeworks-agents/api-company#96
Adds postBuild.substituteFrom to the Flux Kustomization reference manifest
so that ${GRAFANA_ADMIN_PASSWORD} in flux/monitoring/helmrelease.yaml is
substituted from the grafana-admin secret at reconcile time.
Without this block Flux passes the literal string to the Helm chart, causing
Grafana to start with a broken admin password.
The live copy in 0xWheatyz/Talos at
testing1/first-cluster/cluster/flux/api-company-source/kustomization.yaml
must also be updated with the same block (companion to issue #90).
Closesleeworks-agents/api-company#97
Documents Node.js v22.22.2, Python 3.11.2, Helm v3.21.0, Flux CLI v2.4.0,
kustomize v5.6.0 as available in the agent container. Confirms git remote
points to gitea.leeworks.dev/leeworks-agents/api-company. Includes stack
summary (runtime choices, Helm registry, Flux bootstrap reference) and
a live-verification block for operator use.
Closesleeworks-agents/api-company#94
Add three Astro markdown pages under docs-site/src/pages/legal/:
- terms-of-service.md -> /legal/terms-of-service
- privacy-policy.md -> /legal/privacy-policy
- acceptable-use-policy.md -> /legal/acceptable-use-policy
All three use the Base.astro layout and render the legal content from
docs/legal/ (synced verbatim). The Base.astro layout already had legal
footer links added previously; this commit also adds a footer section
directly in index.astro for redundancy.
The ToS URL (https://docs.leeworks.dev/legal/terms-of-service) is now
ready to be pasted into the RapidAPI listing (issue #44).
Closesleeworks-agents/api-company#89
- Fix APIDataStale 'for' duration from 5m to 30m (issue spec requires 30m)
- Add APIDataCriticallyStale alert at 60-day threshold (5184000s) with for: 1h
and severity: critical
Both alerts fire on api_data_freshness_seconds metric for all three API jobs.
Existing APIHighErrorRate and APIHighLatency alerts are unmodified.
kustomize build flux/ passes.
Closesleeworks-agents/api-company#88
The bedag HelmRepository was only declared inside flux/docs-site/, causing
a race condition where zip-enrichment, holidays, and air-quality HelmReleases
would fail with 'HelmRepository not found' if they reconciled before docs-site.
Move flux/docs-site/helmrepository.yaml -> flux/bedag-helmrepository.yaml and
add it as a top-level resource in flux/kustomization.yaml so it is always
available before any HelmRelease that depends on the bedag chart.
Closesleeworks-agents/api-company#87
Triaged issues #76 and #77 (new operator secret tasks for Flux GitRepository
auth and gitea-act-runner token). Both are blocked manual operator tasks;
instructions posted on each issue. No PRs open. kustomize build flux/ = PASS.
Add checklist item 10 and full detail section for the rapidapi-proxy-secret
Kubernetes secret that must be created in each API namespace (zip-enrichment,
holidays, air-quality) before the Phase 3 server middleware can validate
incoming RapidAPI requests.
Includes:
- Checklist item 10 in the summary list
- Full detail section with kubectl commands for all 3 namespaces
- Note about placeholder ExternalSecret manifests and ESO (issue #61)
- Updated dependency-order diagram
Closesleeworks-agents/api-company#60