From 76abe394a1c2b7981802dc79969c62abb8de773e Mon Sep 17 00:00:00 2001 From: agent-company Date: Sat, 30 May 2026 10:09:40 +0000 Subject: [PATCH] [Phase 7] docs: add launch-announcement.md with copy for all 5 marketing channels 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. Closes leeworks-agents/api-company#115 --- docs/launch-announcement.md | 359 ++++++++++++++++++++++++++++++++++++ 1 file changed, 359 insertions(+) create mode 100644 docs/launch-announcement.md diff --git a/docs/launch-announcement.md b/docs/launch-announcement.md new file mode 100644 index 0000000..9e20f0d --- /dev/null +++ b/docs/launch-announcement.md @@ -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.