DEV Community

Cover image for Every place has more than one story
Asad Jawed
Asad Jawed

Posted on

Every place has more than one story

Hacktoberfest Open-Source AI Challenge Week 1: Touch Grass Submission 🌿

This is a submission for the Hacktoberfest Open-Source AI Challenge Week 1: Touch Grass

What I Built

Parallel is a map-first storytelling platform for discovering and sharing stories tied to real places. A single location can hold many independent story chapters: history, personal memory, local legend, fiction, and editorial pieces.

Instead of scrolling a feed, you open a map, pick a place near you, and read what people have said about it. Visits are self-reported, so the app records that you went somewhere but never claims to verify it. The goal is to pull people toward the street they are standing on.

It is for people who walk around cities and want more context about what they pass, and for writers and local historians who want to publish sourced stories about specific places.

Demo

Code

Parallel

Every place has more than one story.

Parallel is a map-first storytelling platform for discovering and sharing stories connected to real places. A location can hold many independent story chapters.

Project structure

parallel/
β”œβ”€β”€ apps/
β”‚   β”œβ”€β”€ backend/       # FastAPI API (Python)
β”‚   └── frontend/      # Next.js App Router (TypeScript)
β”œβ”€β”€ docs/guide.md      # Development, configuration, and integration guide
β”œβ”€β”€ .env.example
β”œβ”€β”€ docker-compose.yml # Optional local PostGIS database
└── SETUP.md

Quick start

Prerequisites: Node.js 22+, npm, Python 3.12+, uv, and Git. Docker Desktop is only needed if you run the local PostGIS container.

  1. Copy .env.example to .env and apps/frontend/.env.local.example to apps/frontend/.env.local.
  2. Start the API: in apps/backend, run uv sync --extra dev, uv run alembic upgrade head, then uv run uvicorn app.main:app --reload.
  3. Start the web app: in apps/frontend, run npm install, then npm run dev.
  4. Open http://localhost:3000. The API health…

How I Built It

  • Frontend: Next.js App Router, React, TypeScript, Tailwind CSS, MapLibre GL JS, and TanStack Query.
  • API: FastAPI, Pydantic, and SQLAlchemy 2 (async).
  • Database: Neon PostgreSQL with PostGIS for geography.
  • Media: Neon Object Storage (S3-compatible). Postgres stores object keys and metadata only, never the image or audio bytes.
  • Auth: Neon Auth (managed Better Auth). The API verifies JWTs against the branch JWKS endpoint.

The design rule is that core browsing must keep working when AI, audio, or storage are unavailable. The AI-assisted discovery in the "concierge" feature has a deterministic, grounded fallback that needs no model key. Narration and map tiles are optional and configured through environment variables.

AI model: Gemma4 32B

Why Does Open Innovation Matter?

Open source lets a platform like this run on tools anyone can inspect. The codebase, schema, migrations, and API contract are all public, so a neighbourhood historical society or a local writer can self-host it without a vendor relationship. The map uses OpenFreeMap tiles, which need no key or signup, so a new contributor can run the full stack locally.

Keeping AI optional matters too. Because the deterministic ranking works without a model, the product is not tied to any single closed API, and a story about a place does not depend on a model being available.

Prize Categories

1.Best Use of Render
2.Best Use of Render Gemma
3.Best Use of Eleven Labs
4.Best Use of Sentry

Top comments (0)

Some comments may only be visible to logged-in visitors. Sign in to view all comments.