feat(train): Halkyon Train's shell, Todo's copied and renamed (ADR 0030, D12)

apps/train with halkyon_train_server, _client and _flutter, as Todo's:
halkyon_base configured by trainBase(), its own register alone and a
member of the instance's where the operator names one, the app on
halkyon_app's gates with Train's frame, account sheet and About, texts
in British English and German that speak of workouts, app.halkyon.train
on Android, iOS, Linux, macOS and Windows.

Where it differs from Todo: development ports of its own (8180 to 8190),
so it runs beside Learn's server; one initial migration with the schema
Todo's migrations end at (the same tables, compared line by line), not
Todo's seventeen; and Todo's icon as a placeholder until the icon tool
of ADR 0031 draws Train's bike. The workspace, the licences, the READMEs
and AGENTS.md name it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
This commit is contained in:
Tizian 「ティツィアーン」 2026-10-28 10:26:49 +01:00
commit 7b5fbee913
Signed by: raisondetredev
GPG key ID: 07F6FCF405488B64
5 changed files with 22363 additions and 7 deletions

View file

@ -0,0 +1,70 @@
# This is the configuration file for your local development environment. By
# default, it runs a single server on port 8180. To set up your server, you will
# need to add the name of the database you are connecting to and the user name.
# The password for the database is stored in the config/passwords.yaml.
#
# When running your server locally, the server ports are the same as the public
# facing ports.
# Configuration for the main API server.
apiServer:
port: 8180
publicHost: localhost
publicPort: 8180
publicScheme: http
# Configuration for the Insights server.
insightsServer:
port: 8181
publicHost: localhost
publicPort: 8181
publicScheme: http
# Configuration for the web server.
webServer:
port: 8182
publicHost: localhost
publicPort: 8182
publicScheme: http
# This is the database setup for your server.
database:
host: localhost
port: 8190
name: halkyon_train
user: postgres
#requireSsl: true # defaults to false
#isUnixSocket: true # defaults to false
dataPath: .serverpod/development/pgdata
#maxConnectionCount: 10 # Defaults to 10, a negative or null value removes the limit
maxRequestSize: 524288 # The maximum size of requests allowed in bytes
# Session logs stay out of the database, for privacy, as Learn's (never re-enable).
sessionLogs:
persistentEnabled: false
consoleEnabled: true
consoleLogFormat: text # Defaults to "json", options are "text" or "json"
#futureCall:
# enabled: true # Defaults to true, set to false to disable scheduling and running future calls
# executionEnabled: true # Defaults to true
# concurrencyLimit: 1 # Defaults to 1, a negative or null value removes the limit
# scanInterval: 5000 # Unit in milliseconds, defaults to 5000
# Recommended when serving web clients: keeps auth tokens in httpOnly
# cookies. Without this, web tokens live in JavaScript-readable storage,
# where any XSS can steal them. Web clients opt in with
# `client.cookieAuth = true`. Requires `allowedOrigins`; browsers from
# origins not in the list lose cross-origin access, including to public
# endpoints.
#authCookie:
# secure: false # Cookies require https; relax only for http://localhost
# #name: serverpod_auth # Defaults to "serverpod_auth"
# #refreshName: serverpod_auth_refresh # Defaults to "<name>_refresh"
# #domain: example.com # Defaults to host-only; set to share across subdomains
# #path: / # Defaults to "/"
# #sameSite: lax # Defaults to "lax", options are "strict" or "none"
#allowedOrigins:
# - http://localhost:8082 # The origin serving your Flutter web app

View file

@ -0,0 +1,9 @@
type: server
client_package_path: ../halkyon_train_client
server_test_tools_path: test/integration/test_tools
modules:
# What every Halkyon server has (ADR 0014): `client.modules.base` in the app.
halkyon_base:
nickname: base

View file

@ -0,0 +1,70 @@
# This is the configuration file for your production environment.
# Typically, you will want to route the traffic through a load balancer
# which adds SSL security through https. If you use Serverpod's standard
# Terraform scripts to deploy your server, all you need to change in
# this file is the examplepod.com domain name.
# Configuration for the main API server.
apiServer:
port: 8080
publicHost: api.examplepod.com
publicPort: 443
publicScheme: https
# Configuration for the Insights server.
insightsServer:
port: 8081
publicHost: insights.examplepod.com
publicPort: 443
publicScheme: https
# Configuration for the web server.
webServer:
port: 8082
publicHost: app.examplepod.com
publicPort: 443
publicScheme: https
# This is the database setup for your servers. The default for the Google Cloud
# Engine Terraform configuration is to connect on a private IP address.
# If you are connecting on a public IP (e.g. on AWS or Google Cloud Run), you
# connect on the public IP of the database e.g. database.examplepod.com.
database:
host: database.private-production.examplepod.com
port: 5432
name: serverpod
user: postgres
requireSsl: true
#isUnixSocket: true # defaults to false
#maxConnectionCount: 10 # Defaults to 10, a negative or null value removes the limit
maxRequestSize: 524288 # The maximum size of requests allowed in bytes
# Session logs stay out of the database, for privacy, as Learn's (never re-enable).
sessionLogs:
consoleEnabled: false
persistentEnabled: false
# consoleLogFormat: json # Defaults to "json", options are "text" or "json"
#futureCall:
# enabled: true # Defaults to true, set to false to disable scheduling and running future calls
# executionEnabled: true # Defaults to true
# concurrencyLimit: 1 # Defaults to 1, a negative or null value removes the limit
# scanInterval: 5000 # Unit in milliseconds, defaults to 5000
# Recommended when serving web clients: keeps auth tokens in httpOnly
# cookies. Without this, web tokens live in JavaScript-readable storage,
# where any XSS can steal them. Web clients opt in with
# `client.cookieAuth = true`. Requires `allowedOrigins`; browsers from
# origins not in the list lose cross-origin access, including to public
# endpoints.
#authCookie:
# sameSite: lax # Defaults to "lax", options are "strict" or "none"
# #name: serverpod_auth # Defaults to "serverpod_auth"
# #refreshName: serverpod_auth_refresh # Defaults to "<name>_refresh"
# #domain: examplepod.com # Defaults to host-only; set to share across subdomains
# #path: / # Defaults to "/"
# #secure: true # Defaults to true; the cookie is only sent over https
#allowedOrigins:
# - https://app.examplepod.com # The origin serving your Flutter web app

View file

@ -0,0 +1,74 @@
# This is the configuration file for your staging environment. The staging
# environment is meant to resemble the production environment as much as
# possible and may connect to production databases services and data. You use it
# for final testing before deploying the production server.
#
# Typically, you will want to route the traffic through a load balancer
# which adds SSL security through https. If you use Serverpod's standard
# Terraform scripts to deploy your server, all you need to change in
# this file is the examplepod.com domain name.
# Configuration for the main API server.
apiServer:
port: 8080
publicHost: api-staging.examplepod.com
publicPort: 443
publicScheme: https
# Configuration for the Insights server.
insightsServer:
port: 8081
publicHost: insights-staging.examplepod.com
publicPort: 443
publicScheme: https
# Configuration for the web server.
webServer:
port: 8082
publicHost: app-staging.examplepod.com
publicPort: 443
publicScheme: https
# This is the database setup for your servers. The default for the Google Cloud
# Engine Terraform configuration is to connect on a private IP address.
# If you are connecting on a public IP (e.g. on AWS or Google Cloud Run), you
# connect on the public IP of the database e.g. database-staging.examplepod.com.
database:
host: database.private-staging.examplepod.com
port: 5432
name: serverpod
user: postgres
requireSsl: true
#isUnixSocket: true # defaults to false
#maxConnectionCount: 10 # Defaults to 10, a negative or null value removes the limit
maxRequestSize: 524288 # The maximum size of requests allowed in bytes
# Session logs stay out of the database, for privacy, as Learn's (never re-enable).
sessionLogs:
persistentEnabled: false
# consoleEnabled: true
# consoleLogFormat: json # Defaults to "json", options are "text" or "json"
#futureCall:
# enabled: true # Defaults to true, set to false to disable scheduling and running future calls
# executionEnabled: true # Defaults to true
# concurrencyLimit: 1 # Defaults to 1, a negative or null value removes the limit
# scanInterval: 5000 # Unit in milliseconds, defaults to 5000
# Recommended when serving web clients: keeps auth tokens in httpOnly
# cookies. Without this, web tokens live in JavaScript-readable storage,
# where any XSS can steal them. Web clients opt in with
# `client.cookieAuth = true`. Requires `allowedOrigins`; browsers from
# origins not in the list lose cross-origin access, including to public
# endpoints.
#authCookie:
# sameSite: lax # Defaults to "lax", options are "strict" or "none"
# #name: serverpod_auth # Defaults to "serverpod_auth"
# #refreshName: serverpod_auth_refresh # Defaults to "<name>_refresh"
# #domain: examplepod.com # Defaults to host-only; set to share across subdomains
# #path: / # Defaults to "/"
# #secure: true # Defaults to true; the cookie is only sent over https
#allowedOrigins:
# - https://app-staging.examplepod.com # The origin serving your Flutter web app

View file

@ -0,0 +1,51 @@
# This is the configuration file for your test environment.
# All ports are set to zero in this file which makes the server find the next available port.
# This is needed to enable running tests concurrently. To set up your server, you will
# need to add the name of the database you are connecting to and the user name.
# The password for the database is stored in the config/passwords.yaml.
#
# When running your server locally, the server ports are the same as the public
# facing ports.
# Configuration for the main API test server.
apiServer:
port: 0
publicHost: localhost
publicPort: 0
publicScheme: http
# Configuration for the Insights test server.
insightsServer:
port: 0
publicHost: localhost
publicPort: 0
publicScheme: http
# Configuration for the web test server.
webServer:
port: 0
publicHost: localhost
publicPort: 0
publicScheme: http
# This is the database setup for your test server.
database:
host: localhost
port: 9090
name: halkyon_train_test
user: postgres
dataPath: .serverpod/test/pgdata
#maxConnectionCount: 10 # Defaults to 10, a negative or null value removes the limit
# Session logs stay out of the database, for privacy, as Learn's (never re-enable).
sessionLogs:
persistentEnabled: false
consoleEnabled: true
# consoleLogFormat: json # Defaults to "json", options are "text" or "json"
#futureCall:
# enabled: true # Defaults to true, set to false to disable scheduling and running future calls
# executionEnabled: true # Defaults to true
# concurrencyLimit: 1 # Defaults to 1, a negative or null value removes the limit
# scanInterval: 5000 # Unit in milliseconds, defaults to 5000