Single-operator food delivery. You (Ken) are the only driver. Customers order on the site, pay online, and every order comes straight to you. You pick up the food, drop it at the door, and keep the delivery fee on every order.
app.py— the whole backend (FastAPI) + APIstatic/— the customer site and your operator dashboard (plain HTML/JS, phone-first)drop.db— the real database (SQLite). Every order, menu change, and setting lives here.venv/— Python environment with everything installed
cd ~/workspace/drop
./venv/bin/uvicorn app:app --host 0.0.0.0 --port 8000Then open:
- Customers:
http://localhost:8000/ - Your operator dashboard:
http://localhost:8000/dash(PIN:1234— change it in Settings)
Right now the app is in TEST MODE — payments are simulated with a "TEST PAY"
button so the whole order flow works without real money. No fake data: orders,
settings, and earnings are all really saved in drop.db.
To take real money:
- Make a free Stripe account at https://stripe.com (no card needed to start).
- In the Stripe dashboard, go to Developers → API keys and copy:
- Publishable key (starts with
pk_test_...) - Secret key (starts with
sk_test_...)
- Publishable key (starts with
- Start the app with your keys:
The test-pay button disappears automatically and customers go through real Stripe checkout (you can use Stripe's test card
STRIPE_SECRET_KEY='sk_test_...' STRIPE_PUBLISHABLE_KEY='pk_test_...' \ ./venv/bin/uvicorn app:app --host 0.0.0.0 --port 8000
4242 4242 4242 4242while the keys start withsk_test_— still no real money). - When you're ready for real dollars, flip the same keys to the live
versions (
pk_live_.../sk_live_...) in the Stripe dashboard.
Never put keys in chat, screenshots, or this README. They stay in your terminal command only.
- Install the free ntfy app on your phone (iOS App Store / Google Play).
- In the app, tap + Subscribe and type a secret topic name only you know,
e.g.
drop-ken-orders-xyz123. - Open your Drop dashboard → Settings → paste the same topic name → Save.
- Every paid order will buzz your phone instantly. The dashboard also beeps and flashes a banner when it's open.
- See every order live (customer name, phone, address, notes, items, payout)
- Tap buttons to move an order: Confirmed → Picked up → On the way → Delivered
- Earnings: total delivery fees collected + per-day breakdown
- Settings: delivery fee (default $3.99), your PIN, ntfy topic
- Menu: add/edit/delete restaurants and menu items, mark open/closed
The 4 restaurants in there now (burger joint, soul food, Mexican, pizza) are samples — replace them with your real local spots in the Menu tab.
Free options (pick one):
Render (easiest)
- Push this folder to a GitHub repo.
- Go to https://render.com → New → Web Service → connect the repo.
- Build command:
pip install -r requirements.txtStart command:uvicorn app:app --host 0.0.0.0 --port $PORT - Add environment variables
STRIPE_SECRET_KEY/STRIPE_PUBLISHABLE_KEY. - Render gives you a public URL like
https://drop-xxxx.onrender.com.
Railway — same idea: https://railway.app → New Project → deploy from repo, same build/start commands, add the Stripe env vars.
15 minutes of no traffic, and on Render's free plan there is no persistent disk — the SQLite file is wiped every time the service wakes up or redeploys, so orders placed today would be gone tomorrow. For real orders you need at least Render's Starter plan ($7/month) with a disk mounted at the app folder, or switch DROP_DB to a managed Postgres. (Free tier is fine for testing the checkout flow — just not for real orders.) Ask and I can wire that up.
- Stripe account made, live keys added as env vars
- Delivery fee set (Settings tab) — $3.99 default
- PIN changed from 1234 (Settings tab)
- ntfy app installed + topic subscribed + saved in Settings
- Sample restaurants replaced with real ones (Menu tab)
- Decide your delivery zone (which neighborhoods/towns you'll serve — put it on the home page tagline in Settings)
- Test order placed with a real $1 Stripe test payment, tracked, delivered
Home → pick restaurant → add food to cart → checkout (name, phone, address) → pay with Stripe → confirmation + tracking link → live status updates as you tap the buttons on your dashboard.