A full-stack location management application with Google Maps integration, Instagram content enrichment, and AI-powered alt text generation. Built with Bun, Hono (backend), Vite + React (frontend), and Python AI services in a monorepo structure.
- Full-Stack Application: React frontend with Hono API backend
- Location Management: Create and manage locations with Google Maps URLs
- Instagram Integration: Add Instagram embeds to locations with automatic image downloading
- AI Alt Text Generation: Automatic descriptive alt text for uploaded images using Python AI service
- Hierarchical Location System: Organize locations by country → city → neighborhood
- Image Management: Automatically downloads and organizes Instagram images with AI-generated alt text
- SQLite Persistence: Normalized database schema with three tables
- API Proxy: Vite dev server proxies API requests to backend
- Bun runtime installed
# Clone and install
git clone <repo-url>
cd url-util
bun installRun full stack (recommended):
bun run dev # Starts both server and clientRun individually:
# Terminal 1 - Backend (http://localhost:3000)
cd packages/server
bun run dev
# Terminal 2 - Frontend (http://localhost:5173)
cd packages/client
bun run devCreate packages/server/.env:
PORT=3000
GOOGLE_MAPS_API_KEY=your_key_here
RAPID_API_KEY=your_rapid_api_key
ALT_TEXT_API_URL=http://localhost:8000The application includes an optional Python AI service for automatic alt text generation:
# Install Python dependencies
bun run install:python-deps
# Run Python service (port 8000)
bun run dev:python
# Test service connectivity
bun run test:pythonurl-util/
├── packages/
│ ├── server/ # Backend (Bun + Hono)
│ │ ├── src/ # Server source code
│ │ └── data/ # SQLite database & images
│ ├── client/ # Frontend (Vite + React)
│ │ └── src/ # React application
│ ├── shared/ # Shared types & utilities
│ └── python-alt-text/ # Python AI alt text service
├── turbo.json # Turborepo config
└── package.json # Workspace root
GET /api/locations- List all locations with filtersPOST /api/add-maps- Create location from Google MapsPATCH /api/maps/:id- Update locationPOST /api/add-instagram/:id- Add Instagram embedPOST /api/add-upload/:id- Upload imagesGET /api/images/*- Serve uploaded/downloaded imagesGET /api/location-hierarchy- Get location hierarchy
- locations - Main location table (name, address, coordinates, category)
- instagram_embeds - Instagram posts linked to locations
- uploads - Direct image uploads
- location_taxonomy - Hierarchical location data (country|city|neighborhood)
cd packages/server
bun run dev # Start dev server
bun run seed:locations # Seed location hierarchy
bun run test:locations # Run location utils testsBackend:
- Bun runtime
- Hono web framework
- SQLite (bun:sqlite)
- Zod validation
Frontend:
- Vite build tool
- React 19
- TypeScript
- Path aliases (@client/, @shared/)
AI Services:
- Python Flask API
- BLIP image captioning model
- Automatic alt text generation
Monorepo:
- Turborepo for task orchestration
- Bun workspaces
- Shared package for types/utils
- Server runs on port 3000
- Client runs on port 5173 with API proxy
- Python AI service runs on port 8000
- Images stored in
packages/server/data/images/ - Database at
packages/server/data/location.sqlite - Hot reload enabled for both frontend and backend
- AI alt text generation runs asynchronously during uploads
See CLAUDE.md for detailed architecture documentation and development guidelines.