SmartFind is a multi-agent system for lost-item recovery in public transit.
It combines:
- A conversational intake agent (passenger reports lost items in natural language)
- A matching agent (compares lost reports with found items)
- A predictive analytics agent (identifies routes/stations with frequent losses)
Manual lost-and-found workflows are slow and error-prone. SmartFind modernizes the process with a Go backend, Python AI agents, and a web frontend.
Core goals:
- Collect high-quality lost item reports through guided conversational input
- Improve match accuracy between lost reports and found inventory
- Help transit authorities prioritize hotspots using historical trend analysis
web: Passenger and operator interface (currently scaffolded as a blank starter page)services: Go backend servicesshared: Shared contracts and utilities for Go servicesdocs/flows: Project-specific process and agent flow documentationinfra: Kubernetes + Docker setup for development/production
- Docker
- Go
- Tilt
- Kubernetes (Minikube or Docker Desktop Kubernetes)
- Node.js 20+ (for web app)
Follow these steps in order:
brew install minikube
kubectl config use-context docker-desktop
curl -fsSL https://raw.githubusercontent.com/tilt-dev/tilt/master/scripts/install.sh | bashStart local development:
tilt upCheck resources:
kubectl get podsDeployment workflow details, CI/CD expectations, and rollback commands live in docs/deployment.md.
The Makefile includes migration helpers that read DATABASE_URL from infra/development/k8s/secrets.yaml.
Install the migration CLI if it is not already available:
brew install golang-migrateCreate a new sequential migration:
make migrate-create name=add_users_tableRun all pending migrations:
make migrate-upRoll back the most recent migration:
make migrate-downThe frontend is intentionally reset to a blank page for the new project phase.
Run the web app directly:
cd web
npm install
npm run devUse the service generator:
go run tools/create_service.go -name <service-name>Example:
go run tools/create_service.go -name intakeThis creates:
services/<service-name>-service/cmdservices/<service-name>-service/internal/domainservices/<service-name>-service/internal/serviceservices/<service-name>-service/internal/infrastructure/{events,grpc,repository}services/<service-name>-service/pkg/typesservices/<service-name>-service/README.md
Current project flows are documented under docs/flows:
- Conversational intake flow
- Lost/found matching flow
- Predictive analytics flow
web/src/contracts.ts,web/src/constants.ts, andweb/src/types.tsare now mock examples to guide the real implementation.- Infra Docker definitions are reduced to web-only templates for this project reset.
Follow this workflow for every task:
- Start from updated
mainlocally and create your feature branch:
git checkout main
git pull origin main
git checkout -b feature/<your-feature-name>- Make changes on your local feature branch, commit, and push to your remote feature branch:
git add .
git commit -m "your message"
git push -u origin feature/<your-feature-name>- Open a Pull Request from your remote feature branch to remote
main:
- Source:
feature/<your-feature-name> - Target:
main
- Keep your local branches synced after other PRs are merged:
# Update local main from remote main
git checkout main
git pull origin main
# Bring latest main into your feature branch
git checkout feature/<your-feature-name>
git merge main- If merge/update creates new changes, push again to your own remote feature branch:
git push origin feature/<your-feature-name>Repeat this sync cycle so each developer continuously pulls latest main changes, merges into their local feature branch, and pushes updates to their own remote feature branch.