Commit Graph
100 Commits
Author SHA1 Message Date
javierandClaude Opus 5 c24846c058 Merged the template branch into main to pick up the 7 upstream changes.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-04 15:17:26 +02:00
javier b2bfb734c6 Documented the alternate locales of the Social Card in the Infrastructure package. 2026-09-04 15:13:29 +02:00
javier 779bdd542a Updated the READMEs to cover site languages and event tagging. 2026-09-04 15:01:21 +02:00
javier a71edd37ab Updated the event tagging for the AnalyticsEvent+Tagging extension in the Infrastructure package to support attribute-capable tags. 2026-09-04 14:57:29 +02:00
javier a9a62e10df Added the site languages to the Structured Data in the Infrastructure package. 2026-09-04 14:43:06 +02:00
javier 0b3ef2890e Updated the Localized HTML Collection response in the Infrastructure package to make Vary: Accept-Language opt-in for localized responses. 2026-09-04 14:39:43 +02:00
javier f0086ee461 Added the alternate locales to the Social Card in the Infrastructure package. 2026-09-04 14:36:22 +02:00
javier c8100fd93c Pinned git to HTTP/1.1 for the Dockerfile in the Website service target to keep the packages on a transport Github handles correctly. 2026-09-04 14:32:48 +02:00
javier 277045c1a1 Set the canonical site origin in the Website library target.
The template's new `site.origin` key arrived empty, as bootstrap fills it in.
Pointing it at the origin robots.txt and sitemap.xml already carry turns on the
canonical and hreflang links, and the HTTPS redirect the production compose
already trusts the forwarded proto for.
2026-08-30 23:01:48 +02:00
javier 85e1047a9c Merged the template branch into main to pick up the 33 upstream changes.
Reconciled the bootstrap-customised files: kept the CCN naming, canonical
origin, database slug and analytics comments, dropped the template-only
Makefile, README.md and Scripts/bootstrap that bootstrap removes, and took
the template's ordering for the security headers in the production compose.
2026-08-30 22:57:45 +02:00
javier daf764f10f Fixed the sitemap for the Website service target. 2026-08-30 22:01:47 +02:00
javier a3d9655766 Added language support to the Website service target. 2026-08-30 21:47:08 +02:00
javier 9b16ce3339 Updated the Negotiate method in the Localization package to add explicit language requests. 2026-08-30 19:05:52 +02:00
javier 79cfb42fbb Updated the LocalizationMiddleware middleware in the Infrastructure package to read explicit language requests. 2026-08-30 19:03:52 +02:00
javier 6c75d5e743 Improved the bootstrap script to write the canonical site origin and also, fixed some nasty bugs. 2026-08-30 09:53:39 +02:00
javier a3d0bc75fd Implemented the validation for the name and slug inputs in the bootstrap script. 2026-08-30 09:39:28 +02:00
javier 1cae261dff Improved the .dockerignore definitions in the Website service target. 2026-08-30 09:22:10 +02:00
javier 8bf6e86ffb Implemented the "tagging()" method for the the AnalyticsEvent+Tagging extension in the Infrastructure package. 2026-08-30 09:15:59 +02:00
javier cf58b97de1 Updated the ConfigReader+Properties extension in the Website service target to fail to the boot in case of unknown database tokens. 2026-08-30 09:03:50 +02:00
javier 5a833be33d Updated the documentations in the Website service target. 2026-08-30 08:37:19 +02:00
javier 8a9402e8f1 Improved the documentation of the README file in the Utility package. 2026-08-30 08:35:44 +02:00
javier c1ca6609e4 Improved the documentation of the README file in the Persistence package. 2026-08-30 08:35:35 +02:00
javier d40f988877 Improved the documentation of the README file in the Localization package. 2026-08-30 08:35:21 +02:00
javier 4ee1abbd67 Improved the documentation of the README file in the Infrastructure package. 2026-08-30 08:35:06 +02:00
javier 3358946e3d Added the ImageWidth enumeration to the Website library target. 2026-08-25 17:23:29 +02:00
javier c09ac657ab Added font preload links to the Page+Defaults extension in the Website library target. 2026-08-25 17:05:08 +02:00
javier 7aee1cd949 Added immutable caching to the fingerprinted media types for the ConfigReader+Properties extension in the Website service target. 2026-08-25 16:59:07 +02:00
javier 988090a511 Added a configurable site origin to the ConfigReader+Properties extension in the Website library target. 2026-08-25 16:24:03 +02:00
javier 5b2da4eb16 Added the MP4 and WOFF2 cases to the AssetExtension enumeration. 2026-08-25 16:06:05 +02:00
javier 1033cab2af Added an optional founder reference to the Organization node in the Infrastructure package. 2026-08-24 22:37:45 +02:00
javier 74e81e1517 Refactored the StaticFile enumeration in the Website library target into a structure. 2026-08-24 22:37:13 +02:00
javier d8cf1abf6a Changed the default Open Graph locale in the Website library target from en_US to en_NL. 2026-08-24 22:33:13 +02:00
javier eb0a2127f6 Reworded the documentation of the organization identifier helper in the Infrastructure package target. 2026-08-24 22:31:44 +02:00
javier 0ee8368e1a Added the organization identifier helper to the StructuredData type in the Infrastructure package target. 2026-08-24 22:29:00 +02:00
javier ecafb14608 Reworded the README documentation in the Infrastructure package target. 2026-08-24 17:49:06 +02:00
javier c64c8b726d Added the email property to the organization structured data in the Infrastructure package target. 2026-08-24 17:48:31 +02:00
javier fec52b7942 Added the noindex robots tag to the responses on the Health controller in the Website library target. 2026-08-24 17:47:57 +02:00
javier 88bcae9dc9 Added the WebP case to the Asset extensions in the Infrastructure package. 2026-08-24 17:44:43 +02:00
javier c0f56a4897 Wired the trailing-slash redirect into the App router in the Website service target. 2026-08-24 17:37:46 +02:00
javier 5996a78ff3 Documented and enabled the HTTPS redirect in the Website service. 2026-08-24 17:37:33 +02:00
javier f6a77305ac Trailing slash middleware for the Infrastructure package (#53) 2026-08-24 17:33:52 +02:00
javier 1520c44b16 HTTPS redirect middleware for the Infrastructure package (#52) 2026-08-24 17:32:02 +02:00
javier fcfb3f21d5 Added the organization descriptors and a number value to the structured data types in the Infrastructure package. 2026-08-23 10:13:37 +02:00
javier 08b4d80064 Updated the analytics origin documentation for the Website service target. 2026-08-20 01:15:26 +02:00
javier 6c014525bf Updated the analytics origin documentation for the Website service target. 2026-08-20 01:14:49 +02:00
javier 6ecc20987f Updated the README file in the repository root. 2026-08-20 01:10:37 +02:00
javier b6ad9ff497 Fixed the analytics and security headers for the Website service target. 2026-08-20 00:55:09 +02:00
javier 13093705a3 Fixed the analytics and security headers for the Website service target. 2026-08-20 00:54:29 +02:00
javier 22e737d9c2 Initial commit. 2026-08-19 23:19:08 +02:00
javier 5422c8466d Merge branch 'setup' into template 2026-08-16 09:09:55 +02:00
javier 091c0f0686 Added an optional per-asset folder to the Asset protocol and the AssetExtension extension in the Infrastructure package. 2026-08-15 23:44:06 +02:00
javier 459002544b Merge branch 'setup' into template 2026-08-15 11:39:26 +02:00
javier 7d53be539e Bundled the static files into the App test target. 2026-08-15 11:32:56 +02:00
javier 844a85f88c Added the Event type to the Analytics type in the Infrastructure package. 2026-08-15 11:31:59 +02:00
javier a5305c6044 Improved the Docker image and build context for the Website service target. 2026-08-13 15:57:11 +02:00
javier c075adad84 Hardened the Docker build of the Website service target. 2026-08-13 03:19:10 +02:00
javier 2206d71997 Turned the analytics tracker off by default in the template. 2026-08-13 02:57:47 +02:00
javier b68eac4375 Merge branch 'setup' into template 2026-08-13 02:37:43 +02:00
javier 397ad6b896 Added the "analytics.recorder" flag to the Website service. 2026-08-13 01:29:44 +02:00
javier 4bb3e9098c Added the session recorder script to the Page protocol in the Infrastructure package. 2026-08-13 01:19:19 +02:00
javier 3bcae4d789 Added the "recorder" flag to the Analytics type in the Infrastructure package. 2026-08-13 01:19:12 +02:00
javier 964e7fa707 Update the documentation of the README files in the packages and in the Website service target. 2026-08-13 00:55:34 +02:00
javier 70c0cc5303 Added a connection pool timeout to the Configuration type in the Persistence package. 2026-08-13 00:14:51 +02:00
javier d7465d03cc Updated the Probe method in the Persistence package with a query deadline. 2026-08-13 00:11:59 +02:00
javier 8303598244 Documented the database connection pooling in the Website service. 2026-08-11 01:35:43 +02:00
javier 19fa9d8d8c Hardened the database configuration in the Website service target. 2026-08-10 23:42:22 +02:00
javier a88569ad4c Improved the verbosity of the documentation for the README file in the packages. 2026-08-10 16:35:13 +02:00
javier 98cfbdd105 Updated the "db-reset" task in the Makefile in the Website service to actually delete the local data. 2026-08-10 16:25:05 +02:00
javier 0796aa314e Moved the PostgreSQL TLS context building to the Service initialiser in the Persistence package. 2026-08-05 01:36:19 +02:00
javier e51f09c66f Added PostgresNIO and NIOSSL to the Persistence library target. 2026-08-05 01:30:59 +02:00
javier 52f092a4d7 Refactored the startup reply in the fake PostgreSQL server in the Persistence tests target. 2026-08-05 01:30:52 +02:00
javier f8a263168e Updated the documentation for the Website service target to name/reference PostgreSQL instead. 2026-08-05 01:30:32 +02:00
javier 6156cf5b0d Migrated the Website service tooling to use PostgreSQL instead. 2026-08-05 01:26:54 +02:00
javier 9b4a780ea3 Migrated the Website service and library targets to use Persistence package with PostgreSQL instead. 2026-08-05 01:26:26 +02:00
javier 3d27a27cb1 Migrated the documentations and test cases in the Persistence package to use/name PostgreSQL instead. 2026-08-04 17:46:04 +02:00
javier 8ca31e415c Migrated the fake plaintext server in the Persistence tests target to use PostgreSQL instead. 2026-08-04 17:44:12 +02:00
javier 1fe7ef2049 Migrated the Service method in the Persistence package to use PostgreSQL instead. 2026-08-04 17:44:02 +02:00
javier d7d2709f88 Migrated the Driver and TLS enumerations in the Persistence package to use PostgreSQL instead. 2026-08-04 17:43:44 +02:00
javier 02ab9671b1 Swapped the MySQL package dependencies for PostgreSQL in Persistence package. 2026-08-04 17:43:34 +02:00
javier 3463556c13 Updated the documentation of the README file in the Infrastructure package. 2026-08-04 12:19:27 +02:00
javier 16acdf0f3d Implemented the analytics preconnect hint on the Page protocol in the Infrastructure package. 2026-08-04 12:19:20 +02:00
javier c603421c28 Implemented the scripts' deferral on the Page protocol in the Infrastructure package. 2026-08-04 12:19:12 +02:00
javier 5c070c2b1a Integrated Analytics into the Infrastructure package (#40)
This PR contains the work done to define the `Analytics` type into the _Infrastructure_ package and also, to integrate this type into its `Page` protocol.

Reviewed-on: rock-n-code/loud-amsterdam#40
Co-authored-by: Javier Cicchelli <javier@rock-n-code.com>
2026-08-04 11:23:25 +02:00
javier fd5aa84924 Improved the PNG assets optimization on the Dockerfile in the Website service target to do it recursively. 2026-08-02 03:06:17 +02:00
javier a4db1fe29c Updated the documentation for the README file of the template. 2026-08-02 03:04:50 +02:00
javier d10ced84a8 Fixed an issue in the bootstrap script when project name left as placeholder. 2026-08-02 02:59:53 +02:00
javier 422560ec10 Prompt the canonical site URL during bootstrap script to rewrite website crawlers. 2026-08-02 02:57:43 +02:00
javier a5ee02bb0b Improved the PNG assets optimization on the Dockerfile in the Website service target to do it recursively. 2026-08-02 02:41:46 +02:00
javier 59ce633499 Merge branch 'setup' 2026-08-02 02:34:42 +02:00
javier 64d2d5943a Updated the documentation of the README file in the Website service target. 2026-08-02 00:58:11 +02:00
javier a056f7f69a Renamed the "error" static assets at the Resources folder in the Website service target as "not-found". 2026-08-01 23:07:04 +02:00
javier 2c571233bc Renamed the Error page in the Website library target as NotFound. 2026-08-01 23:06:22 +02:00
javier b680ae0689 Structured Data support for the Page protocol in the Infrastructure package (#32)
This PR contains the work done to introduce a `StructuredData` type that pages use to describe themselves to search engines as schema.org JSON-LD, and wires it into the Page protocol so the payload renders automatically in the document head.

Reviewed-on: rock-n-code/loud-amsterdam#32
Co-authored-by: Javier Cicchelli <javier@rock-n-code.com>
2026-08-01 17:21:16 +00:00
javier 1d1f0a9dc9 Utility package docker fix in the Website service target (#31)
This PR contains the work done to included the Utility package into the Docker deployment process in the Website service target.

Reviewed-on: rock-n-code/loud-amsterdam#31
Co-authored-by: Javier Cicchelli <javier@rock-n-code.com>
2026-08-01 11:53:36 +00:00
javier 5c9fde9d41 Social Card tweaks in the Infrastructure package. (#30)
This PR contains the work done to address certain tweaks in the newly-introduced _Social Card_ types in the **Infrastructure** package.

Reviewed-on: rock-n-code/loud-amsterdam#30
Co-authored-by: Javier Cicchelli <javier@rock-n-code.com>
2026-08-01 11:25:36 +00:00
javier 5f4316b85b Added the Utility package (#29)
This PR contains the work done to create the new **Utility** package within the project, and also included in it the `NormalizeEmail` method, as it's not something that belongs to the **Infrastructure** package.

Reviewed-on: rock-n-code/loud-amsterdam#29
Co-authored-by: Javier Cicchelli <javier@rock-n-code.com>
2026-08-01 11:15:27 +00:00
javier efc933d5d0 Extra tags and Social Card integration in the Infrastructure package (#28)
This PR contains the work done to extends the `Page` protocol with the head tags that control search snippets and link previews: a meta description, a canonical URL, and a social card rendered as _Open Graph_ and _Twitter_ meta tags. All three are optional with nil defaults, so existing conformers compile and render unchanged.

Reviewed-on: rock-n-code/loud-amsterdam#28
Co-authored-by: Javier Cicchelli <javier@rock-n-code.com>
2026-08-01 10:57:29 +00:00
javier ea00b94841 Tweaks and fixes throughout the project (#27)
This PR contains the work done to do a little bit of housekeeping pass across all packages and the Website service.

To provide further details about the work:
* Refreshed the READMEs and source documentation to match the current code;
* Tagged every test case consistently across the Infrastructure, Localization, Persistence, and Website test targets;
* Removed Website middleware tests now covered by Infrastructure's own suite;
* Conformed the `PrepareDB` method to Sendable;
* Relaxes the production Compose DATABASE_TLS default from require to prefer;
* Added Persistence test verifying the prefer posture falls back to plaintext connections.

Reviewed-on: rock-n-code/loud-amsterdam#27
Co-authored-by: Javier Cicchelli <javier@rock-n-code.com>
Co-committed-by: Javier Cicchelli <javier@rock-n-code.com>
2026-07-30 06:33:57 +00:00
javier 0887135328 Fixes for the Localization package (#26)
This PR contains the work done to

Reviewed-on: rock-n-code/loud-amsterdam#26
Co-authored-by: Javier Cicchelli <javier@rock-n-code.com>
Co-committed-by: Javier Cicchelli <javier@rock-n-code.com>
2026-07-28 23:37:33 +00:00
javier cdded06ba3 Renamed the Web package as Infrastructure (#25)
This PR contains the work done to rename the _Web_ package as _Infrastructure_, to provide a clear naming and purpose to this particular package within the project.

To provide further details about the work:

* Infrastructure
  * Asset fingerprinting: an FNV-1a token derived from the static files directory, appended as ?v= to asset URLs so deploys bust caches; pre-rendered pages also revalidate via weak ETags.
  * New middlewares: fixed-window RateLimitMiddleware (per-client budgets keyed by trusted X-Forwarded-For or remote address) and VaryMiddleware (Accept-Encoding on every response); SecurityHeadersMiddleware now also stamps error responses.
  * Auto-generated HEAD endpoints, cache max-age configuration, and Docker build/Compose refinements.
  * Protocols and scaffolding: Asset/AssetExtension, the Page protocol (viewport, stylesheets, scripts, versioned URLs), and LocalizedRequestContext.
  * Rate limiter's counter store swapped from an actor to a Mutex (no executor hop per request) with amortized batch eviction instead of O(n²) scans under client floods.
  * FingerprintAssets reports unreadable files to a logger instead of silently producing a token that never busts their cache.

Reviewed-on: rock-n-code/loud-amsterdam#25
Co-authored-by: Javier Cicchelli <javier@rock-n-code.com>
Co-committed-by: Javier Cicchelli <javier@rock-n-code.com>
2026-07-23 01:04:37 +00:00