FrankandClaude Sonnet 5 5bf25d1802 Add father/mother links to NPCs, derived from the relationships text
- Npc gains self-referencing father/mother (nullable, ON DELETE SET NULL);
  editable as dropdowns on the per-NPC form
- app:npc:link-parents parses "son/daughter/child of X [and Y]" from the
  Relationships / Notes column, resolves the names within the same family,
  and works out which parent is father vs mother from husband/wife/widow(er)
  and son/daughter/sister/brother cues (plus a small name-gender table for
  the few the text can't disambiguate). --dry-run / --force. 92/180 linked,
  none ambiguous.
- migrations now pin ENGINE=InnoDB - the local WAMP MariaDB defaults to
  MyISAM, which silently drops foreign keys

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-06 15:21:03 +02:00

dmtools

DM tools for the Monday-evening D&D campaign.

Symfony 8 (PHP 8.5) web app with a Bootstrap 5 + DataTables front end served through Symfony AssetMapper (no Node build step). Behind a form-login gate; there is no self-registration.

  • Not run in Docker locally (Windows dev box uses the Symfony CLI + local MariaDB).
  • Is Dockerized on the testing and live servers, behind the shared Nginx Proxy Manager at https://dmtools.fvandenberg.nl.

Repo: https://gitea.fvandenberg.nl/Frank/dmtools.git


Local development (dev box)

Prerequisites: PHP 8.5 at C:\php (on PATH so the Symfony CLI discovers it — symfony local:php:list should show 8.5), the Symfony CLI, Composer, and a local MariaDB/MySQL (WAMP is fine). .php-version pins this directory to PHP 8.5.

# 1. Point the app at your local database + dev mode
cp .env .env.local
#    then edit .env.local:
#      APP_ENV=dev
#      DATABASE_URL="mysql://root:@127.0.0.1:3306/dmtools?serverVersion=10.10.2-MariaDB&charset=utf8mb4"

# 2. Install and build
symfony composer install
symfony console doctrine:database:create
symfony console doctrine:migrations:migrate -n
symfony console importmap:install

# 3. First user, then run
symfony console app:user:create you@example.com --admin
symfony serve -d
symfony open:local

serverVersion must match your local engine (SELECT VERSION();).

Servers (testing + live)

Docker only. docker/setup.sh pins the compose project name to dmtools (containers dmtools-php, dmtools-nginx, dmtools-db).

git pull
cp .env .env.local          # first time only
#   edit .env.local: real APP_SECRET (or let setup.sh generate it),
#   DB_PASSWORD, DB_ROOT_PASSWORD, and NGINX_PORT / DB_PORT if 8085 / 3310 clash
./docker/setup.sh
docker compose -p dmtools exec php php bin/console app:user:create you@example.com --admin

Ports (bound to 127.0.0.1 on the host): nginx 8085 → :80, db 3310 → :3306.

Reverse proxy (Nginx Proxy Manager)

Add a proxy host: dmtools.fvandenberg.nl → forward to host dmtools-nginx, port 80, scheme http; request a Let's Encrypt certificate. NPM and dmtools-nginx must share the external docker_default Docker network (the compose file attaches nginx to it as proxy).

Common commands

docker compose -p dmtools logs -f php
docker compose -p dmtools exec php bash
docker compose -p dmtools exec php php bin/console doctrine:migrations:migrate
./docker/restart.sh            # full down + bring-up (no rebuild)
./docker/setup.sh --down       # stop the stack

Layout notes

  • table.datatable in any Twig template is auto-initialised as a DataTable (assets/app.js). Opt out with data-datatable="false"; pass options as JSON in data-datatable-options.
  • assets/vendor/ and public/assets/ are generated (git-ignored); importmap:install on the server re-downloads vendored packages, so the servers need outbound HTTPS to jsDelivr at deploy time.
S
Description
DM tools for the monday evening campaign
Readme
27 MiB
Languages
PHP 61.3%
Twig 26.4%
JavaScript 6.5%
CSS 4.2%
Shell 1.3%
Other 0.3%