Run Tidemark Billing your way.

Use Docker on your own server, or upload a zip to the PHP hosting you already have. Same application either way, free and open source, with your data in a database you control.

Docker image for amd64 and arm64 · or PHP 8.3+ with SQLite, MySQL, MariaDB or PostgreSQL

Docker

For servers, VPSes and homelabs. One container with the scheduler and a queue worker built in.

  1. Save the file

    Name it docker-compose.yml and set APP_URL to the address you will use.

  2. Start it

    Run docker compose up -d.

  3. Create your admin account

    Open /install. To skip the installer, set BILLING_ADMIN_EMAIL and BILLING_ADMIN_PASSWORD instead.

docker-compose.yml
services:
  billing:
    image: ghcr.io/tidemark-apps/billing:latest
    restart: unless-stopped
    ports:
      - "8080:8080"
    volumes:
      - billing-data:/data
    environment:
      APP_URL: https://billing.example.com
volumes:
  billing-data:

PHP hosting

For ordinary shared hosting and cPanel, with no SSH. It needs PHP 8.3+ with common extensions.

  1. Upload the zip

    Unzip the release and point the domain’s document root at the public/ folder. If your host won’t let you, upload it to the web root as it is: a bundled .htaccess forwards requests and blocks internals.

  2. Open /install

    Tidemark Billing checks your server, connects your database (SQLite needs no setup), runs the migrations and creates your admin account.

  3. Add a cron job

    In cPanel, under Cron Jobs, run the scheduler every minute. The billing run, reminders and the ticket mailbox depend on it.

  4. Set up email and payments

    Add your SMTP details under Settings → Email, switch on a payment plugin under Plugins and enter its keys under Settings → Payments.

cron
* * * * * php /home/you/billing/artisan schedule:run >> /dev/null 2>&1

Questions

Should I use Docker or the zip?

Either one gives you the same application. Use Docker if you run a server, a VPS or a homelab: it is one container that starts the scheduler and a queue worker for you, updates are a docker compose pull, and everything that changes lives in one volume. Use the zip if you are on ordinary PHP hosting, where you upload files and add one cron job.

What does it need?

PHP 8.3 or newer with the mbstring, openssl, pdo, fileinfo, ctype, tokenizer, xml, curl, bcmath and zip extensions, and one of pdo_sqlite, pdo_mysql or pdo_pgsql. The intl extension is recommended for currency formatting, and sodium is needed for the License Server plugin. The installer checks all of this for you.

Which database should I pick?

SQLite needs no setup and is a fine start for a small business. Choose MySQL, MariaDB or PostgreSQL if you want a separate database server. The Docker repository has a compose file for MariaDB.

What do I back up?

The database, the .env file and the storage folder. With the Docker image, that is the billing-data volume, which holds the SQLite database, .env, uploads, logs and extra plugins.

How do I update?

With Docker, pull the newer image and recreate the container; it applies new migrations when it starts. On PHP hosting, replace the files with the new release, keeping your .env and storage folder, and run php artisan migrate --force. Plugins can be upgraded from a zip in the admin area.

My host has no cron. Can I still run it?

Yes. Admin → Settings → System gives you a secret URL. Call it every minute from any cron service instead.

Something not working? Open an issue on GitHub.

Run it on your own server.

Open source (MIT) and yours to change.