|
|
|
@@ -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.
|