Deploy Solidtime
Open source time tracking for freelancers and agencies
Redis
Just deployed
/data
gotenberg
Just deployed
Just deployed
/var/lib/postgresql/data
Just deployed
mailpit
Just deployed
/data
solidtime
Just deployed
/var/www/html/storage/app/public
scheduler
Just deployed
solidtime-files
Bucket
Just deployed
Deploy and Host solidtime on Railway
solidtime is a modern open-source time tracker for freelancers and agencies who need to know exactly where billable hours went. It covers time entries, projects, tasks, clients, billable rates, multiple organizations under one login, roles and permissions, and reporting exported as CSV or PDF. It is a Laravel 12 app with a Vue/Inertia front end on FrankenPHP and Laravel Octane, licensed AGPL-3.0, with a REST API, a desktop app and browser extensions. Self-host solidtime and every timestamp, client name and rate stays on infrastructure you control.
Deploy solidtime on Railway and you get the full production topology, not one container. solidtime is the public web service on port 8000, worker runs the Laravel queue worker, scheduler runs recurring jobs under supercronic, gotenberg renders report PDFs, and mailpit captures outgoing mail so invitations and password resets are readable straight away. Managed Postgres holds the schema, sessions and job queue; managed Redis holds the cache. A solidtime-files bucket stores exports and imports, and a volume keeps profile photos. Only the web app and the inbox face the internet.

Getting Started with solidtime on Railway
Set ADMIN_EMAIL, ADMIN_PASSWORD and ADMIN_NAME before deploying — the first administrator is created from those values on first boot, so there is no default password and no open installer to race. When the deploy is green, sign in at /login; migrations, encryption and OAuth keys, and the Passport clients behind the desktop app, extensions and API tokens are all created then. Add a client, then a project with a billable rate, and start a timer — an entry still counting after a page reload confirms the database and session store are wired. Invite a teammate from Members: the mail lands in the Mailpit inbox on port 8025 (behind basic auth via MP_UI_AUTH). Then open Reporting, stop the timer and export as PDF, which exercises the worker, Gotenberg and the bucket in one action. Registration defaults to invite-only (APP_ENABLE_REGISTRATION) and is enforced server-side, so the URL is not an open signup; SUPER_ADMINS grants the /admin panel.

About Hosting solidtime
Hosted trackers charge per seat and keep your client list, rates and hours on someone else's servers. Self-hosted solidtime removes both: the AGPL-3.0 core is free for any number of users and the data sits in your own Postgres. Teams run it for data residency, client confidentiality, or to stop paying per seat.
- Live timer, manual entry and bulk editing of time entries
- Projects, tasks and clients with per-project and per-member billable rates
- Reporting with grouping and filtering, exported to CSV, PDF, XLSX or ODS
- Imports from Toggl, Clockify and generic CSV
- A documented REST API, a desktop app and browser extensions
solidtime is a queue-backed Laravel app, which is why the template is more than one box: Octane answers requests, the worker drains jobs such as exports and mail, and the scheduler fires Laravel's recurring tasks each minute.
Why Deploy solidtime on Railway
Railway removes the server work self-hosting a Laravel stack usually means.
- Postgres, Redis and object storage provisioned and wired automatically
- Private networking between web, worker, scheduler, Gotenberg and Mailpit
- HTTPS on a public domain, no reverse proxy to configure
- A volume for uploads and a bucket for exports
Common Use Cases
- Agency billing — hours per client and project at the right rate, exported as a PDF or CSV report to attach to an invoice.
- Freelance time tracking — a single-user instance with the desktop app and browser extension, replacing a paid Toggl seat.
- Migrating off a SaaS tracker — import history from Toggl or Clockify and keep the archive yourself.
Dependencies for solidtime
solidtime/solidtime:latest— the app image, run in three roles set byCONTAINER_MODE(http,worker,scheduler)gotenberg/gotenberg:8— headless Chromium rendering report PDFs on port 3000axllent/mailpit:latest— SMTP on 1025 with a web inbox on 8025- Railway managed PostgreSQL — schema, sessions and job queue; Redis — cache and the shared migration lock
- Railway object storage (
solidtime-files) — private disk for exports and imports
Environment Variables Reference
| Variable | Purpose |
|---|---|
ADMIN_EMAIL / ADMIN_PASSWORD / ADMIN_NAME | First administrator, created on first boot |
APP_URL | Public HTTPS URL, also used for mail links |
APP_ENABLE_REGISTRATION | on, invite-only or off; defaults to invite-only |
DB_* / REDIS_URL | PostgreSQL connection details and the cache URL |
QUEUE_CONNECTION / SESSION_DRIVER | Both database, so jobs and sessions survive redeploys |
FILESYSTEM_DISK / S3_* / MAIL_* | Bucket credentials and SMTP settings |
GOTENBERG_URL | Private URL of the PDF renderer |
APP_KEY, PASSPORT_*_KEY | Optional overrides; generated automatically if left blank |
Deployment Dependencies
- Source repository: github.com/solidtime-io/solidtime
- Docker image: hub.docker.com/r/solidtime/solidtime
- Docs: docs.solidtime.io/self-hosting/intro
- Runtime: PHP 8.3 (FrankenPHP / Octane), PostgreSQL 14+, Redis 6+
Hardware Requirements for Self-Hosting solidtime
| Resource | Minimum | Recommended |
|---|---|---|
| CPU | 1 vCPU | 2 vCPU |
| RAM | 1 GB across all services | 2–4 GB for 25+ users |
| Storage | 1 GB volume plus database | 5 GB volume, 10 GB database |
| Runtime | PHP 8.3, PostgreSQL 14, Redis 6 | Same, plus Gotenberg for PDF export |
Gotenberg is the memory-hungry piece — it drives headless Chromium.
Self-Hosting solidtime with Docker
Upstream publishes one image that runs in three roles. A minimal Compose file for a local trial:
services:
solidtime:
image: solidtime/solidtime:latest
ports: ["8000:8000"]
environment:
CONTAINER_MODE: http
APP_URL: http://localhost:8000
DB_CONNECTION: pgsql
DB_HOST: db
DB_DATABASE: solidtime
DB_USERNAME: solidtime
DB_PASSWORD: change-me
db:
image: postgres:16
environment:
POSTGRES_PASSWORD: change-me
A self-hosted install also needs an app key and a matched Passport RSA keypair. Upstream ships a command that prints all three:
docker run --rm solidtime/solidtime:latest \
php artisan self-host:generate-keys
On Railway they are generated once on first deploy and shared by the web, worker and scheduler services, so you set them by hand only when migrating an instance whose keys must be kept.
How Much Does solidtime Cost to Self-Host?
solidtime's core is AGPL-3.0 and free for unlimited users — there is no per-seat licence on the self-hosted edition. A paid On-Premise Business plan (from €199/year) adds invoicing and a private registry, and the vendor runs a hosted cloud at solidtime.io. Self-hosting on Railway costs infrastructure only, billed on usage.
Troubleshooting Self-Hosted solidtime
A report export returns a 500 while a timer is running. The export reads each entry's end time and a running entry has none. Stop the timer and the same report exports fine.
Mail links point at the wrong host. solidtime rejects requests whose Host is neither APP_URL nor a TRUSTED_HOSTS entry, so a custom domain means updating APP_URL on all three application services.
FAQ
What is solidtime?
An open-source time tracker for freelancers and agencies covering projects, tasks, clients, billable rates, reporting and exports — an AGPL-3.0 alternative to Toggl Track, Clockify and Harvest.
What does this Railway template deploy?
Seven services: the web app, a queue worker, a scheduler, Gotenberg for PDF rendering, Mailpit for outgoing mail, and managed PostgreSQL and Redis, plus an object-storage bucket for exports and a volume for uploads.
Why does the template include PostgreSQL, Redis and a storage bucket?
Postgres stores organizations, time entries and the job queue; Redis backs the cache. The bucket holds generated reports — the worker writes them and the web service serves them through a signed URL, so both need the same store.
How do I create the first user in self-hosted solidtime?
Set ADMIN_EMAIL, ADMIN_PASSWORD and ADMIN_NAME before deploying; the administrator is created on first boot and you sign in at /login. Registration stays invite-only unless you change APP_ENABLE_REGISTRATION.
Can I use the solidtime desktop app and browser extension with a self-hosted instance?
Yes. The OAuth clients they need, including the personal-access client behind user API tokens, are created on first boot — point the app at your public URL and sign in.
Do I need a separate SMTP provider?
Not to start — Mailpit captures every message. For real delivery, repoint the MAIL_* variables at a production SMTP service on all three application services.
Template Content
Redis
redis:8.2gotenberg
gotenberg/gotenberg:8mailpit
axllent/mailpit:latestsolidtime
gridalpha/solidtime-railwayscheduler
gridalpha/solidtime-railwaysolidtime-files
Bucket
