---
title: "Deploy Solidtime"
description: "Open source time tracking for freelancers and agencies"
category: "Other"
url: https://railway.com/deploy/solidtime-1
---

# Deploy Solidtime

Open source time tracking for freelancers and agencies

**[Deploy Solidtime on Railway](https://railway.com/template/solidtime-1)**

Machine-readable deploy manifest (JSON, validated by TemplateCI): https://railway.com/deploy/solidtime-1/manifest.json

- **Creator:** A3A
- **Category:** Other
- **Total deploys:** 1

## Template content

### Redis https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/redis.svg

- **Image:** redis:8.2
- **Start command:** `/bin/sh -c "rm -rf $RAILWAY_VOLUME_MOUNT_PATH/lost+found/ && exec docker-entrypoint.sh redis-server --requirepass $REDIS_PASSWORD --save 60 1 --dir $RAILWAY_VOLUME_MOUNT_PATH"`

### gotenberg https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/png/gotenberg.png

- **Image:** gotenberg/gotenberg:8
- **Health check:** /health

### Postgres https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/postgresql.svg

- **Image:** ghcr.io/railwayapp-templates/postgres-ssl:18

### worker https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/solidtime.svg

- **Source:** https://github.com/gridalpha/solidtime-railway
- **Health check:** /

### mailpit https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/mailpit.svg

- **Image:** axllent/mailpit:latest
- **Health check:** /livez
- **Public domain:** Yes

### solidtime https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/solidtime.svg

- **Source:** https://github.com/gridalpha/solidtime-railway
- **Health check:** /login
- **Public domain:** Yes

### scheduler https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/solidtime.svg

- **Source:** https://github.com/gridalpha/solidtime-railway
- **Health check:** /

## Buckets

- **solidtime-files**

## Documentation

# 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.

![Railway services behind solidtime, from web tier to Postgres](https://res.cloudinary.com/rroe4rtk/image/upload/v1788408435/solidtime-architecture.png)

## 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.

![solidtime time tracker with a running timer and daily entries](https://res.cloudinary.com/rroe4rtk/image/upload/v1788408437/solidtime-time-tracker.png)
![solidtime reporting overview charting billable hours per project](https://res.cloudinary.com/rroe4rtk/image/upload/v1788408438/solidtime-reporting-overview.png)
![solidtime projects list with clients, rates and progress](https://res.cloudinary.com/rroe4rtk/image/upload/v1788408440/solidtime-projects.png)

## 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 by `CONTAINER_MODE` (`http`, `worker`, `scheduler`)
- `gotenberg/gotenberg:8` — headless Chromium rendering report PDFs on port 3000
- `axllent/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](https://github.com/solidtime-io/solidtime)
- Docker image: [hub.docker.com/r/solidtime/solidtime](https://hub.docker.com/r/solidtime/solidtime)
- Docs: [docs.solidtime.io/self-hosting/intro](https://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.



## Similar templates

- [Rocky Linux](https://railway.com/deploy/rocky-linux) — Hosted Rocky Linux 9 workspace with SSH and persistent storage. 🚀
- [Foundry Virtual Tabletop](https://railway.com/deploy/X5tR6G) — A Self-Hosted & Modern Roleplaying Platform
- [Letta Code Remote](https://railway.com/deploy/letta-code-remote) — Run a Letta Code agent 24/7. No inbound ports, just deploy.

Open this page in a browser: https://railway.com/deploy/solidtime-1
