A self-hosted web application for managing business trips, expenses, and travel documentation with powerful integrations.
Travel Manager is a comprehensive solution for organizing business travel from start to finish. Whether you're managing trips for yourself or a team, Travel Manager helps you:
- Plan Events: Track business trips with dates, locations, and companies
- Manage Expenses: Record and categorize all trip-related expenses
- Store Documents: Integrate with Paperless-ngx to automatically link receipts and invoices
- Organize Photos: Connect to Immich to display event photos based on location and date
- Generate Reports: Create detailed Excel expense reports with attachments
- Share Results: Email reports directly to finance teams or clients
Perfect for consultants, sales teams, field engineers, or anyone who travels frequently for work.
- Create events for business trips with dates and locations
- Beautiful cover images from Unsplash or your Immich photo library
- Location autocomplete with city, country, and coordinates
- Breadcrumb navigation and timeline views
- Record expenses with categories, payment types, and currencies
- Link expenses to Paperless documents automatically
- Side-by-side document preview when creating expenses
- Excel report generation with all receipts bundled in ZIP
- Paperless-ngx: Automatic document retrieval and storage
- Immich: Display event photos based on location and time
- Unsplash: Professional cover images for events
- SMTP: Email reports directly from the application
- First-run setup wizard for easy onboarding
- Regional settings with browser auto-detection
- Customizable email templates
- Backup and restore functionality
- Dark-themed sidebar with breadcrumb navigation
The easiest way to get started is with Docker:
-
Generate a secret key:
echo "SECRET_KEY=$(python -c 'import secrets; print(secrets.token_urlsafe(32))')" > .env
-
Start the application:
docker run -d \ --name travel-manager \ -p 8000:8000 \ -v $(pwd)/data:/app/data \ --env-file .env \ ghcr.io/rknall/travelmanager:latest -
Open your browser:
Navigate to http://localhost:8000
You'll see a setup wizard to create your admin account.
-
Create your first company:
After logging in, go to Settings β Companies and add at least one company (your employer or client).
-
Create your first event:
Now you can create events and start tracking expenses!
For a more permanent setup, use Docker Compose:
-
Create a
docker-compose.ymlfile:services: travel-manager: image: ghcr.io/rknall/travelmanager:latest container_name: travel-manager ports: - "8000:8000" volumes: - ./data:/app/data environment: - SECRET_KEY=${SECRET_KEY} restart: unless-stopped
-
Create
.envfile:echo "SECRET_KEY=$(python -c 'import secrets; print(secrets.token_urlsafe(32))')" > .env
-
Start:
docker compose up -d
After initial setup, you can connect external services in Settings β Integrations:
- Paperless-ngx: Link your document management system for automatic expense receipts
- Immich: Connect your photo server to display event photos
- Unsplash: Enable cover image search (requires free API key)
- SMTP: Configure email for sending expense reports
Coming soon: Screenshots of the dashboard, event detail page, and expense tracking.
Backend:
python -m venv .venv
source .venv/bin/activate # On Windows: .venv\Scripts\activate
pip install -e ".[dev]"
uvicorn src.main:app --reloadFrontend (separate terminal):
cd frontend
npm install
npm run devAccess at http://localhost:5173 (frontend) and http://localhost:8000 (backend)
# Set secret key
export SECRET_KEY=$(python -c "import secrets; print(secrets.token_urlsafe(32))")
# Build and run
docker compose up --buildAccess at http://localhost:8000
The application is available as a multi-architecture Docker image supporting linux/amd64 and linux/arm64.
Pull the latest release:
docker pull ghcr.io/rknall/travelmanager:v0.2.0Or use latest tag:
docker pull ghcr.io/rknall/travelmanager:latest| Variable | Required | Default | Description |
|---|---|---|---|
SECRET_KEY |
β Yes | - | Encryption key (min 32 chars) |
DATABASE_URL |
β No | SQLite | Database connection string |
Note: Only
SECRET_KEYis required. All other configuration (integrations, SMTP, etc.) is managed through the web UI.
For production use with PostgreSQL:
docker compose -f docker-compose.prod.yml up -dUpdate .env to include:
SECRET_KEY=your-secret-key
DATABASE_URL=postgresql://user:password@postgres:5432/travelmanager
From running container:
./scripts/docker-backup.sh travel-manager ./backupsOr via UI:
Go to Settings β Backup/Restore and click "Download Backup"
./scripts/restore.sh ./backups/travel_manager_backup_YYYYMMDD_HHMMSS.tar.gzBackups include:
- SQLite database
- User avatars
- All configuration
Database migrations run automatically on container startup. No manual intervention needed!
Development (SQLite):
rm -f data/travel_manager.db
source .venv/bin/activate
alembic upgrade headDocker:
docker compose down
rm -rf data/
docker compose upAfter reset, visit the application to run through the setup wizard again.
- Release Notes - Full changelog
- Development Guide - Architecture and development instructions
Found a bug or have a feature request? Please open an issue.
This project is licensed under the GNU General Public License v2.0 only (GPL-2.0-only).
See LICENSE for the full license text.
SPDX-License-Identifier: GPL-2.0-only
Made with β€οΈ for business travelers