Every military car deal,in one place.
New factory orders, tax-free OCONUS pricing, diplomatic plates, and used inventory from every dealer near Caserma Ederle. Filter by program, pickup, or fit.
10-tab car hunt.
The fine print
that makes overseas worth it.
Manufacturer programs for active-duty US military and diplomatic buyers — factory pickups, tax-free pricing, US-port shipping. Only the programs with live inventory in this index appear below; more are added as we onboard their dealers. Always verify eligibility and current terms on the dealer's site before purchase.
Sell your car
to your neighbors.
Post your own vehicle directly to the Vicenza military community — no dealer markup. Verified .mil sign-in required to post. Coming soon.
Every dealer,
one index.
Only sources we actually ingest are shown below. Status badges mark live scrapes (live) versus partner-only / unverified channels.
What's running,
what's coming next.
The honest read on what you're looking at versus what shipping to soldiers actually requires.
Current state · v0.2
What you're looking at is a single-file webapp with the full UI, filters, program encyclopedia, and source catalog. Listings are representative samples drawn from public data on each source as of build date — enough to validate the search experience, filter logic, and visual design.
The app cannot do live scraping from the browser due to CORS — most dealer sites block cross-origin requests. That's a backend job.
Production stack
| Layer | Stack |
|---|---|
| Scrapers | Python · Playwright · cron |
| Storage | Postgres · S3 photos |
| API | FastAPI · Redis cache |
| Frontend | This UI · wired to /api |
| Hosting | Hetzner EU · Cloudflare |
Scraper shape
# sources/patriot_autos.py from playwright.async_api import async_playwright from .schema import Listing, Source SOURCE = Source( id="patriot_autos", name="Patriot Military Automobiles", base_url="https://patriot-autos.net", locations=["vicenza", "aviano", "naples", "sigonella"], ) async def scrape(): async with async_playwright() as p: browser = await p.chromium.launch() page = await browser.new_page() await page.goto(f"{SOURCE.base_url}/vehicles/") cards = await page.query_selector_all(".vehicle-card") for card in cards: yield Listing( source=SOURCE.id, source_url=await card.get_attribute("href"), title=await card.inner_text(".title"), price_usd=parse_price(await card.inner_text(".price")), # …year, mileage, location, photo_urls )
Build phases
| Phase | Scope | Effort |
|---|---|---|
| 1 · POC | UI, filters, content | Done |
| 2 · Used scrapers | Patriot, UCG, MAI | ~2 wk |
| 3 · New scrapers | MAS, BMW, Volvo | ~2 wk |
| 4 · Polish | Alerts, PWA, CDN | ~1 wk |
| 5 · Community | P2P, valuations | v2 |
Risk & ethics
- Always link to original. Transaction happens on the source's site. Aggregator value is discovery, not capture.
- Respect robots.txt and dealer ToS. Blocked sources fall back to "link-only" entries.
- Drive dealers traffic, don't compete. Visible attribution defuses cease-and-desists.
- No PII, no unit info. CAC-domain email is the only gate for saved searches.
Operations & analytics.
Internal view. Traffic, source health, roadmap — all in one place.
Daily activity · last 7 days
| Day | Events | Sessions |
|---|
Top searches · 7d
| Query | Count |
|---|---|
| No data yet — searches will appear here. | |
Modal opens by source · 7d
| Source | Opens |
|---|---|
| No data yet. | |
Dealer-click throughs · 7d
| Source | Clicks |
|---|---|
| No data yet. | |
Scrapers, live.
Next up.
Where we are
4 scrapers ingesting ~580 listings: Patriot Autos (WP REST), Used Car Guys (list + per-detail enrichment), Capitol Motors (Volvo Military Sales), Military Autos Italy (list + per-detail enrichment).
SQLite store, FastAPI layer, single-file frontend with photos and click-through to dealer sites. Body inference table covers 99.8% of listings.
Production stack
| Scrapers | Python · requests · BS4 · launchd/cron |
| Storage | SQLite (hot-link photos for v1) |
| API | FastAPI · CORS open |
| Frontend | Single-file HTML · vanilla JS |
| Analytics | First-party · stored in same SQLite |
Backlog
- VPS deploy + TLS (Hetzner + Caddy)
- DB backup to cheap object store (daily sqlite .backup)
- Image cache to R2/S3 when traffic warrants (~50+ daily users)
- More sources: Charlie's Cars, Military Resale Lot (P2P)
- Bavarian Motor Cars — approach as partner, not scrape
Operating notes
- Scrape cadence: twice daily via launchd / cron at 05:00 + 17:00 local.
- Safety gates: empty-result and >50% drop tripwires both in runner — never deletes inventory on a bad scrape.
- Privacy: first-party analytics only, no third-party trackers, no PII collected.