Lalabase
Tickets, Doku, Zeiterfassung und Kundengespräche an einem Ort, durchsuchbar per KI. Für Softwarefirmen mit Kundenprojekten. Open Source: auf deinem eigenen Server oder in unserer Cloud in Deutschland.
翻譯準備中
正在載入完整 README。 以下為已儲存的摘錄。
Kiddo is a bilingual workshop-booking platform for families and a day-to-day operations system for workshop teams. It combines a public catalog, customer self-service, an administration CRM, payment reconciliation, notifications, and an optional conversational assistant.檢視完整 README ↗Kiddo is a bilingual workshop-booking platform for families and a day-to-day operations system for workshop teams. It combines a public catalog, customer self-service, an administration CRM, payment reconciliation, notifications, and an optional conversational assistant.
llm.txt, health (/health) and ping (/ping) endpoints.
/api/mcp) and HTTP tool endpoints (/api/v1/tools).composer.jsonAll PHP and Composer commands are run from the project root inside the php container:
docker compose run --rm php <command>
docker compose run --rm php composer install
docker compose up -d db
docker compose run --rm php bin/console doctrine:migrations:migrate --no-interaction
docker compose run --rm php bin/console tailwind:build
docker compose up -d
Open:
The application and database use the values from .env and any local overrides in .env.local. External integrations such as Brevo, IMAP, ElevenLabs, Telegram, and Sentry are optional for basic local browsing, but their environment variables are required to exercise those integrations.
Create a comprehensive, repeatable preview dataset:
docker compose up -d db
docker compose run --rm php bin/console doctrine:migrations:migrate --no-interaction
docker compose run --rm php bin/console app:dev:seed-demo --replace
The command creates representative users, children, lessons, recurring and one-time series, bookings, payments, transfers, cancellations, and reschedules. It never removes non-demo records.
Demo accounts use passwordless login:
| Role | |
|---|---|
| Administrator | [email protected] |
| Instructor | [email protected] |
| Parent | [email protected] |
Open /login, enter an address above, then use the link captured by Mailpit at http://localhost:8025.
To remove only the demo dataset:
docker compose run --rm php bin/console app:dev:seed-demo --purge
Start PostgreSQL before any database-backed tests:
docker compose up -d db
| Goal | Command |
|---|---|
| All tests | docker compose run --rm php composer tests |
| Unit tests | docker compose run --rm php bin/phpunit --group unit |
| Unit and functional tests with coverage | docker compose run --rm -e XDEBUG_MODE=coverage php sh -lc 'composer tests:functional:setup && bin/phpunit --group unit --group functional --coverage-html target/coverage/html' |
| Smoke tests | docker compose run --rm php composer tests:smoke |
| Functional tests | docker compose run --rm php composer tests:functional |
| Filtered test | docker compose run --rm php bin/phpunit --filter ClassNameOrMethod |
| Apply automated fixes | docker compose run --rm php composer qa:fix |
| Full quality gate | docker compose run --rm php composer qa |
| Lint GitHub Actions workflows | docker run --rm -v "$PWD:/repo" --workdir /repo rhysd/actionlint:latest -color |
| Scan git history for secrets | docker run --rm -v "$PWD:/repo" zricethezav/gitleaks:latest detect --source /repo -v --redact |
After code changes, run composer qa:fix, review its diff, then run composer qa.
Pull requests must cover at least 50% of the executable lines they add or change. CI measures both unit and functional tests, publishes the complete report as the test-coverage artifact, and displays its totals in the workflow summary.
# Inspect routes
docker compose run --rm php bin/console debug:router
# Rebuild Tailwind during development
docker compose run --rm php bin/console tailwind:build --watch
# Update stored lesson maps after model changes
docker compose run --rm php bin/console app:booking:update-lesson-maps
assets/ Stimulus controllers, styles, and browser assets
config/ Symfony services, routes, workflows, and package configuration
docs/ Integration and assistant documentation
maintenance/ Static "technical break" page and nginx config (see Maintenance mode)
migrations/ Doctrine database migrations
src/Application Business use cases, commands, workflows, and chat tools
src/Entity Domain entities, value objects, and DTOs
src/Infrastructure External services, persistence, messaging, scheduling, and MCP
src/UserInterface HTTP actions and Symfony UX Live Components
templates/ Public, account, admin, component, and email templates
tests/ Unit, smoke, functional, repository, and domain tests
Before planned work on the database or other infrastructure, replace the application with a static
technical-break page in the site's look. Run the Enable Maintenance Mode workflow (Actions tab,
optionally filling in the "back at" text). It swaps the kiddo container for an nginx placeholder on the
same address and port, answering every request with 503 and Retry-After.
It needs no image build or registry login, no .env and no database migrations. It does run the same
Cloudflare DNS upsert and Cytrus domain check as a regular deploy (the page is unreachable without them),
so it needs the same routing secrets. Every regular deploy pre-caches the nginx image on the host, so
Docker Hub is not needed either.
To leave maintenance mode, re-run the latest Production Build & Deploy workflow run; a regular
deploy replaces the placeholder. Do not merge to master during maintenance, since every merge deploys
the application again. Locally: ansible-playbook -i ansible/inventory.ini ansible/playbooks/maintenance.yml
with the routing and host --extra-vars from the deploy workflow (no app_version, GitHub token or env file).
Proprietary. See composer.json for package metadata.