Simple incremental counter
Find a file
2026-08-15 23:47:03 +02:00
.forgejo/workflows 55 - Add PHPStan and larastan static analysis 2026-08-15 21:50:37 +02:00
.github/workflows Fresh Laravel install 2025-07-10 15:24:15 +02:00
app 53 - Collapse the fake user layer 2026-08-15 23:47:03 +02:00
bootstrap 37 - Fix dev environment: paths, PHP version, testing DB, env isolation 2026-05-02 09:52:42 +02:00
config 53 - Collapse the fake user layer 2026-08-15 23:47:03 +02:00
database 53 - Collapse the fake user layer 2026-08-15 23:47:03 +02:00
docker 47 - Delete unreachable frontend scaffolding 2026-08-15 14:04:05 +02:00
public Add number font 2025-07-12 21:55:55 +02:00
resources 48 - Remove asset and price-tracking subsystem 2026-08-15 21:34:19 +02:00
routes 53 - Collapse the fake user layer 2026-08-15 23:47:03 +02:00
storage Fresh Laravel install 2025-07-10 15:24:15 +02:00
tests 53 - Collapse the fake user layer 2026-08-15 23:47:03 +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 53 - Collapse the fake user layer 2026-08-15 23:47:03 +02:00
.env.testing 27 - Add Forgejo CI: PHP tests, lint, coverage, asset build 2026-05-02 10:19:26 +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
.prettierignore Fresh Laravel install 2025-07-10 15:24:15 +02:00
.prettierrc Fresh Laravel install 2025-07-10 15:24:15 +02:00
artisan Fresh Laravel install 2025-07-10 15:24:15 +02:00
components.json Fresh Laravel install 2025-07-10 15:24:15 +02:00
composer.json 55 - Add PHPStan and larastan static analysis 2026-08-15 21:50:37 +02:00
composer.lock 55 - Add PHPStan and larastan static analysis 2026-08-15 21:50:37 +02:00
eslint.config.js Fresh Laravel install 2025-07-10 15:24:15 +02:00
Jenkinsfile Drop v prefix from docker image tags 2025-07-14 21:24:18 +02:00
LICENSE Clean up 2025-07-13 12:56:16 +02:00
package-lock.json 47 - Delete unreachable frontend scaffolding 2026-08-15 14:04:05 +02:00
package.json 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
phpstan.neon 55 - Add PHPStan and larastan static analysis 2026-08-15 21:50:37 +02:00
phpunit.xml 37 - Fix dev environment: paths, PHP version, testing DB, env isolation 2026-05-02 09:52:42 +02:00
README.md 49 - Update README: remove milestone and price tracking claims 2026-08-15 14:42:07 +02:00
shell.nix 37 - Flatten docker/dev structure and relax onboarding completion check 2026-05-01 23:27:38 +02:00
tsconfig.json Fresh Laravel install 2025-07-10 15:24:15 +02:00
vite.config.ts 23 - Price tracking opt-in: migration, flag, conditional UI, onboarding checkbox 2026-05-01 22:02:13 +02:00

incr

A minimalist counter

Track anything you accumulate — click to increment

License: GPL v3 Laravel React

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.

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: React 19 + TypeScript with Inertia.js
  • Styling: Tailwind CSS 4 with shadcn/ui components
  • 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.

License

GNU General Public License v3.0 — see LICENSE.