Skip to content
VibeFather
Join

About this template

Harbor Town Delivery Game is a complete, single-screen browser game rather than a landing page with a 3D decoration. Players steer a small delivery van through a coastal miniature, collect parcels at the depot, and reach six glowing doorways before the shift ends. Tram rails, street signs, a route line, and a live minimap make navigation part of the play, while score, timer, pause, restart, and results states give it a finished game loop.

Kimi-inspired as a broad 3D-game reference, the template uses an original town plan, vehicle, interface, palette, and English copy. Warm low-poly buildings, flat-shaded water, a softly following camera, wheel motion, delivery pulses, and optional synthesized sound keep the scene tactile without downloaded models or image assets. The layout is designed for desktop and portrait mobile play, with keyboard controls, simultaneous multi-touch buttons, clear action prompts, and reduced-motion behavior.

This template suits indie hackers, developers, and designers who want a playable 3D example that can be built as static files. Change the brand, town name, setting, delivery item, or round duration in one content file; the builder rewrites place names, objectives, and scene dressing to fit. An alpine bakery route provides a second content direction without changing the underlying road system or mission logic. The prompt also fixes collision behavior, scoring, route finding, adaptive rendering quality, sound cues, and accessible overlays, so independent builds preserve the same playable structure rather than only a similar screenshot. Everything runs locally with Three.js and TypeScript, with no backend, accounts, tracking, external APIs, or asset-hosting dependency.

The template prompt

The live demo was built from exactly this text — nothing added.

# Harbor Town Delivery Game

Build this website exactly as described below. Replace the [VARIABLES] with your own values; keep everything else.

## Brief
Build [BRAND], a complete single-page 3D browser game set in [TOWN_NAME], an invented [SETTING]. The player drives an original low-poly delivery van, collects [DELIVERY_ITEM] at the depot, and delivers them to six glowing doorways before a [ROUND_SECONDS]-second shift ends. The playable town is the first screen and primary visual anchor, not a marketing hero or a decorative backdrop.

- Audience: Indie hackers, front-end developers, designers, and creative coding learners who want a polished, adaptable Three.js driving game that works with keyboard and touch and ships as static files.
- Goal: Deliver a complete and replayable arcade loop: start shift, drive, follow routes, pick up cargo, deliver to six addresses, manage the countdown, pause or recover, and reach a clear success or timeout result. Keep every control and scene asset local and make the same road and mission system usable with different content values.
- Tone: Cozy, coastal, playful, legible, and gently energetic. Use specific local place names and friendly delivery language, with no combat, pedestrians in danger, fail-shaming, real brands, or references to the inspiration.

## Stack
- Framework: Vite 6 + TypeScript 5
- Styling: Vanilla CSS
- Libraries: three (MIT), lucide (ISC), @fontsource-variable/fredoka (OFL), @fontsource-variable/dm-sans (OFL)
- Build: `npm run build` → static files in `dist/`. No backend, no server code, no external APIs.
- Setup:
  - Scaffold Vite's vanilla TypeScript template with scripts dev=vite, build=tsc && vite build, and preview=vite preview. Do not add React, a physics engine, or a full game engine.
  - Set vite.config base to './', build.outDir to 'dist', build.emptyOutDir to true, and build.sourcemap to false. Enable strict TypeScript checking.
  - Install only three, lucide, @fontsource-variable/fredoka, and @fontsource-variable/dm-sans as runtime dependencies, plus Vite and TypeScript development dependencies. Import Fredoka 600/700, DM Sans 400/500/600/700, and only the Lucide icons actually used.
  - Organize the implementation into src/content.ts, main.ts, scene.ts, driving.ts, missions.ts, minimap.ts, ui.ts, audio.ts, and styles.css. Keep all variable values, place names, instructions, button labels, and mission copy in content.ts; scene and UI modules must read from that file.
  - Use BRAND, TOWN_NAME, SETTING, DELIVERY_ITEM, and ROUND_SECONDS throughout. When values change, rewrite proper nouns, destination names, signs, objectives, and scene dressing to suit the new setting while preserving the road graph, six-job structure, collision dimensions, and UI layout.
  - Parse ROUND_SECONDS as an integer and clamp it to 60–600 for resilient behavior. Derive a stable localStorage key and decorative random seed from BRAND and TOWN_NAME rather than hard-coding either default name.
  - Use one index.html with a WebGL canvas and semantic HTML overlays. No router is needed. Wait for document.fonts.ready before creating any CanvasTexture street signs, set their colorSpace to SRGBColorSpace, and cap texture anisotropy at 4.
  - Seed only decorative placement variations such as shrubs, roof details, and boat bob offsets from TOWN_NAME. Keep roads, mission order, collision shapes, delivery points, and scoring deterministic.

## Variables
- [BRAND] — Delivery company (default: "Copper Quay Couriers"). An invented local delivery service; used in the title, start card, depot, and saved-score key.
- [TOWN_NAME] — Town name (default: "Bellbuoy Bay"). An invented town name used in the start card, signs, and results copy.
- [SETTING] — Setting (default: "harbor town"). The world's theme; change maritime props and destination names when this changes.
- [DELIVERY_ITEM] — Delivery item (default: "parcels"). Lowercase plural cargo noun used in objectives, instructions, and results.
- [ROUND_SECONDS] — Shift duration (default: "180"). Seconds available to complete all six deliveries.
- [CREDIT] — keep a small "Template by VibeFather" link to https://vibefather.ai/t/harbor-town-delivery-game in the footer (default: yes; delete this line to remove it)

The copy under Pages & Sections is written for the default values. If your values differ, rewrite every headline, paragraph, label and image for them — same length, tone and structure. Layout, colors, type and motion stay as described.
Keep all copy, image paths and links in one content file (for example `src/content.ts`), keyed by section, so the content can be swapped later without touching components.

Pro template. The design, sections, motion and assets parts of this prompt are for Pro members. The live demo and DESIGN.md stay free.

Join Pro early access →

DESIGN.md

The design system on its own — colors, type, spacing and motion. Apply this look to a project you already have.

---
name: "Harbor Town Delivery Game"
colors:
  harbor_ink: "#173647"
  deep_water: "#397F8C"
  shallow_water: "#69ADB0"
  mist: "#C7E4DF"
  sail_cloth: "#FFF8E8"
  warm_stone: "#D7C5A5"
  roof_coral: "#DF755C"
  parcel_gold: "#F5BE55"
  garden_green: "#668C68"
  timer_alert: "#C94B45"
typography:
  game_title_place_names_score_and_large_results: { family: "Fredoka Variable", weights: [600, 700] }
  hud_labels_instructions_buttons_and_body_copy: { family: "DM Sans Variable", weights: [400, 500, 600, 700] }
spacing: "Use a 4 px base unit. Desktop HUD outer gutters are 20 px and panel gaps 12 px; mobile gutters are 10 px and gaps 8 px. Panel padding is 14–18 px, buttons are at least 48 px high, and coarse-pointer controls are at least 64 px. Respect safe-area insets and keep the central driving view unobstructed."
radius: "Use 16 px for HUD and minimap panels, 14 px for modal cards, 12 px for buttons, and fully rounded small badges. The 3D world uses crisp faceted geometry rather than rounded UI-like forms; only the van body gets modest bevels."
---

# Harbor Town Delivery Game — Design System

Apply this design system to an existing project. It describes the look and feel only; for the full site, use prompt.md.

## Colors
- **Harbor ink** `#173647` — Top HUD, primary text on pale panels, van tires, and dark UI controls
- **Deep water** `#397F8C` — Main sea plane and minimap water
- **Shallow water** `#69ADB0` — Low-poly water facets, harbor shallows, and pickup markers
- **Mist** `#C7E4DF` — Sky, scene fog, and pale blue UI accents
- **Sail cloth** `#FFF8E8` — HUD cards, modal surfaces, lane marks, and light text on Harbor ink
- **Warm stone** `#D7C5A5` — Island ground, curbs, and dock timbers
- **Roof coral** `#DF755C` — Selected roofs, van cargo box, and primary start button
- **Parcel gold** `#F5BE55` — Delivery-door glow, active route, score highlights, and action button
- **Garden green** `#668C68` — Trees, shrubs, grassy plots, and success accents
- **Timer alert** `#C94B45` — Final 30-second timer state and timeout messaging, always paired with text

## Typography
- **Game title, place names, score, and large results** — Fredoka Variable (OFL), weights 600/700. Self-host the font files.
- **HUD labels, instructions, buttons, and body copy** — DM Sans Variable (OFL), weights 400/500/600/700. Self-host the font files.

## Spacing & shape
- Spacing: Use a 4 px base unit. Desktop HUD outer gutters are 20 px and panel gaps 12 px; mobile gutters are 10 px and gaps 8 px. Panel padding is 14–18 px, buttons are at least 48 px high, and coarse-pointer controls are at least 64 px. Respect safe-area insets and keep the central driving view unobstructed.
- Radius: Use 16 px for HUD and minimap panels, 14 px for modal cards, 12 px for buttons, and fully rounded small badges. The 3D world uses crisp faceted geometry rather than rounded UI-like forms; only the van body gets modest bevels.

## Motion
- Run gameplay with a fixed 1/60-second simulation step and capped frame delta. Rotate wheels with actual speed, steer front wheels visually, lean the cargo body up to 4 degrees into turns, and add only a tiny suspension settle after collisions; never use camera shake.
- Damp the follow camera with frame-rate-independent exponential smoothing. Keep the van framed just below center and look 4 world units ahead so corners remain readable.
- Animate low-poly water facets, tiny foam strips, flags, and boats subtly. Pickup and destination rings breathe between 1.0 and 1.08 scale over 1.4 seconds; delivery confetti uses 18 small paper rectangles for 700 ms.
- Use 160–240 ms fades and 8 px translations for panels and toasts. During the final 30 seconds, change the timer label and color and pulse it gently once per second rather than flashing the whole screen.
- With prefers-reduced-motion, stop decorative water, flags, boats, idle pulses, camera bob, and confetti; use instant panel changes and static route markers. Essential vehicle and camera movement remains direct and restrained because it is required to play.

## Imagery
Create every visible world element from original Three.js primitives, extruded shapes, and BufferGeometry: the van, island, roads, tram rails, houses, depot, lighthouse-like harbor beacon, piers, boats, shrubs, signs, and markers. Use flat shading, visible low-poly facets, soft shadows, and a warm morning light setup. No photographs, downloaded models, HDRIs, image textures, recognizable landmarks, vehicle designs, characters, or logos. The live 3D scene itself is the visual anchor; the minimap and street signs are drawn locally on canvas.

## Tone
Cozy, coastal, playful, legible, and gently energetic. Use specific local place names and friendly delivery language, with no combat, pedestrians in danger, fail-shaming, real brands, or references to the inspiration.

---
Inspired by Harbor Town Delivery Game — https://www.kimi.com/showcases/3dmake
— Prompt by VibeFather · https://vibefather.ai/t/harbor-town-delivery-game · CC BY-NC 4.0 (non-commercial; commercial use needs a VibeFather Pro license) · Request removal: https://vibefather.ai/takedown