My Maps is a personal mapping project built to keep track of places worth remembering.
The core idea is simple: create maps, add markers, enrich them with notes, categories, links, and media, and keep a personal memory of places you do not want to forget. I originally built it as a practical tool, but also as a playground to explore product ideas, domain-driven organization, and a clear separation between frontend and backend responsibilities.
This project is no longer maintained.
It is an older codebase, and some technical choices are now outdated. I am open sourcing it anyway because there may still be useful ideas inside: architecture experiments, project organization, testing strategies, or just small implementation details that can help other people learn from it.
- Status: archived / not maintained
- Expect outdated dependencies and conventions
- Expect rough edges and historical choices I would probably not make the same way today
- Shared for learning purposes, not as a production-ready foundation
The application lets users:
- create and browse maps
- add markers to a map
- describe places with text, links, categories, and images
- manage map-related assets in a gallery
- share map access through dedicated routes
- manage cartographers and marker categories through admin screens
- Frontend: React 18, TypeScript, Material UI, React Router, Mapbox-related libraries
- Backend: PHP 8, Symfony 5.4
- Database: PostgreSQL 11
- Async processing: Symfony Messenger with a dedicated consumer
- Local infrastructure: Docker Compose, Traefik, Mailhog, Adminer, MinIO
- Testing: React Testing Library, PHPUnit ecosystem tools, PhpSpec, Behat, Cypress experiments
The project was designed to run through Docker.
- Docker
- Docker Compose
- Make
make app-devThis target does the following:
- starts the development stack
- installs frontend and backend dependencies
- recreates the database
- restores data from
dump.sql - starts the Symfony message consumer
After startup, the main entry points are:
- App:
http://localhost - Mailhog:
http://mailer.localhost - Adminer:
http://adminer.localhost - MinIO console:
http://storage.localhost - Traefik dashboard:
http://localhost:8080
The default make app-dev workflow restores the database from the repository-level dump.sql file.
If you want to start the containers without restoring the database, use:
make up-dev
make dependenciesThen you can decide whether to run:
make db
make db-migrationor:
make db-restoredepending on the setup you want.
make up-dev # start the development stack
make down-dev # stop and remove development containers/volumes
make dependencies # install frontend and backend dependencies
make db # recreate the database
make db-migration # run doctrine migrations
make db-restore # restore the database from dump.sql
make web-tests # run frontend lint + unit tests
make api-tests # run backend lint + specs + behat suites
make critical-use-case # run Cypress-based end-to-end scenariosThe repository is split into a few major parts:
web/: React frontendapi/: Symfony backenddocker/: Dockerfiles and infrastructure configcritical-use-cases/: Cypress-based end-to-end experimentsdump.sql: database snapshot used by the local bootstrap flowMakefile: main developer entry point
The frontend is mostly organized by business capability instead of by technical layer alone.
web/src/application/: app bootstrap, auth, i18n, shared application-level concernsweb/src/cartography/: the main product areaweb/src/cartography/map-board/: map browsing, map editing, marker interactions, gallery flowsweb/src/cartography/admin/: admin screens for cartographers and marker categoriesweb/src/identity/: login, account creation, password reset flows
This structure reflects a choice I liked at the time: grouping UI, services, tests, and domain concepts close to the feature they belong to.
The backend follows a more explicit domain/application/infrastructure split.
api/src/Domain/: business concepts and use casesapi/src/Infrastructure/: web controllers, persistence, storage, framework integrationapi/config/: Symfony configurationapi/tests/: specification, integration, and use-case testsapi/features/: Behat feature files
The cartography domain contains the main business logic around maps, markers, galleries, categories, and cartographers. The identity domain handles account-related flows.
A few choices shaped the project:
- Separate frontend and backend applications, each with its own tooling
- Feature-oriented organization on the frontend
- Domain-oriented organization on the backend
- A distinction between command-style write flows and query-style read flows in the API
- Heavy use of Docker so the project could be run with a consistent local environment
- Dedicated test layers to cover UI behavior, domain behavior, and end-to-end scenarios
Some of these choices still make sense to me. Others clearly show the age of the project. That is also part of why I am sharing it: seeing old design decisions in context can still be useful.
I am not planning active maintenance, dependency upgrades, or feature work on this repository.
If you browse this codebase, the best mindset is:
- use it as a reference
- borrow ideas carefully
- validate anything before using it in a modern production project
Because even an old project can still be helpful.
If you are learning how to structure a full-stack app, separate concerns, test business flows, or think about map-based product features, you might still find something interesting here.