Compare commits
5 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 76abe394a1 | |||
| db42d81879 | |||
| c7bc7d3a50 | |||
| 74ddce364f | |||
| c83ccad4df |
@@ -15,6 +15,7 @@ Meta-repo for the `leeworks-apis` recursive build loop. This repo holds cross-cu
|
|||||||
- `MASTER_BUILD_PROMPT.md` — the prime directive driving the build loop
|
- `MASTER_BUILD_PROMPT.md` — the prime directive driving the build loop
|
||||||
- `ROADMAP.md` — cross-repo milestones (Phase 0–6)
|
- `ROADMAP.md` — cross-repo milestones (Phase 0–6)
|
||||||
- `STATUS.md` — living revenue + infra scorecard
|
- `STATUS.md` — living revenue + infra scorecard
|
||||||
|
- `docs/pre-launch-checklist.md` — go-live gate checklist (run the day before public launch)
|
||||||
- `SESSION_LOG.md` — append-only log of agent work sessions
|
- `SESSION_LOG.md` — append-only log of agent work sessions
|
||||||
- `research/RESEARCH_LOG.md` — market research findings, candidate API ideas
|
- `research/RESEARCH_LOG.md` — market research findings, candidate API ideas
|
||||||
- `flux/` — cluster-level Flux manifests (registry, runner, monitoring, docs-site)
|
- `flux/` — cluster-level Flux manifests (registry, runner, monitoring, docs-site)
|
||||||
|
|||||||
@@ -0,0 +1,359 @@
|
|||||||
|
# Launch Announcement Copy
|
||||||
|
|
||||||
|
Ready-to-copy marketing text for leeworks.dev API launch day.
|
||||||
|
|
||||||
|
**Status key:**
|
||||||
|
- **DRAFT** — copy is written and ready; needs final RapidAPI URLs inserted once issue #44 is complete
|
||||||
|
- **READY** — all placeholders filled; copy-paste ready to publish
|
||||||
|
|
||||||
|
All sections are currently **DRAFT** pending RapidAPI listing URLs from issue #44.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Placeholder Reference
|
||||||
|
|
||||||
|
When issue #44 is complete, replace these placeholders throughout this document:
|
||||||
|
|
||||||
|
| Placeholder | Replace with |
|
||||||
|
|---|---|
|
||||||
|
| `[RAPIDAPI_ZIP_URL]` | RapidAPI listing URL for ZIP Code Enrichment API |
|
||||||
|
| `[RAPIDAPI_HOLIDAYS_URL]` | RapidAPI listing URL for Holidays API |
|
||||||
|
| `[RAPIDAPI_AQI_URL]` | RapidAPI listing URL for Air Quality Index API |
|
||||||
|
| `[RAPIDAPI_PROFILE_URL]` | Your RapidAPI provider profile URL |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. Hacker News — Show HN Post [DRAFT]
|
||||||
|
|
||||||
|
**Title:**
|
||||||
|
```
|
||||||
|
Show HN: I built 3 free-data APIs on Kubernetes — ZIP enrichment, public holidays, air quality
|
||||||
|
```
|
||||||
|
|
||||||
|
**Body (paste into the "text" field):**
|
||||||
|
```
|
||||||
|
Three small APIs I've been building over the past few months, deployed via Flux GitOps on a self-hosted Kubernetes cluster.
|
||||||
|
|
||||||
|
**What they do:**
|
||||||
|
|
||||||
|
1. ZIP Code Enrichment API — turn any US ZIP code into city, state, county, timezone, area codes, and coordinates. Backed by USPS/Census public data, refreshed monthly. [RAPIDAPI_ZIP_URL]
|
||||||
|
|
||||||
|
2. Public Holidays API — query official public holidays for any country and year. 90+ countries, ISO 3166 codes. Backed by Nager.Date / public government calendars. [RAPIDAPI_HOLIDAYS_URL]
|
||||||
|
|
||||||
|
3. Air Quality Index API — current and historical AQI by city or coordinates. PM2.5, PM10, O3, NO2, SO2, CO. Backed by OpenAQ public dataset. [RAPIDAPI_AQI_URL]
|
||||||
|
|
||||||
|
**Tech stack:** Fastify (Node.js), SQLite (data cache), Flux GitOps on Talos Linux, cert-manager + ingress-nginx, Prometheus + Grafana for metrics, Gatus for status page.
|
||||||
|
|
||||||
|
**Business model:** Free tier (100 req/mo) + paid tiers ($9/$19/$49/mo) on RapidAPI. All three APIs use only public-domain data sources with no redistribution restrictions, so operating costs are cluster hosting only.
|
||||||
|
|
||||||
|
**Why I built this:** I wanted to learn GitOps/Kubernetes end-to-end, build something that generates real revenue, and ship entirely on open data. The stack is overkill for 3 simple APIs — but that's the point.
|
||||||
|
|
||||||
|
Code is private (it's a product), but happy to answer questions about the architecture.
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2. Reddit Posts [DRAFT]
|
||||||
|
|
||||||
|
### r/webdev
|
||||||
|
|
||||||
|
**Title:**
|
||||||
|
```
|
||||||
|
I built a ZIP code enrichment API on public Census data — city, state, county, timezone from a single lookup
|
||||||
|
```
|
||||||
|
|
||||||
|
**Body:**
|
||||||
|
```
|
||||||
|
Been working on a simple utility API for the past few months. ZIP Code Enrichment takes any US ZIP code and returns:
|
||||||
|
|
||||||
|
- City name + state (abbreviation and full name)
|
||||||
|
- County + FIPS code
|
||||||
|
- Timezone (IANA name + UTC offset)
|
||||||
|
- Area codes
|
||||||
|
- Latitude/longitude centroid
|
||||||
|
- ZIP type (standard, PO Box, military, unique)
|
||||||
|
|
||||||
|
**The data source** is a monthly-refreshed dataset from USPS/Census Bureau — entirely public domain, no scraping.
|
||||||
|
|
||||||
|
**Code example:**
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
const response = await fetch('https://zip.leeworks.dev/v1/lookup?zip=10001', {
|
||||||
|
headers: { 'X-RapidAPI-Proxy-Secret': process.env.RAPIDAPI_KEY }
|
||||||
|
});
|
||||||
|
const data = await response.json();
|
||||||
|
// { zip: "10001", city: "New York", state: "NY", county: "New York County",
|
||||||
|
// timezone: "America/New_York", lat: 40.7484, lon: -73.9967, ... }
|
||||||
|
```
|
||||||
|
|
||||||
|
Free tier is 100 requests/month. Paid plans start at $9/mo for 10,000 req/mo.
|
||||||
|
|
||||||
|
RapidAPI listing: [RAPIDAPI_ZIP_URL]
|
||||||
|
|
||||||
|
Happy to answer any questions about the stack (Fastify + SQLite + Kubernetes/Flux).
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### r/SideProject
|
||||||
|
|
||||||
|
**Title:**
|
||||||
|
```
|
||||||
|
Launched 3 data APIs on RapidAPI — ZIP enrichment, public holidays, air quality. $0 → targeting $100/mo MRR
|
||||||
|
```
|
||||||
|
|
||||||
|
**Body:**
|
||||||
|
```
|
||||||
|
Finally shipped the thing I've been building on weekends for the past few months.
|
||||||
|
|
||||||
|
**What I built:**
|
||||||
|
Three utility APIs on RapidAPI, all backed by free public-domain data:
|
||||||
|
|
||||||
|
1. **ZIP Code Enrichment** — city/state/county/timezone from a ZIP code ([RAPIDAPI_ZIP_URL])
|
||||||
|
2. **Public Holidays** — official holidays for 90+ countries ([RAPIDAPI_HOLIDAYS_URL])
|
||||||
|
3. **Air Quality Index** — current + historical AQI by city or coordinates ([RAPIDAPI_AQI_URL])
|
||||||
|
|
||||||
|
**Stack:** Fastify + SQLite + Kubernetes (Talos Linux) + Flux GitOps + Prometheus/Grafana
|
||||||
|
|
||||||
|
**Business model:**
|
||||||
|
- Free tier: 100 req/month (marketing + trial)
|
||||||
|
- Basic: $9/mo — 10,000 req/mo
|
||||||
|
- Pro: $19/mo — 50,000 req/mo
|
||||||
|
- Ultra: $49/mo — 250,000 req/mo
|
||||||
|
|
||||||
|
**Data cost: $0.** All three APIs use US government / OpenAQ public datasets with no licensing fees.
|
||||||
|
|
||||||
|
**Revenue so far:** $0 (launched today). Target: $100/mo net within 90 days, which is roughly 12 Basic subscribers across all three APIs.
|
||||||
|
|
||||||
|
The whole build — from first commit to Kubernetes deployment — is documented in a private research log. Happy to share architecture details.
|
||||||
|
|
||||||
|
What would you do differently for the pricing?
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### r/learnprogramming
|
||||||
|
|
||||||
|
**Title:**
|
||||||
|
```
|
||||||
|
I used free US government data to build a ZIP code API — here's how the data pipeline works
|
||||||
|
```
|
||||||
|
|
||||||
|
**Body:**
|
||||||
|
```
|
||||||
|
A walkthrough of the data layer behind the ZIP Code Enrichment API I just launched.
|
||||||
|
|
||||||
|
**The problem:** ZIP codes change. Cities merge. New ZIPs are added. Any ZIP lookup service needs to stay fresh.
|
||||||
|
|
||||||
|
**The solution:** A monthly seed script that:
|
||||||
|
1. Downloads the latest US ZIP code dataset from USPS/Census Bureau (public domain)
|
||||||
|
2. Parses and normalizes ~43,000 records
|
||||||
|
3. Inserts into SQLite with upsert logic (new ZIPs added, old ones retired)
|
||||||
|
4. Runs automatically via a Kubernetes CronJob on the 1st of each month
|
||||||
|
|
||||||
|
**The API itself** is a Fastify (Node.js) server that queries SQLite. Cold query: ~5ms. The whole thing runs in a 128MB container.
|
||||||
|
|
||||||
|
**Code snippet** (the seed script core logic):
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
// Fetch and parse Census ZIP dataset
|
||||||
|
const stream = await fetch(CENSUS_ZIP_URL);
|
||||||
|
const records = await parseCSV(stream.body);
|
||||||
|
|
||||||
|
// Upsert into SQLite
|
||||||
|
const stmt = db.prepare(`
|
||||||
|
INSERT INTO zips (zip, city, state, county, lat, lon, timezone, type)
|
||||||
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
||||||
|
ON CONFLICT(zip) DO UPDATE SET
|
||||||
|
city=excluded.city, state=excluded.state,
|
||||||
|
updated_at=CURRENT_TIMESTAMP
|
||||||
|
`);
|
||||||
|
|
||||||
|
for (const record of records) {
|
||||||
|
stmt.run([record.zip, record.city, record.state, record.county,
|
||||||
|
record.lat, record.lon, record.timezone, record.type]);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
The API is live on RapidAPI with a free tier: [RAPIDAPI_ZIP_URL]
|
||||||
|
|
||||||
|
Happy to answer questions about SQLite performance, the seed pipeline, or the Kubernetes/Flux deployment.
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. Indie Hackers Milestone Post [DRAFT]
|
||||||
|
|
||||||
|
**Title:**
|
||||||
|
```
|
||||||
|
Launched 3 data APIs on RapidAPI: $0 MRR, targeting $100/mo in 90 days
|
||||||
|
```
|
||||||
|
|
||||||
|
**Body:**
|
||||||
|
```
|
||||||
|
### What I built
|
||||||
|
|
||||||
|
Three utility APIs backed entirely by free public-domain data:
|
||||||
|
|
||||||
|
- **ZIP Code Enrichment** — city/state/county/timezone/coordinates from any US ZIP ([RAPIDAPI_ZIP_URL])
|
||||||
|
- **Public Holidays** — official holidays for 90+ countries + year ([RAPIDAPI_HOLIDAYS_URL])
|
||||||
|
- **Air Quality Index** — current + historical AQI by city or coordinates ([RAPIDAPI_AQI_URL])
|
||||||
|
|
||||||
|
### Revenue: $0 → targeting $100/mo
|
||||||
|
|
||||||
|
The $100/mo target is ~12 Basic subscribers ($9/mo) across all three APIs after RapidAPI's 25% cut. Stretch: 4 Pro subscribers ($19/mo each).
|
||||||
|
|
||||||
|
### Stack
|
||||||
|
|
||||||
|
- **API servers:** Fastify (Node.js) + SQLite for data cache
|
||||||
|
- **Infrastructure:** Talos Linux Kubernetes cluster (self-hosted, single-node)
|
||||||
|
- **GitOps:** Flux CD — everything is declared in YAML, zero manual kubectl
|
||||||
|
- **Observability:** Prometheus + Grafana, Gatus status page at status.leeworks.dev
|
||||||
|
- **Data sources:** USPS/Census (ZIP), Nager.Date (Holidays), OpenAQ (AQI) — all public domain, $0 licensing cost
|
||||||
|
|
||||||
|
### What I learned
|
||||||
|
|
||||||
|
1. **GitOps is excellent for solo projects.** Flux means my cluster is always in sync with git. I've done zero manual deploys.
|
||||||
|
2. **SQLite is underrated for read-heavy APIs.** Sub-5ms query times for cached lookups, zero infrastructure overhead vs PostgreSQL.
|
||||||
|
3. **Public-domain data has a moat.** Anyone can build this, but most people don't bother. The data is stable, legal, and free forever.
|
||||||
|
4. **Kubernetes is overkill — and that's fine.** I did it to learn. I now know Talos, Flux, cert-manager, ingress-nginx, Prometheus, Grafana from first principles.
|
||||||
|
|
||||||
|
### What's next
|
||||||
|
|
||||||
|
- Monitor first 30 days for subscriber growth
|
||||||
|
- Build VIN Decoder as API #4 (NHTSA vPIC data, also public domain)
|
||||||
|
- Add batch endpoints to ZIP and Holidays
|
||||||
|
|
||||||
|
Would love feedback on pricing — is $9/mo entry too high or too low for a utility API with a free tier?
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. Product Hunt Listing [DRAFT]
|
||||||
|
|
||||||
|
### Tagline (60 chars max)
|
||||||
|
```
|
||||||
|
3 utility APIs on public data — ZIP, Holidays, Air Quality
|
||||||
|
```
|
||||||
|
*(58 characters ✓)*
|
||||||
|
|
||||||
|
### Description (260 chars max)
|
||||||
|
```
|
||||||
|
Look up ZIP codes, public holidays for 90+ countries, and air quality index data — all via clean REST APIs backed by free government datasets. Free tier included. No API keys to generate — available on RapidAPI.
|
||||||
|
```
|
||||||
|
*(211 characters ✓)*
|
||||||
|
|
||||||
|
### First Comment (Maker Note)
|
||||||
|
```
|
||||||
|
Hey Product Hunt! 👋
|
||||||
|
|
||||||
|
I'm the developer behind leeworks.dev — three utility APIs I've been building over the past few months:
|
||||||
|
|
||||||
|
**ZIP Code Enrichment** [RAPIDAPI_ZIP_URL]
|
||||||
|
Turn any US ZIP code into city, state, county, timezone, area codes, and GPS coordinates. 43,000+ ZIP codes, refreshed monthly from USPS/Census Bureau public data.
|
||||||
|
|
||||||
|
**Public Holidays API** [RAPIDAPI_HOLIDAYS_URL]
|
||||||
|
Query official public holidays for any country and year. 90+ countries, ISO 3166 codes, backed by government calendar data. Great for payroll software, scheduling tools, and calendar apps.
|
||||||
|
|
||||||
|
**Air Quality Index API** [RAPIDAPI_AQI_URL]
|
||||||
|
Current and historical AQI readings by city or coordinates. PM2.5, PM10, O3, NO2, SO2, CO — backed by the OpenAQ public dataset covering thousands of monitoring stations worldwide.
|
||||||
|
|
||||||
|
**What makes these different:**
|
||||||
|
- All data is 100% public domain — no licensing fees, no terms restrictions
|
||||||
|
- Free tier (100 req/mo) to try before you buy
|
||||||
|
- Paid plans start at $9/mo for 10,000 requests/month
|
||||||
|
- Running on Kubernetes with Prometheus monitoring and a public status page at status.leeworks.dev
|
||||||
|
|
||||||
|
Happy to answer questions about the data sources, the tech stack (Fastify + SQLite + Flux GitOps), or the pricing model. Thanks for checking it out!
|
||||||
|
```
|
||||||
|
|
||||||
|
### Gallery / Screenshot URL Placeholders
|
||||||
|
```
|
||||||
|
1. docs-site homepage: https://docs.leeworks.dev (screenshot)
|
||||||
|
2. Grafana dashboard: https://grafana.leeworks.dev (screenshot)
|
||||||
|
3. status.leeworks.dev (screenshot)
|
||||||
|
4. Example API response (ZIP lookup): code screenshot
|
||||||
|
5. RapidAPI listing page: [RAPIDAPI_PROFILE_URL] (screenshot)
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5. Email Waitlist Message [DRAFT]
|
||||||
|
|
||||||
|
**Subject line:**
|
||||||
|
```
|
||||||
|
leeworks.dev APIs are live — here's your free tier access
|
||||||
|
```
|
||||||
|
|
||||||
|
**Body:**
|
||||||
|
```
|
||||||
|
Hi there,
|
||||||
|
|
||||||
|
The three APIs I've been building are now live on RapidAPI. Here's what's available and how to get started:
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**ZIP Code Enrichment API**
|
||||||
|
Turn any US ZIP code into city, state, county, timezone, area codes, and GPS coordinates — in a single API call.
|
||||||
|
→ [RAPIDAPI_ZIP_URL]
|
||||||
|
|
||||||
|
**Public Holidays API**
|
||||||
|
Query official public holidays for any country and year. 90+ countries, ISO 3166 codes.
|
||||||
|
→ [RAPIDAPI_HOLIDAYS_URL]
|
||||||
|
|
||||||
|
**Air Quality Index API**
|
||||||
|
Current and historical AQI by city or coordinates. PM2.5, PM10, O3, NO2, SO2, CO.
|
||||||
|
→ [RAPIDAPI_AQI_URL]
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**How to try for free:**
|
||||||
|
1. Click any link above
|
||||||
|
2. Subscribe to the **Free tier** (100 requests/month, no credit card needed)
|
||||||
|
3. Copy your RapidAPI key from the dashboard
|
||||||
|
4. Make your first request — full docs at https://docs.leeworks.dev
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Quick start (ZIP enrichment):**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
curl "https://zip.leeworks.dev/v1/lookup?zip=90210" \
|
||||||
|
-H "X-RapidAPI-Key: YOUR_KEY" \
|
||||||
|
-H "X-RapidAPI-Host: zip-enrichment.p.rapidapi.com"
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Want more than 100 requests/month?**
|
||||||
|
Paid plans start at $9/mo for 10,000 requests. See the full pricing table on each API's RapidAPI listing page.
|
||||||
|
|
||||||
|
Questions? Reply to this email or open an issue at https://docs.leeworks.dev/support.
|
||||||
|
|
||||||
|
Thanks for your interest,
|
||||||
|
Wyatt
|
||||||
|
leeworks.dev
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
*You're receiving this because you signed up for early access. To unsubscribe, reply with "unsubscribe".*
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Checklist Before Publishing
|
||||||
|
|
||||||
|
Before changing any section from DRAFT to READY:
|
||||||
|
|
||||||
|
- [ ] Issue #44 complete — RapidAPI listing URLs obtained
|
||||||
|
- [ ] Replace all `[RAPIDAPI_ZIP_URL]` placeholders
|
||||||
|
- [ ] Replace all `[RAPIDAPI_HOLIDAYS_URL]` placeholders
|
||||||
|
- [ ] Replace all `[RAPIDAPI_AQI_URL]` placeholders
|
||||||
|
- [ ] Replace all `[RAPIDAPI_PROFILE_URL]` placeholders
|
||||||
|
- [ ] Verify code examples work against live endpoints
|
||||||
|
- [ ] Confirm free tier limit is accurate (currently documented as 100 req/mo)
|
||||||
|
- [ ] Confirm all three APIs pass pre-launch-checklist.md
|
||||||
|
- [ ] Product Hunt gallery screenshots captured
|
||||||
|
- [ ] Email list exported from whatever signup form was used
|
||||||
|
|
||||||
|
Once all items above are checked, update the Status key at the top of this document from DRAFT to READY for each section.
|
||||||
@@ -0,0 +1,98 @@
|
|||||||
|
# Pre-Launch Checklist
|
||||||
|
|
||||||
|
Use this checklist as the final go-live gate — run through every item the day before flipping the public switch. All items must be ✅ before announcing public availability.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Infrastructure
|
||||||
|
|
||||||
|
- [ ] All Flux components `READY=True` (`flux get all`)
|
||||||
|
- [ ] All three API pods Running and READY
|
||||||
|
- [ ] `zip-enrichment` pod `READY=1/1` (`kubectl get pods -n zip-enrichment`)
|
||||||
|
- [ ] `holidays` pod `READY=1/1` (`kubectl get pods -n holidays`)
|
||||||
|
- [ ] `air-quality` pod `READY=1/1` (`kubectl get pods -n air-quality`)
|
||||||
|
- [ ] `docs-site` pod Running and READY (`kubectl get pods -n docs-site`)
|
||||||
|
- [ ] Prometheus scraping all three API services (check Prometheus Targets UI)
|
||||||
|
- [ ] Grafana dashboard accessible at `grafana.leeworks.dev`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## DNS & TLS
|
||||||
|
|
||||||
|
- [ ] `zip.leeworks.dev` → cluster ingress IP (`dig zip.leeworks.dev +short` + `curl -I https://zip.leeworks.dev`)
|
||||||
|
- [ ] `holidays.leeworks.dev` → cluster ingress IP
|
||||||
|
- [ ] `aqi.leeworks.dev` → cluster ingress IP
|
||||||
|
- [ ] `docs.leeworks.dev` → cluster ingress IP
|
||||||
|
- [ ] `status.leeworks.dev` → cluster ingress IP
|
||||||
|
- [ ] `registry.leeworks.dev` → cluster ingress IP
|
||||||
|
- [ ] `grafana.leeworks.dev` → cluster ingress IP
|
||||||
|
- [ ] TLS certificates issued for all 7 subdomains (`kubectl get certificates -A`)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Functional Verification
|
||||||
|
|
||||||
|
- [ ] `GET /health` returns HTTP 200 on **zip-enrichment** (`curl https://zip.leeworks.dev/health`)
|
||||||
|
- [ ] `GET /health` returns HTTP 200 on **holidays** (`curl https://holidays.leeworks.dev/health`)
|
||||||
|
- [ ] `GET /health` returns HTTP 200 on **air-quality** (`curl https://aqi.leeworks.dev/health`)
|
||||||
|
- [ ] `GET /zip/{zip}` returns correct data for a sample ZIP code (e.g. `curl https://zip.leeworks.dev/zip/10001`)
|
||||||
|
- [ ] `GET /holidays/{year}` returns correct data (e.g. `curl https://holidays.leeworks.dev/holidays/2026`)
|
||||||
|
- [ ] `GET /aqi/{city}` returns correct data (e.g. `curl https://aqi.leeworks.dev/aqi/New%20York`)
|
||||||
|
- [ ] Request **without** `X-RapidAPI-Proxy-Secret` returns HTTP 403 on all three APIs
|
||||||
|
- [ ] `docs.leeworks.dev/pricing` loads correctly
|
||||||
|
- [ ] `status.leeworks.dev` shows all three APIs as **UP**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Legal & Monetisation
|
||||||
|
|
||||||
|
- [ ] `docs/legal/terms-of-service.md` committed and reachable at `docs.leeworks.dev/legal/terms-of-service`
|
||||||
|
- [ ] `docs/legal/privacy-policy.md` committed and reachable at `docs.leeworks.dev/legal/privacy-policy`
|
||||||
|
- [ ] `docs/legal/acceptable-use-policy.md` committed and reachable at `docs.leeworks.dev/legal/acceptable-use-policy`
|
||||||
|
- [ ] All three APIs listed on RapidAPI with **Free + 3 paid tiers** (leeworks-agents/api-company#44)
|
||||||
|
- [ ] PayPal linked to RapidAPI (leeworks-agents/api-company#19)
|
||||||
|
- [ ] `rapidapi-proxy-secret` updated with **real** RapidAPI values in all 3 namespaces (leeworks-agents/api-company#81)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Post-Launch
|
||||||
|
|
||||||
|
- [ ] Alert channel confirmed — Slack webhook active (leeworks-agents/api-company#73)
|
||||||
|
- [ ] Grafana alert rules firing correctly on synthetic test downtime
|
||||||
|
- [ ] First STATUS.md post-launch update committed
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Quick Commands Reference
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Flux overview
|
||||||
|
flux get all
|
||||||
|
|
||||||
|
# Check API pod health
|
||||||
|
for ns in zip-enrichment holidays air-quality docs-site; do
|
||||||
|
echo "=== $ns ==="
|
||||||
|
kubectl get pods -n $ns
|
||||||
|
done
|
||||||
|
|
||||||
|
# Verify TLS certs
|
||||||
|
kubectl get certificates -A
|
||||||
|
|
||||||
|
# Check all 7 DNS subdomains
|
||||||
|
for sub in zip holidays aqi docs status registry grafana; do
|
||||||
|
echo "$sub.leeworks.dev -> $(dig $sub.leeworks.dev +short)"
|
||||||
|
done
|
||||||
|
|
||||||
|
# Smoke test health endpoints
|
||||||
|
for svc in "zip.leeworks.dev/health" "holidays.leeworks.dev/health" "aqi.leeworks.dev/health"; do
|
||||||
|
echo "$svc: $(curl -s -o /dev/null -w '%{http_code}' https://$svc)"
|
||||||
|
done
|
||||||
|
|
||||||
|
# Verify 403 on missing proxy secret
|
||||||
|
curl -s -o /dev/null -w "%{http_code}" https://zip.leeworks.dev/zip/10001
|
||||||
|
# Expected: 403
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
_References: ROADMAP.md §Phase 6; leeworks-agents/api-company#33, #44, #19, #81, #73, #7, #8, #18_
|
||||||
Reference in New Issue
Block a user