Simple incremental counter
Find a file
myrmidex ce6e649033
Some checks failed
Build and Push Docker Image / build (push) Has been cancelled
Merge pull request 'release/v0.4.1' (#66) from release/v0.4.1 into main
Reviewed-on: #66
2026-08-16 13:26:22 +02:00
.forgejo/workflows 65 - Speed up the production image build 2026-08-16 13:12:25 +02:00
app 64 - Extract the counter form into a Blade component 2026-08-16 12:23:28 +02:00
bootstrap 52 - Replace React/Inertia with Blade + Livewire 4 2026-08-16 00:57:07 +02:00
config 63 - Remove unused faker and sail dependencies 2026-08-16 12:17:44 +02:00
database 46 - Squash migrations and run CI against sqlite 2026-08-16 10:38:00 +02:00
docker 65 - Speed up the production image build 2026-08-16 13:12:25 +02:00
docs/screenshots 61 - Add counter screenshot to the README 2026-08-16 11:38:50 +02:00
public 59 - Fix 7-segment font failing to load from the Vite dev server 2026-08-16 09:44:06 +02:00
resources 64 - Extract the counter form into a Blade component 2026-08-16 12:23:28 +02:00
routes 52 - Replace React/Inertia with Blade + Livewire 4 2026-08-16 00:57:07 +02:00
storage Fresh Laravel install 2025-07-10 15:24:15 +02:00
tests 64 - Extract the counter form into a Blade component 2026-08-16 12:23:28 +02:00
.dockerignore 47 - Fix .dockerignore excluding dev container startup script 2026-08-15 14:10:23 +02:00
.editorconfig Fresh Laravel install 2025-07-10 15:24:15 +02:00
.env.example 63 - Remove unused faker and sail dependencies 2026-08-16 12:17:44 +02:00
.env.testing 46 - Squash migrations and run CI against sqlite 2026-08-16 10:38:00 +02:00
.gitattributes Fresh Laravel install 2025-07-10 15:24:15 +02:00
.gitignore 25 - Upgrade all packages: inertia 3, vite 8, tinker 3, phpunit 12, lucide 1, ts 6; commit composer.lock 2026-05-02 12:53:56 +02:00
artisan Fresh Laravel install 2025-07-10 15:24:15 +02:00
CHANGELOG.md 61 - Relicense to AGPL, add CONTRIBUTING and CHANGELOG 2026-08-16 11:32:58 +02:00
composer.json 63 - Remove unused faker and sail dependencies 2026-08-16 12:17:44 +02:00
composer.lock 63 - Remove unused faker and sail dependencies 2026-08-16 12:17:44 +02:00
CONTRIBUTING.md 61 - Relicense to AGPL, add CONTRIBUTING and CHANGELOG 2026-08-16 11:32:58 +02:00
LICENSE 61 - Relicense to AGPL, add CONTRIBUTING and CHANGELOG 2026-08-16 11:32:58 +02:00
package-lock.json 52 - Replace React/Inertia with Blade + Livewire 4 2026-08-16 00:57:07 +02:00
package.json 52 - Replace React/Inertia with Blade + Livewire 4 2026-08-16 00:57:07 +02:00
phpstan.neon 46 - Squash migrations and run CI against sqlite 2026-08-16 10:38:00 +02:00
phpunit.xml 46 - Squash migrations and run CI against sqlite 2026-08-16 10:38:00 +02:00
README.md 61 - Add counter screenshot to the README 2026-08-16 11:38:50 +02:00
shell.nix 37 - Flatten docker/dev structure and relax onboarding completion check 2026-05-01 23:27:38 +02:00
vite.config.ts 52 - Replace React/Inertia with Blade + Livewire 4 2026-08-16 00:57:07 +02:00

incr

A minimalist counter

Track anything you accumulate — click to increment

License: AGPL v3 Laravel Livewire

About

incr is a minimalist, self-hosted counter. Pick something you want to accumulate — books, workouts, anything — set a starting value, then click the number to count up.

It features a distinctive LED-style digital display and nothing else.

Screenshot

The counter

The whole application. Click the number to add one; [SET VALUE] opens a dialog for when clicking once at a time is not practical.

Features

  • LED-style display — large red digital counter
  • Click to increment — click the number to add to it
  • Set a value directly — for when you need to add more than one
  • Self-hosted — your data stays on your server

Tech Stack

  • Backend: Laravel 13 (PHP 8.3+) with MySQL
  • Frontend: Livewire 4 with Blade
  • Styling: Tailwind CSS 4
  • Deployment: Docker / Podman with multi-stage builds

Self-hosting

# docker-compose.yml
services:
  app:
    image: forge.lvl0.xyz/lvl0/incr:latest
    container_name: incr-app
    restart: unless-stopped
    environment:
      - APP_ENV=production
      - APP_DEBUG=false
      - APP_KEY=base64:YOUR_APP_KEY_HERE
      - DB_CONNECTION=mysql
      - DB_HOST=db
      - DB_PORT=3306
      - DB_DATABASE=incr
      - DB_USERNAME=incr_user
      - DB_PASSWORD=change_me
    ports:
      - "5001:80"
    depends_on:
      db:
        condition: service_healthy
    networks:
      - incr-network

  db:
    image: mysql:8.0
    container_name: incr-db
    restart: unless-stopped
    environment:
      - MYSQL_DATABASE=incr
      - MYSQL_USER=incr_user
      - MYSQL_PASSWORD=change_me
      - MYSQL_ROOT_PASSWORD=change_me_root
    volumes:
      - db_data:/var/lib/mysql
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "incr_user", "-pchange_me"]
      timeout: 10s
      retries: 10
      interval: 10s
      start_period: 10s
    networks:
      - incr-network

networks:
  incr-network:
    driver: bridge

volumes:
  db_data:

Generate an app key with: php artisan key:generate --show

The app will be available at http://localhost:5001.

Development

Requires Nix. Enter the dev shell:

nix-shell
dev-up

Available commands inside the shell: dev-up, dev-down, dev-restart, dev-rebuild, dev-logs, dev-logs-db, dev-shell, dev-artisan, dev-composer, base-build.

The dev stack binds host ports 8000, 5173 and 3307. Only one project using these can run at a time.

Contributing

See CONTRIBUTING.md.

License

incr is free software, licensed under the GNU AGPL-3.0.