From 3463877b89adb979e7e66620db68cfb36389e01d Mon Sep 17 00:00:00 2001 From: "Sebastian BURGIN-FIX (ext)" Date: Wed, 29 Jul 2026 04:58:48 +0200 Subject: [PATCH 1/2] wip --- README.md | 343 +++++++-------------------- app/Security/Presets/MyCspPreset.php | 2 + 2 files changed, 87 insertions(+), 258 deletions(-) diff --git a/README.md b/README.md index 25858dd..99b754e 100644 --- a/README.md +++ b/README.md @@ -1,306 +1,133 @@

- -Laravel Logo - + codebar Solutions AG

-## About Laravel Template +

www.codebar.ch

-Laravel Template is a project template for all Codebar Solutions AG Laravel applications. -It is a starting point for new Laravel projects. -It includes a basic setup for a Laravel application with some common packages and configurations.: - -- Auth -- Support for Microsoft Office 365 Authentication -- Enums -- [Laravel Nova](https://nova.laravel.com). -- [Flysystem Cloudinary](https://github.com/codebar-ag/laravel-flysystem-cloudinary). -- [Flysystem Cloudinary Nova](https://github.com/codebar-ag/laravel-flysystem-cloudinary-nova). -- [Spatie Activity Log](https://github.com/spatie/laravel-activitylog). -- [Spatie Health](https://github.com/spatie/laravel-health). -- [Spatie Permission](https://github.com/spatie/laravel-permission). - -## Installation - -You can use this template by clicking on the `Use this template` button on the top of this github repository page. - -**INSERT IMAGE HERE* * - -Once you have created a new repository from this template, you can clone it to your local machine and install the dependencies: - -```bash -composer install - -cp .env.example .env -cp vite.config-example.js vite.config.js - -php artisan key:generate +

+ The public marketing website of codebar Solutions AG — a small software company based in the Basel region, Switzerland. Laravel, Blade and Tailwind, bilingual (DE/EN), content managed as version-controlled files rather than through an admin panel. +

-php artisan migrate --seed +## Contents -npm install -npm run build -``` +- [Content architecture](#content-architecture) +- [Localization](#localization) +- [SEO](#seo) +- [LLM usage analytics](#llm-usage-analytics) +- [Local development](#local-development) +- [Testing & code quality](#testing--code-quality) +- [Deployment](#deployment-laravel-cloud) +- [Key packages](#key-packages) -If you want to use Valet to serve your application, you can run the following command: +## Content architecture -```bash -valet link - -valet secure +Almost everything editorial — pages, news articles, team members, services, products, technologies, network partners, the AI model catalogue — lives as YAML or Markdown files under `database/files/`, not as data entered through a CMS. The files are the source of truth; the database is a rebuildable cache of them. -valet open ``` - -If you want to user Herd to serve your application, you can run the following command: - -```bash -herd link - -herd secure - -herd open +database/files/ +├── ai_models/ one YAML file per model +├── networks/ one YAML file per partner +├── news/{locale}/ one Markdown file per article, per language +├── pages/ one YAML file per page (SEO metadata: title, description, robots, image) +├── products/{locale}/ +├── services/{locale}/ +├── team/ one YAML file per person +└── technologies/{locale}/ ``` -You can run the development asset server with the following command: +Each content type has a matching import command that reads its files and upserts the database, and is safe to run repeatedly: -```bash -npm run dev -```` +| Command | Reads | +|---|---| +| `php artisan pages:import` | `database/files/pages/*.yaml` | +| `php artisan news:import` | `database/files/news/{locale}/*.md` | +| `php artisan team:import` | `database/files/team/*.yaml` | +| `php artisan services:import` | `database/files/services/{locale}/*.md` | +| `php artisan products:import` | `database/files/products/{locale}/*.md` | +| `php artisan technologies:import` | `database/files/technologies/{locale}/*.md` | +| `php artisan networks:import` | `database/files/networks/*.yaml` | +| `php artisan ai-models:import` | `database/files/ai_models/*.yaml` | +| `php artisan sync:repositories` | live GitHub repositories (open-source content) | -> Note: You should set `valetTls: 'your-domain.test',` below `refresh: true,` in your `vite.config.js` file if you use `valet secure` or `herd secure`. +`database/seeders/DatabaseSeeder.php` calls every one of these on `db:seed` — including in production. That is intentional: these seeders don't generate test fixtures, they publish the real content the same way running the command by hand would. The one exception is `AiModelDailyUsagesTableSeeder`, which loads a static local-dev fixture rather than real usage data (see [LLM usage analytics](#llm-usage-analytics)). -## Assets +A file that disappears from `database/files/` removes the matching row on the next import — the importers are the single source of truth in both directions. -Assets should be set in the following directories: +## Localization -- `resources/js` for JavaScript files. -- `resources/css` for CSS files. -- `resources/fonts` for Font files. -- `resources/images` for Image files. +The site ships in German (`de_CH`) and English (`en_CH`) under distinct, fully translated URL prefixes rather than a shared `/en/…` segment — e.g. `/dienstleistungen` and `/services`, `/aktuelles` and `/news`, `/ueber-uns` and `/about-us`. Every localized route pair cross-references the other via `hreflang`, including on detail pages where the slug itself is translated (`routes/web.php`, `resources/views/layouts/_partials/_seo.blade.php`). -After you have added your assets, you can run the following command to compile them: -```bash -npm run build -``` +## SEO -To include your assets in your blade files, you can use the following: +- **Structured data** — a single `@graph` JSON-LD payload (`App\Seo\SchemaGraph` / `App\Seo\SchemaNodes`) built from `config/company.php`, the one source of truth for the company's name, addresses, phone and `sameAs` profiles. Every page ships `Organization`, `WebSite`, `WebPage` and `BreadcrumbList` nodes; content pages add `Service`, `Person`, `BlogPosting`, etc. +- **Sitemap** — `App\Sitemap\SitemapBuilder` + `App\Http\Controllers\Sitemap\SitemapController` build `/sitemap.xml` from the same models the site renders, cached 24h via `Cache::remember`. +- **Response cache** — `spatie/laravel-responsecache` caches full HTTP responses for up to 7 days. `App\Observers\SitemapCacheObserver` drops the sitemap's own data cache on every relevant model save, and `responsecache:clear` runs hourly via the scheduler (`routes/console.php`) as a backstop for the full-page cache layer — these are two independent caches and both need clearing after a bulk content change (`php artisan responsecache:clear` after a fresh `db:seed`, for instance). +- **Social images** — article heroes that are local SVG placeholders (no real photography yet) are not usable as `og:image` — social crawlers don't render SVG. `App\Support\NewsImage::ogImage()` falls back to a same-named `.png` rendered from the SVG when one exists, or the site's default share image otherwise. +- **Tests** — `tests/Feature/Seo/` asserts on the actual rendered JSON-LD and meta tags (not just "does it look right"), and `tests/lighthouse/` audits real Lighthouse scores against the built (`npm run build`) output, not the Vite dev server. -```blade -{{ Vite::asset('resources/images/your-image.png') }} -``` +## LLM usage analytics -## Auth +`/ki` (`/ai`) publishes aggregate usage figures for the AI models codebar runs internally via a self-hosted [LiteLLM](https://www.litellm.ai/) proxy. `php artisan llm:fetch-analytics` pulls per-day usage from the proxy's `/spend/logs` endpoint and stores it in `ai_model_daily_usages`; it's scheduled hourly but only backfills the last 3 days by default — use `--full` (syncs from 2026-01-01) or `--from`/`--to` to backfill a specific range. Spend figures are stored but must never be displayed publicly. The dashboard intentionally shows monthly/yearly aggregates only, never a daily breakdown. -Auth is enabled by default. +## Local development -You can configure auth settings in the `config/laravel-auth.php` file. +```bash +composer install +cp .env.example .env +php artisan key:generate -### 🔐 Verify -If you wish to use email verification, you can use the following middleware to protect your routes: +php artisan migrate --seed # imports real content — see "Content architecture" above -```php -Route::middleware(['laravel-auth-middleware'])->group(function () { - ... -}); -``` -To use verification in nova, add the middleware into in your `nova.php` config: - -```php -/* -|-------------------------------------------------------------------------- -| Nova Route Middleware -|-------------------------------------------------------------------------- -| -| These middleware will be assigned to every Nova route, giving you the -| chance to add your own middleware to this stack or override any of -| the existing middleware. Or, you can just stick with this stack. -| -*/ - -'middleware' => [ - 'web', - 'laravel-auth-middleware', - HandleInertiaRequests::class, - DispatchServingNovaEvent::class, - BootTools::class, -], +npm install +npm run build # or `npm run dev` for the Vite dev server ``` -### Microsoft Office 365 Authentication - -⚠️ When using Office 365 you need to provide a publicly accessible URL for the `MICROSOFT_REDIRECT_URI` environment variable. You can use [expose](https://expose.dev/) or [ngrok](https://ngrok.com/) for local development. - -```bash -APP_URL=https://your-expose-or-ngrok-url.com +If you use [Herd](https://herd.laravel.com): -# ✅ This is recommended for production as well: -MICROSOFT_REDIRECT_URI="${APP_URL}/auth/service/microsoft/redirect" +```bash +herd link +herd secure +herd open ``` -## Permissions - -Please refer to the [Spatie Permission](https://github.com/spatie/laravel-permission) documentation for more information on how to use permissions. - -## Enums - -Enums are included in PHP's core functionality but we have some additional functionality to make them easier to use. - -You can create an enum in the `app/Enums` directory: - -```php - __('Production'), - EnvironmentEnum::STAGING => __('Staging'), - EnvironmentEnum::LOCAL => __('Local'), - }; - } -} +```bash +valet link +valet secure +valet open ``` -You should use the `HasLabels` trait to add a `label` method to your enum. -You should also implement the `LabelEnumInterface` interface to ensure that the `label` method is implemented. - -The `label` method should return the label for the enum value. - -You can use the enum in your code like this: - -```php -// Native PHP Enum -$enum = EnvironmentEnum::PRODUCTION; // Enum Object -$name = EnvironmentEnum::PRODUCTION->name; // Enum Name (PRODUCTION) -$value = EnvironmentEnum::PRODUCTION->value; // Enum Value (production) +> Set `valetTls: 'your-domain.test'` below `refresh: true` in `vite.config.js` if you use `valet secure` / `herd secure`. -// Label -$label = EnvironmentEnum::PRODUCTION->label(); // Enum Label using Laravels Translation (Production) +## Testing & code quality -// Labels -$labels = EnvironmentEnum::labels(); // Array of Enum Labels with Enum value as Key (['production' => 'Production', 'staging' => 'Staging', 'local' => 'Local']) +```bash +./vendor/bin/pest # test suite (Pest) +./vendor/bin/phpstan analyse # static analysis (Larastan, see phpstan.neon.dist) +./vendor/bin/pint # code style +./vendor/bin/pint --blade # blade formatting (beta) ``` -## Health - -Please refer to the [Spatie Health](https://github.com/spatie/laravel-health) documentation for more information on how to use health checks. - -We have added two health checks which are located in the `app/Checks` directory: - -- `FailedJobsCheck` -- `JobsCheck` - -## Helpers - -We have added some helper functions which are located in the `app/Helpers` directory - -You should the Facades for the helpers which are located in the `app/Helpers/Facades` directory: - -- `HelperBank` -- `HelperDate` -- `HelperDevice` -- `HelperFile` -- `HelperMarkdown` -- `HelperMoney` -- `HelperNumber` -- `HelperPhone` - -## Feature Policy - -We have added feature policy which is located in the `app/FeaturePolicy` directory. - -It is enabled by default and you can configure it in the `config/feature-policy.php` and `config/default.php` file. - -The Feature Policy Middleware is installed and enabled by default in the `bootstrap/app.php` file. - -## Traits - -We have added some traits which are located in the `app/Traits` directory. - -- `HassUuid` - -We also have some traits which are located in the `app/Traits/Nova` directory which are intended for use only in Laravel Nova. - -- `NovaCustomOrderTrait` -- `NovaIdentificationPanelTrait` -- `NovaLanguageTrait` -- `NovaTimestampsPanelTrait` - -## Blade Components - -We have added some blade components which are located in the `resources/views/components` directory. +## Deployment (Laravel Cloud) -- `fathom.blade.php` -- `favicons.blade.php` - -You should include both the blade components in your blade layout files - -## Laravel Cloud deployment - -When deploying to Laravel Cloud, ensure these environment variables are set for Lighthouse Best Practices (security headers): +The site runs on [Laravel Cloud](https://cloud.laravel.com), behind Cloudflare. Required environment variables for security headers: - `CSP_ENABLED=true` — enables Content-Security-Policy enforcement via Spatie CSP middleware - `FPH_ENABLED=true` — enables Permissions-Policy headers -Security headers (HSTS, COOP, `X-Content-Type-Options`, `Referrer-Policy`, `X-Frame-Options`) are applied automatically by `SecurityHeaders` middleware on all web responses. - -**Lighthouse note:** Deprecated API warnings for `/cdn-cgi/challenge-platform/scripts/jsd/main.js` come from Cloudflare bot protection injected by Laravel Cloud, not from application code. Run Lighthouse in incognito without browser extensions for accurate scores. - -## Cloudinary - -Please refer to the respective documentation for the Cloudinary and Cloudinary Nova packages. - -- [Flysystem Cloudinary](https://github.com/codebar-ag/laravel-flysystem-cloudinary). -- [Flysystem Cloudinary Nova](https://github.com/codebar-ag/laravel-flysystem-cloudinary-nova). +HSTS, COOP, `X-Content-Type-Options`, `Referrer-Policy` and `X-Frame-Options` are applied automatically by the `SecurityHeaders` middleware on every web response. -## Notifications +**Lighthouse note:** deprecated-API warnings for `/cdn-cgi/challenge-platform/scripts/jsd/main.js` come from Cloudflare's bot protection, injected at the edge — not from application code. Run Lighthouse in incognito without extensions for an accurate score, and prefer `tests/lighthouse/` (which audits the built output) over ad-hoc runs against the dev server. -We use Filament for notifications. Please refer to the [Filament](https://filamentphp.com/docs/3.x/notifications/sending-notifications) documentation for more information on how to use notifications. - -## Pint - -We use Laravel Pint to format code. - -You can run the following command to format your code: - -```bash -./vendor/bin/pint -``` - -You can run the following command to format your blade files: - -```bash -./vendor/bin/pint --blade -``` - -> The blade formatter is still in beta and may not work as expected. if you wish to not use this update your `composer.json` to use the latest version of `laravel/pint` instead of the dev branch. - - -## Testing - -We use PestPHP for testing. - -You can run the following command to run your tests: - -```bash -./vendor/bin/pest -``` +## Key packages -Please refer to the [PestPHP](https://pestphp.com) documentation for more information on how to use PestPHP. +- **Content & storage** — `spatie/laravel-translatable`, `codebar-ag/laravel-flysystem-cloudinary` (editorial images), `league/flysystem-aws-s3-v3` (DigitalOcean Spaces for other assets), `symfony/yaml` +- **SEO** — `spatie/laravel-sitemap`, `spatie/laravel-responsecache` +- **Security & health** — `spatie/laravel-csp`, `spatie/laravel-honeypot`, `spatie/laravel-permission`, `spatie/laravel-health`, `spatie/security-advisories-health-check`, `mazedlx/laravel-feature-policy` +- **Ops** — `laravel/nightwatch` (observability), `symfony/postmark-mailer` +- **Analytics** — [Fathom](https://usefathom.com) (privacy-friendly, no cookie banner) ## License -The Laravel framework is open-sourced software licensed under the [MIT license](https://opensource.org/licenses/MIT). +The application code is proprietary to codebar Solutions AG. The underlying Laravel framework is open-source software licensed under the [MIT license](https://opensource.org/licenses/MIT). diff --git a/app/Security/Presets/MyCspPreset.php b/app/Security/Presets/MyCspPreset.php index 9717f3d..369a2bd 100644 --- a/app/Security/Presets/MyCspPreset.php +++ b/app/Security/Presets/MyCspPreset.php @@ -50,6 +50,8 @@ public function configure(Policy $policy): void 'data:', 'res.cloudinary.com', 'www.gravatar.com', + 'cdn.usefathom.com', + 'cdn-eu.usefathom.com', ]); $fontSources = array_filter([ From c19afab4ff143eb0226614382b4944195b5b0940 Mon Sep 17 00:00:00 2001 From: "Sebastian BURGIN-FIX (ext)" Date: Wed, 29 Jul 2026 07:00:24 +0200 Subject: [PATCH 2/2] wip --- .../de_CH/2025-04-06-docuware-7-12-is-here.md | 2 +- .../de_CH/2025-09-15-docuware-7-13-is-here.md | 2 +- .../de_CH/2026-05-12-docuware-7-14-is-here.md | 2 +- .../2026-07-29-llm-gateway-open-source.md | 191 ++++++++ .../en_CH/2025-04-06-docuware-7-12-is-here.md | 2 +- .../en_CH/2025-09-15-docuware-7-13-is-here.md | 2 +- .../en_CH/2026-05-12-docuware-7-14-is-here.md | 2 +- .../2026-07-29-llm-gateway-open-source.md | 182 ++++++++ prompts/images-news.md | 156 +++++++ prompts/network.md | 123 +++++ .../news/placeholders/docuware-7-12-de.png | Bin 0 -> 88028 bytes ...docuware-7-14.svg => docuware-7-12-de.svg} | 117 +++-- .../news/placeholders/docuware-7-12-en.png | Bin 0 -> 88341 bytes .../news/placeholders/docuware-7-12-en.svg | 121 +++++ .../news/placeholders/docuware-7-12.png | Bin 94205 -> 0 bytes .../news/placeholders/docuware-7-13-de.png | Bin 0 -> 88281 bytes ...docuware-7-12.svg => docuware-7-13-de.svg} | 117 +++-- .../news/placeholders/docuware-7-13-en.png | Bin 0 -> 88670 bytes .../news/placeholders/docuware-7-13-en.svg | 121 +++++ .../news/placeholders/docuware-7-13.png | Bin 92769 -> 0 bytes .../news/placeholders/docuware-7-14-de.png | Bin 0 -> 87667 bytes ...docuware-7-13.svg => docuware-7-14-de.svg} | 117 +++-- .../news/placeholders/docuware-7-14-en.png | Bin 0 -> 88038 bytes .../news/placeholders/docuware-7-14-en.svg | 121 +++++ .../news/placeholders/docuware-7-14.png | Bin 94412 -> 0 bytes .../make-news-hero.cpython-314.pyc | Bin 0 -> 27155 bytes scripts/make-news-hero.py | 432 ++++++++++++++++++ scripts/render-news-og.sh | 30 ++ 28 files changed, 1747 insertions(+), 93 deletions(-) create mode 100644 database/files/news/de_CH/2026-07-29-llm-gateway-open-source.md create mode 100644 database/files/news/en_CH/2026-07-29-llm-gateway-open-source.md create mode 100644 prompts/images-news.md create mode 100644 prompts/network.md create mode 100644 public/images/news/placeholders/docuware-7-12-de.png rename public/images/news/placeholders/{docuware-7-14.svg => docuware-7-12-de.svg} (59%) create mode 100644 public/images/news/placeholders/docuware-7-12-en.png create mode 100644 public/images/news/placeholders/docuware-7-12-en.svg delete mode 100644 public/images/news/placeholders/docuware-7-12.png create mode 100644 public/images/news/placeholders/docuware-7-13-de.png rename public/images/news/placeholders/{docuware-7-12.svg => docuware-7-13-de.svg} (59%) create mode 100644 public/images/news/placeholders/docuware-7-13-en.png create mode 100644 public/images/news/placeholders/docuware-7-13-en.svg delete mode 100644 public/images/news/placeholders/docuware-7-13.png create mode 100644 public/images/news/placeholders/docuware-7-14-de.png rename public/images/news/placeholders/{docuware-7-13.svg => docuware-7-14-de.svg} (59%) create mode 100644 public/images/news/placeholders/docuware-7-14-en.png create mode 100644 public/images/news/placeholders/docuware-7-14-en.svg delete mode 100644 public/images/news/placeholders/docuware-7-14.png create mode 100644 scripts/__pycache__/make-news-hero.cpython-314.pyc create mode 100755 scripts/make-news-hero.py create mode 100755 scripts/render-news-og.sh diff --git a/database/files/news/de_CH/2025-04-06-docuware-7-12-is-here.md b/database/files/news/de_CH/2025-04-06-docuware-7-12-is-here.md index 02e6059..a150846 100644 --- a/database/files/news/de_CH/2025-04-06-docuware-7-12-is-here.md +++ b/database/files/news/de_CH/2025-04-06-docuware-7-12-is-here.md @@ -6,7 +6,7 @@ teaser: >- Mehr Automatisierung und Einblick: Das Release verbessert die E-Rechnungsverarbeitung, bringt IDP in die Cloud und öffnet Workflow-Daten für Analytics. published_at: 2025-04-06 author: sebastian.buergin@codebar.ch -hero: images/news/placeholders/docuware-7-12.svg +hero: images/news/placeholders/docuware-7-12-de.svg hero_alt: Platzhaltergrafik zum DocuWare-Release 7.12 tags: [DMS/ECM] --- diff --git a/database/files/news/de_CH/2025-09-15-docuware-7-13-is-here.md b/database/files/news/de_CH/2025-09-15-docuware-7-13-is-here.md index 5a42be0..d666ed1 100644 --- a/database/files/news/de_CH/2025-09-15-docuware-7-13-is-here.md +++ b/database/files/news/de_CH/2025-09-15-docuware-7-13-is-here.md @@ -6,7 +6,7 @@ teaser: >- Workflows entstehen neu im Browser, der Rechnungseingang kommt mit ausländischen E-Rechnungsformaten zurecht, und die Anmeldung schützt ein zweiter Faktor. published_at: 2025-09-15 author: sebastian.buergin@codebar.ch -hero: images/news/placeholders/docuware-7-13.svg +hero: images/news/placeholders/docuware-7-13-de.svg hero_alt: Platzhaltergrafik zum DocuWare-Release 7.13 tags: [DMS/ECM] --- diff --git a/database/files/news/de_CH/2026-05-12-docuware-7-14-is-here.md b/database/files/news/de_CH/2026-05-12-docuware-7-14-is-here.md index becb1f9..0067af4 100644 --- a/database/files/news/de_CH/2026-05-12-docuware-7-14-is-here.md +++ b/database/files/news/de_CH/2026-05-12-docuware-7-14-is-here.md @@ -6,7 +6,7 @@ teaser: >- Die letzten Einstellungen wandern in den Browser, eine neu gebaute App bringt Aufgaben aufs Telefon, und Archive ziehen zwischen Cloud-Organisationen um. published_at: 2026-05-12 author: sebastian.buergin@codebar.ch -hero: images/news/placeholders/docuware-7-14.svg +hero: images/news/placeholders/docuware-7-14-de.svg hero_alt: Platzhaltergrafik zum DocuWare-Release 7.14 tags: [DMS/ECM] --- diff --git a/database/files/news/de_CH/2026-07-29-llm-gateway-open-source.md b/database/files/news/de_CH/2026-07-29-llm-gateway-open-source.md new file mode 100644 index 0000000..32b6b7f --- /dev/null +++ b/database/files/news/de_CH/2026-07-29-llm-gateway-open-source.md @@ -0,0 +1,191 @@ +--- +key: llm-gateway-open-source +slug: llm-gateway-open-source +title: Warteschlange statt Warteschleife — unser LLM Gateway ist Open Source +teaser: >- + Lokale Modelle lösen die Datenschutzfrage, aber nicht die Kapazitätsfrage. Wir haben ein + Gateway gebaut, das Anfragen an lokale Modelle annimmt, speichert und der Reihe nach + abarbeitet — und stellen es unter MIT-Lizenz zur Verfügung. +published_at: 2026-07-29 +published: false +author: sebastian.buergin@codebar.ch +hero: images/templates/cover-template.jpg +hero_alt: Platzhaltergrafik zum LLM Gateway +tags: [Open Source, KI] +featured: false +--- + +Wir arbeiten täglich mit lokalen Sprachmodellen. Der Grund ist unspektakulär: Sobald ein Prompt +Kundendaten, Verträge oder interne Dokumente enthält, ist die Frage nicht mehr, welches Modell am +besten antwortet, sondern wer die Anfrage zu sehen bekommt. Ein Modell, das auf der eigenen +Hardware läuft, beantwortet diese Frage von selbst — nichts verlässt das Haus, es gibt keine +Verarbeitung im Ausland, keine Vertragsanhänge zur Auftragsverarbeitung, keine Diskussion darüber, +ob Eingaben irgendwann in ein Training fliessen. + +Was lokale Modelle nicht mitliefern, ist Kapazität. + +## Das eigentliche Problem ist Gleichzeitigkeit + +Ein lokales Modell ist günstig im Betrieb und teuer in der *Parallelität*. Eine GPU — oder der +gemeinsame Speicher eines Macs — trägt realistisch ein bis zwei gleichzeitige Anfragen, bevor das +Umschalten zwischen Modellen mehr kostet, als es bringt. Ollamas `OLLAMA_NUM_PARALLEL` existiert +genau deshalb: Die Grenze ist hart, nicht weich. + +Darüber hinaus stauen sich Anfragen. Ob man eine Warteschlange gebaut hat oder nicht, ändert daran +nichts — es ändert nur, *wo* sie entsteht. Entweder an einer Stelle, die man sieht, oder in Ollamas +eigenem Scheduler, wo eine Anfrage, die schlicht wartet, exakt gleich aussieht wie eine, die +hängt. + +Für einen einzelnen Entwickler am Notebook ist das kein Thema. Für interne Werkzeuge, die Rechnungen +auslesen, Protokolle zusammenfassen oder Dokumente klassifizieren, wird daraus schnell ein +Betriebsproblem: Ein Batchlauf blockiert alle anderen, ein Timeout im aufrufenden System verwirft +eine Antwort, für die das Modell noch zwei Minuten rechnet, und niemand kann sagen, wie lange etwas +dauern wird. + +## Was wir stattdessen gebaut haben + +Das LLM Gateway ist eine Warteschlange vor den lokalen Modellen — und sonst bewusst nichts. + +Der Ablauf ist einfach: Sie senden Ihre Anfrage genau so, wie Sie sie an das Modell senden würden. +Das Gateway nimmt sie an, schreibt sie in die Datenbank und antwortet sofort mit einer ID. Sobald +Kapazität frei ist, nimmt ein Worker den Eintrag, spielt ihn unverändert ans Modell weiter und legt +die Antwort zurück in denselben Eintrag. Abgeholt wird sie später über die zweite Anfrage. + +```bash +# absenden — antwortet in Millisekunden mit einer ID +ID=$(curl -s https://gateway.example/v1/responses \ + -H "Authorization: Bearer $MY_API_KEY" \ + -H "Content-Type: application/json" \ + -d '{"model":"qwen3-vl:30b-a3b","input":"Rechnungsnummer und Total als JSON."}' | jq -r .id) + +# abholen — sobald der Status auf «completed» steht +curl -s https://gateway.example/v1/responses/$ID \ + -H "Authorization: Bearer $MY_API_KEY" | jq -r '.output[0].content[0].text' +``` + +Die API ist die von OpenAI definierte: `POST /v1/chat/completions` und `POST /v1/responses` +funktionieren so, wie es jedes SDK erwartet. Der Unterschied liegt in der Antwort — statt auf das +Modell zu warten, kommt ein `202` mit einer ID zurück. Auch eine als synchron gedachte +Chat-Completion wird dabei in einen asynchronen Auftrag umgewandelt. Das ist kein Nebeneffekt, +sondern der Zweck: Eine Warteschlange, die man umgehen kann, ist keine. + +## Alles geht 1:1 durch + +Der Punkt, auf den wir beim Bauen am meisten geachtet haben: Das Gateway interpretiert die Anfrage +nicht. + +- **Der Body** geht unverändert nach oben. Unbekannte Felder werden nicht entfernt, ein fehlendes + `model` ist kein Fehler, es gibt keine eigene Validierung, die irgendwann hinter der API des + Modells zurückbleibt. +- **Die Header** werden aus einer festen Positivliste gespeichert und exakt so wieder gesendet, wie + sie ankamen — inklusive `Authorization` und der `X-Litellm-`-Tags, mit denen wir Kosten pro + Anwendungsfall auswerten. Alles andere wird verworfen statt weitergereicht; ein `Cookie` aus einem + Browser hat beim Modell nichts zu suchen. + +Daraus folgt der zweite Punkt: **Das Gateway besitzt keine Zugangsdaten.** Es gibt keinen +Master-Key und keine Benutzertabelle. Was den Aufruf beim Modell legitimiert, ist der Schlüssel des +Aufrufenden — so wie vorher auch, als noch direkt gerufen wurde. + +Weil der Aufruf nach oben erst stattfindet, wenn die ursprüngliche HTTP-Verbindung längst geschlossen +ist, müssen die Header zwischengelagert werden. Sie liegen verschlüsselt beim Eintrag, werden von der +API nie zurückgegeben, im Dashboard nur mit *Namen* angezeigt und gelöscht, sobald der Eintrag einen +Endzustand erreicht. Zurück bleibt ein SHA-256-Hash des Tokens — genug, um einen Eintrag seinem +Urheber zuzuordnen, zu wenig, um damit etwas anzustellen. + +:::callout{type="info" title="Wem ein Eintrag gehört"} +Lesen, abbrechen und löschen darf nur, wer denselben Schlüssel schickt, mit dem der Eintrag erstellt +wurde. Passt er nicht, antwortet die API mit `404` statt mit `403` — sie bestätigt eine ID nicht, die +sie ohnehin nicht ausliefern würde. +::: + +## Mehrere Modelle, mehrere Gateways + +Wer lokal arbeitet, hat selten genau eine Maschine. Bei uns sind es ein Mac mit Ollama, eine +LiteLLM-Instanz vor mehreren Modellen und, für Aufgaben ohne schützenswerten Inhalt, ein +kommerzieller Anbieter. + +Jedes dieser Ziele wird im Dashboard als «Gateway» erfasst und bekommt eine ID, die vor dem `/v1` +in der URL steht: + +```bash +curl https://gateway.example/v1/chat/completions # das Standard-Gateway +curl https://gateway.example/9f3c8b52-…/v1/chat/completions # ein bestimmtes +``` + +Ein SDK, das mit `base_url = https://gateway.example/{id}/v1` konfiguriert ist, spricht damit ohne +weitere Anpassung genau ein Ziel an — absenden und abholen. Drei Protokolle werden unterstützt: +OpenAI-kompatibel (also LiteLLM, vLLM, Ollamas eigener Shim und alles andere in dieser Form), +Anthropic und Ollama nativ. Bei den letzten beiden übersetzt das Gateway hin und zurück; bei +OpenAI-kompatiblen Zielen bleibt es reiner Durchgang. + +| Protokoll | Endpunkt beim Ziel | Body | +| --- | --- | --- | +| OpenAI-kompatibel | `{base}/v1/chat/completions` | unverändert durchgereicht | +| Anthropic | `{base}/v1/messages` | übersetzt hin und zurück | +| Ollama | `{base}/api/chat` | übersetzt hin und zurück | + +Ein Gateway zu deaktivieren stoppt nur *neue* Anfragen. Bereits eingereihte Einträge sind fest mit +dem Ziel verbunden, das sie bei der Annahme zugewiesen bekommen haben — ein Wechsel des Standards +lenkt also nie eine Antwort um, auf die jemand gerade wartet. + +## Warten mit Anzeige + +Eine Warteschlange, die nicht sagt, wie lange es dauert, ist auch nur eine Blackbox. Jede Antwort zu +einem wartenden Eintrag enthält deshalb einen eigenen Block: + +```json +"queue": { + "position": 3, + "depth": 7, + "workers": 2, + "estimated_seconds": 84 +} +``` + +`position` zählt den Eintrag selbst mit, `depth` ist der gesamte Rückstand, und `estimated_seconds` +rechnet bis zur *eigenen* Antwort, nicht bis zum Beginn der Bearbeitung — das ist die Zahl, die man +einem wartenden Menschen zeigen kann. + +Sie ist eine Hochrechnung, keine Zusage: der Median der letzten tatsächlichen Antwortzeiten für +dasselbe Modell, multipliziert mit der Anzahl Runden, die vor einem liegen. Was sie nicht sehen +kann, ist ein Modellwechsel — eine Anfrage, die Ollama zwingt, ein anderes Modell zu laden, dauert +deutlich länger, und kein Median über vergangene Antworten weiss davon im Voraus. + +## Was das Gateway bewusst nicht tut + +Wir halten die Grenzen für den ehrlicheren Teil einer Ankündigung: + +- **Kein Streaming.** Ein Rückstand und ein Token-Strom widersprechen sich. `stream: true` wird + zwar durchgereicht, die Antwort landet dann aber als Rohstrom im Eintrag. Wer Streaming braucht, + ruft das Modell direkt. +- **Abbrechen nur, solange etwas wartet.** Eine laufende Ollama-Anfrage lässt sich nicht sauber + stoppen — ein Abbruch im Zustand `in_progress` wäre ein Versprechen, das die Anwendung nicht + halten kann. +- **Keine Übersetzung von Tool-Calls.** Die Abbildung zwischen OpenAI-`tools` und Anthropic-`tool_use` + ist ein Thema für sich und ist nicht umgesetzt. +- **Bilder fallen auf den nativen Routen weg.** Auf den Wegen zu Anthropic und Ollama werden + multimodale Inhalte auf ihren Text reduziert, weil beide Bilder unterschiedlich genug + transportieren, dass Raten schlechter wäre als eine sichtbare Lücke. + +:::callout{type="warning" title="Ein Worker pro paralleler Anfrage"} +Mehr Worker zu starten, als das Modell gleichzeitig beantworten kann, verschiebt den Rückstand +lediglich aus der eigenen Datenbank in Ollamas undurchsichtige Warteschlange — also genau dorthin, +wo man ihn nicht mehr sieht. Bei Ollama entspricht die richtige Zahl `OLLAMA_NUM_PARALLEL`, in der +Regel zwei. +::: + +## Verfügbar unter MIT-Lizenz + +Das Gateway ist eine Laravel-Anwendung mit PostgreSQL, getestet mit Pest und statisch geprüft auf +PHPStan-Level 10. Es läuft bei uns auf einem Mac unter Herd, hinter einem Cloudflare Tunnel; die +Konfiguration dafür — launchd-Agents und Ingress-Regeln mit Default-Deny — liegt im Repository, +statt in der Shell-History von jemandem zu verschwinden. + +Wir veröffentlichen es so, wie wir es einsetzen. Es löst kein grosses Problem, sondern ein +konkretes: Es macht lokale Modelle für interne Werkzeuge planbar, ohne dass jedes dieser Werkzeuge +seine eigene Warteschlange erfinden muss. + +- [codebar-ag/llm-gateway.codebar.ai auf GitHub](https://github.com/codebar-ag/llm-gateway.codebar.ai) + +Fehlerberichte und Pull Requests sind willkommen. Sicherheitslücken bitte nicht über ein +öffentliches Issue, sondern auf dem in `SECURITY.md` beschriebenen Weg. diff --git a/database/files/news/en_CH/2025-04-06-docuware-7-12-is-here.md b/database/files/news/en_CH/2025-04-06-docuware-7-12-is-here.md index 13c6ade..397c36c 100644 --- a/database/files/news/en_CH/2025-04-06-docuware-7-12-is-here.md +++ b/database/files/news/en_CH/2025-04-06-docuware-7-12-is-here.md @@ -6,7 +6,7 @@ teaser: >- More automation and insight: this release improves e-invoice processing, brings IDP into the cloud configuration and opens workflow data up to analytics. published_at: 2025-04-06 author: sebastian.buergin@codebar.ch -hero: images/news/placeholders/docuware-7-12.svg +hero: images/news/placeholders/docuware-7-12-en.svg hero_alt: Placeholder graphic for the DocuWare 7.12 release tags: [DMS/ECM] --- diff --git a/database/files/news/en_CH/2025-09-15-docuware-7-13-is-here.md b/database/files/news/en_CH/2025-09-15-docuware-7-13-is-here.md index ef52f92..a49f3de 100644 --- a/database/files/news/en_CH/2025-09-15-docuware-7-13-is-here.md +++ b/database/files/news/en_CH/2025-09-15-docuware-7-13-is-here.md @@ -6,7 +6,7 @@ teaser: >- Workflows are now built in the browser, invoice intake copes with foreign e-invoice formats, and logging in can be secured with a second factor. published_at: 2025-09-15 author: sebastian.buergin@codebar.ch -hero: images/news/placeholders/docuware-7-13.svg +hero: images/news/placeholders/docuware-7-13-en.svg hero_alt: Placeholder graphic for the DocuWare 7.13 release tags: [DMS/ECM] --- diff --git a/database/files/news/en_CH/2026-05-12-docuware-7-14-is-here.md b/database/files/news/en_CH/2026-05-12-docuware-7-14-is-here.md index 9ce57c4..81c6b6b 100644 --- a/database/files/news/en_CH/2026-05-12-docuware-7-14-is-here.md +++ b/database/files/news/en_CH/2026-05-12-docuware-7-14-is-here.md @@ -6,7 +6,7 @@ teaser: >- The last settings move into the browser, a rebuilt app puts tasks on your phone, and file cabinets can be moved between two cloud organisations. published_at: 2026-05-12 author: sebastian.buergin@codebar.ch -hero: images/news/placeholders/docuware-7-14.svg +hero: images/news/placeholders/docuware-7-14-en.svg hero_alt: Placeholder graphic for the DocuWare 7.14 release tags: [DMS/ECM] --- diff --git a/database/files/news/en_CH/2026-07-29-llm-gateway-open-source.md b/database/files/news/en_CH/2026-07-29-llm-gateway-open-source.md new file mode 100644 index 0000000..5242f9e --- /dev/null +++ b/database/files/news/en_CH/2026-07-29-llm-gateway-open-source.md @@ -0,0 +1,182 @@ +--- +key: llm-gateway-open-source +slug: llm-gateway-open-source +title: A queue, not a holding pattern — our LLM Gateway is open source +teaser: >- + Local models answer the privacy question, not the capacity one. We built a gateway that accepts + requests for local models, stores them and works through them in order — and we are releasing it + under the MIT license. +published_at: 2026-07-29 +published: false +author: sebastian.buergin@codebar.ch +hero: images/templates/cover-template.jpg +hero_alt: Placeholder graphic for the LLM Gateway +tags: [Open Source, KI] +featured: false +--- + +We work with local language models every day. The reason is unglamorous: the moment a prompt +contains customer data, contracts or internal documents, the question is no longer which model +answers best, but who gets to see the request. A model running on your own hardware answers that by +itself — nothing leaves the building, there is no processing abroad, no data processing agreement to +negotiate, and no debate about whether inputs eventually end up in someone's training run. + +What local models do not come with is capacity. + +## The real problem is concurrency + +A local model is cheap to run and expensive to run *at the same time*. A single GPU — or a Mac's +unified memory — realistically holds one or two concurrent requests before switching between models +costs more than it saves. Ollama's `OLLAMA_NUM_PARALLEL` exists for exactly that reason: the ceiling +is hard, not soft. + +Past it, requests pile up. Whether you built a queue or not makes no difference to that — it only +changes *where* the queue forms. Either somewhere you can see it, or inside Ollama's own scheduler, +where a request that is merely waiting its turn looks identical to one that is stuck. + +For a single developer on a laptop, none of this matters. For internal tools that read invoices, +summarise minutes or classify documents, it quickly becomes an operational problem: one batch run +blocks everything else, a timeout in the calling system throws away an answer the model is still two +minutes away from producing, and nobody can say how long anything will take. + +## What we built instead + +The LLM Gateway is a queue in front of local models — and deliberately nothing else. + +The flow is simple: you send your request exactly as you would send it to the model. The gateway +accepts it, writes it to the database and answers immediately with an id. As soon as capacity frees +up, a worker takes the entry, replays it upstream unchanged and puts the answer back into the same +entry. You collect it with a second call. + +```bash +# submit — answers in milliseconds with an id +ID=$(curl -s https://gateway.example/v1/responses \ + -H "Authorization: Bearer $MY_API_KEY" \ + -H "Content-Type: application/json" \ + -d '{"model":"qwen3-vl:30b-a3b","input":"Extract invoice number and total as JSON."}' | jq -r .id) + +# collect — once the status reads "completed" +curl -s https://gateway.example/v1/responses/$ID \ + -H "Authorization: Bearer $MY_API_KEY" | jq -r '.output[0].content[0].text' +``` + +The API is the one OpenAI defined: `POST /v1/chat/completions` and `POST /v1/responses` behave the +way any SDK expects. The difference is in the response — instead of waiting for the model, you get a +`202` with an id. A chat completion meant to be synchronous is turned into an asynchronous job as +well. That is not a side effect but the point: a queue you can bypass is not a queue. + +## Everything passes through unchanged + +The thing we were most careful about while building it: the gateway does not interpret your request. + +- **The body** goes upstream untouched. Unknown fields are not stripped, a missing `model` is not an + error, and there is no validation of our own to eventually fall behind the model's actual API. +- **The headers** are stored from a fixed allowlist and replayed exactly as they arrived — + including `Authorization` and the `X-Litellm-` tags we use to attribute cost per use case. + Everything else is dropped rather than forwarded; a `Cookie` from a browser has no business + reaching a model. + +From which follows the second point: **the gateway holds no credentials.** There is no master key +and no user table. What authenticates the call upstream is the caller's own key — exactly as it was +when the call went direct. + +Because the upstream call happens long after the original HTTP connection is gone, those headers +have to be kept somewhere. They are stored encrypted with the entry, never returned by the API, +shown on the dashboard by *name* only, and cleared the moment the entry reaches a final status. What +remains is a SHA-256 hash of the token — enough to attribute an entry to its owner, not enough to do +anything with. + +:::callout{type="info" title="Who owns an entry"} +Reading, cancelling and deleting require the same key that created the entry. If it does not match, +the API answers `404` rather than `403` — it never confirms an id it would not serve anyway. +::: + +## Several models, several gateways + +Anyone working locally rarely has exactly one machine. In our case it is a Mac running Ollama, a +LiteLLM instance in front of several models, and — for work with nothing worth protecting in it — a +commercial provider. + +Each of those targets is registered in the dashboard as a "gateway" and gets an id that sits in +front of `/v1` in the URL: + +```bash +curl https://gateway.example/v1/chat/completions # the default gateway +curl https://gateway.example/9f3c8b52-…/v1/chat/completions # one specific gateway +``` + +An SDK configured with `base_url = https://gateway.example/{id}/v1` therefore talks to exactly one +target without any further changes — submitting and collecting alike. Three protocols are supported: +OpenAI-compatible (so LiteLLM, vLLM, Ollama's own shim and anything else in that shape), Anthropic, +and Ollama native. For the latter two the gateway translates out and back; for OpenAI-compatible +targets it stays a pure passthrough. + +| Protocol | Endpoint upstream | Body | +| --- | --- | --- | +| OpenAI compatible | `{base}/v1/chat/completions` | passed through untouched | +| Anthropic | `{base}/v1/messages` | translated out and back | +| Ollama | `{base}/api/chat` | translated out and back | + +Deactivating a gateway stops *new* requests only. Entries already queued stay bound to the target +they were assigned when they were accepted — so moving the default never redirects an answer someone +is already waiting for. + +## Waiting, with a number attached + +A queue that will not say how long it takes is just another black box. Every response about a +waiting entry therefore carries a block of its own: + +```json +"queue": { + "position": 3, + "depth": 7, + "workers": 2, + "estimated_seconds": 84 +} +``` + +`position` counts the entry itself, `depth` is the whole backlog, and `estimated_seconds` runs +through to *your* answer rather than to the moment work on it starts — that is the number worth +showing a person who is waiting. + +It is a projection, not a promise: the median of recent actual response times for the same model, +multiplied by the number of rounds sitting in front of you. What it cannot see is a model swap — a +request that forces Ollama to load a different model takes considerably longer, and no median over +past answers knows that in advance. + +## What the gateway deliberately does not do + +We consider the limits the more honest half of an announcement: + +- **No streaming.** A backlog and a token stream contradict each other. `stream: true` is passed + through, but the answer then lands in the entry as a raw stream. If you want streaming, call the + model directly. +- **Cancelling only while an entry is waiting.** A running Ollama request cannot be stopped cleanly + — cancelling something `in_progress` would be a promise the application cannot keep. +- **No translation of tool calls.** Mapping OpenAI `tools` to Anthropic `tool_use` is a subject of + its own and is not implemented. +- **Images are dropped on the native routes.** On the Anthropic and Ollama paths, multimodal content + is flattened to its text, because those two carry images differently enough that guessing would be + worse than a visibly missing image. + +:::callout{type="warning" title="One worker per concurrent request"} +Running more workers than the model can answer at once merely moves the backlog out of your own +database and into Ollama's opaque queue — precisely where you can no longer see it. With Ollama the +right number is `OLLAMA_NUM_PARALLEL`, usually two. +::: + +## Available under the MIT license + +The gateway is a Laravel application on PostgreSQL, tested with Pest and statically analysed at +PHPStan level 10. Ours runs on a Mac under Herd, behind a Cloudflare Tunnel; the configuration for +that — launchd agents and default-deny ingress rules — lives in the repository instead of +disappearing into somebody's shell history. + +We are publishing it the way we run it. It does not solve a large problem, it solves a specific one: +it makes local models predictable for internal tools, without every one of those tools having to +invent its own queue. + +- [codebar-ag/llm-gateway.codebar.ai on GitHub](https://github.com/codebar-ag/llm-gateway.codebar.ai) + +Bug reports and pull requests are welcome. For security vulnerabilities, please do not open a public +issue — use the process described in `SECURITY.md`. diff --git a/prompts/images-news.md b/prompts/images-news.md new file mode 100644 index 0000000..4055517 --- /dev/null +++ b/prompts/images-news.md @@ -0,0 +1,156 @@ +# Generating news hero placeholders + +Follow this file whenever a news article needs a hero image and no real photograph or +screenshot exists. The output is a **pair** of files per article — one SVG for the page, +one PNG for social crawlers. + +You do not hand-write these. `scripts/make-news-hero.py` lays out the type, because the +whole point of the design is that the text block starts at exactly the same place on every +hero regardless of how long the title is — and SVG has no text wrapping, so that only stays +true if something measures the font. Your job is the wording, the tags and the motif. + +## 1. Making one + +```bash +scripts/make-news-hero.py docuware-7-14 \ + --locale de \ + --title "DocuWare 7.14 ist da" \ + --tags DMS/ECM \ + --motif dms-ecm +``` + +Writes `public/images/news/placeholders/docuware-7-14-de.svg` and the matching `.png`, then +prints the front-matter lines to paste. + +- **slug** — lower-kebab, describes the *subject* (`docuware-7-14`), not the article. +- **`--locale`** — appended to the file name. **Every localised article needs its own + hero**, because the title is baked into the graphic: `DocuWare 7.14 ist da` and + `DocuWare 7.14 is here` cannot share one file. Omit `--locale` only for a hero with no + language in it. +- **`--title`** — the article's `title:` verbatim. Do not shorten it to make it fit; the + script steps the type size down instead. +- **`--tags`** — the article's `tags:`, in order, space-separated. Quote any that contain + spaces. Zero tags is allowed; the row just disappears and nothing else moves. +- **`--motif`** — see §4. + +Then wire it into the article's front matter, path relative to `public/`: + +```yaml +hero: images/news/placeholders/docuware-7-14-de.svg +hero_alt: Platzhaltergrafik zum DocuWare-Release 7.14 +``` + +`hero_alt` is real alt text and belongs in that locale's language — the script cannot write +it for you. `App\Support\NewsImage` resolves the `images/…` prefix as a local path, and +`NewsImage::ogImage()` swaps `.svg` for `.png` when emitting `og:image`. + +## 2. The layout + +1600×900, and it hangs off one fixed anchor on the left at x=80: + +| Element | Position | Notes | +|-------------|---------------------------------|------------------------------------------| +| Accent rule | x 80, y 200, 132×8 | fixed — the top of the block, always | +| Tag row | x 80, y 246, pills 50 tall | grows rightwards; absent if no tags | +| Title | x 80, first baseline y 390 | wraps within a 900-wide column | +| Motif | 1040, 180 → 1520, 660 | the one thing that changes per topic | +| Logo | 1256, 758 → 1520, 814 | codebar logo, bottom-right | + +**Nothing above the title moves.** A one-line title and a four-line title both start at +y=390; the long one simply runs further down. That is the property the whole design exists +to protect, so do not "balance" a short title by nudging it lower. + +The title auto-fits down a ladder of `(size, line-height, max lines)`: +`(76, 92, 3) → (64, 78, 4) → (56, 68, 4)`. The first rung whose wrap fits is used, and the +last rung's line count is what keeps the longest title clear of the logo. A title that +still overflows prints a warning — that is a signal to shorten the *article* title, not to +edit the layout. + +Margins are 80 left and right. The bottom is 80 × 1.0714, because the PNG export in §5 +compresses the vertical axis and that factor makes the margins land visually equal. + +**The background is fixed and identical on every hero**, in every language: the rings are +concentric at (150, 880) — bottom-left, so only arcs show — with radii 540 / 400 / 262 / 130, +the dot field is bottom-left behind them, and the band sits at x=900. None of it varies per +article or per locale. Two heroes differ only in their words and their motif; if you find +yourself wanting to vary the background to tell articles apart, change the motif instead. + +## 3. Palette and type + +Only these values. No new hues, ever. + +| Token | Hex | Used for | +|--------------|-----------|---------------------------------------------------| +| brand | `#500472` | rule, tag pills and text, every motif stroke/fill | +| brand-strong | `#3a0354` | the title | +| wash start | `#ffffff` | background gradient stop 0 | +| wash end | `#f4eef8` | background gradient stop 1 | +| paper | `#ffffff` | motif surfaces (cards, documents, panels) | + +The codebar logo is the one exception: it brings its own ink and its own magenta→blue +gradient strip. Those arrive with the asset and are never recoloured to match. + +Depth comes from `opacity` on brand, never from another colour: `0.05` (band) · `0.10–0.22` +(rings, tag pills, slots) · `0.16` (motif body lines) · `0.35–0.55` (motif accents) · `1.0` +(type). + +One typeface, Poppins 600, embedded as base64 in the SVG. That is not decoration: +`rsvg-convert` cannot fetch a webfont and Poppins is not a system font, so without embedding +the PNG silently falls back to Helvetica. The script handles it. + +## 4. Motifs — the only thing that changes per topic + +Pick with `--motif`. Current set, all defined at the bottom of `scripts/make-news-hero.py`: + +| Name | Reads as | Use for | +|-------------|-------------------------------------------------------|----------------------------| +| `dms-ecm` | a queue of stacked documents seen edge-on, each with the stage it has reached as a pill, the front one fully drawn, indexed and approved — the stack *is* the workflow | DMS/ECM, DocuWare, workflow, automation | +| `archive` | documents standing in an open drawer, one pulled up and indexed, magnifier over it — storage rather than processing | archiving, retention, migration | +| `editorial` | a page built from blocks, with a colour row | Styleguide, Redaktion, anything about the site | +| `documents` | a plain stack of documents, signed off | the neutral fallback | + +To add one, write a function that draws inside a **480×480 box at the origin** and register +it in `MOTIFS`. Nothing else in the layout changes. The rules that keep a new motif in the +family: + +- White surfaces with a `#500472` stroke at `stroke-opacity` 0.16–0.35, `stroke-width="2"`, + `rx="14"`–`rx="16"` on the large shapes. +- Content inside a surface is suggested, never literal: rounded bars (`rx` = half the + height) at `opacity="0.16"` for body text, one bar at `0.55` for a heading. +- Depth by stacking two or three offset copies at rising opacity (0.75 / 0.85 / 1.0), and + by putting a darker slot *behind* an element so things read as going into it — not by + shadows or blur. +- At most one flourish that carries meaning — a magnifier, a check, an arrow. +- No gradients inside a motif, no text, no third-party logos or trademarks. +- It must still read at ~300px wide, which is the size in the article card where most + people will see it. + +The whole motif group is tilted `rotate(-4)` about the box centre; leave that to the script. + +## 5. Rendering + +The script renders the PNG itself via `scripts/render-news-og.sh` (pass `--no-png` to skip). +To re-render every hero after changing the layout: + +```bash +scripts/render-news-og.sh +``` + +Requires `rsvg-convert` (`brew install librsvg`) and `fontTools` (`pip install fonttools`). +The PNG is **1200×630**, which is what `config/seo.php` declares in `og:image:width` / +`og:image:height` for every page. That squashes the 16:9 artwork vertically by 6.7 %; it is +an accepted trade-off and the layout is built around it. Do not change the export size +unless `config/seo.php` changes with it. + +## 6. Before you commit + +- [ ] One hero per locale, and the file name ends in the right `-de` / `-en`. +- [ ] Rings bottom-left at (150, 880) — the same on this hero as on every other one. +- [ ] Title in the graphic matches the article's `title:` exactly, in that locale. +- [ ] Tags in the graphic match `tags:`, same order. +- [ ] The script printed no warning about line count or tag-row width. +- [ ] SVG and PNG both exist, same basename, PNG is 1200×630. +- [ ] Open the PNG: the title is Poppins, not Helvetica. +- [ ] `hero:` and `hero_alt:` set in **every** locale file, alt text in that language. +- [ ] Viewed at card size (~300px): the motif still reads and the title is legible. +- [ ] `git status` shows no orphaned placeholder left behind by a rename. diff --git a/prompts/network.md b/prompts/network.md new file mode 100644 index 0000000..d09c142 --- /dev/null +++ b/prompts/network.md @@ -0,0 +1,123 @@ +# Generating network partner drawings + +Follow this file when a partner on `/network` has no usable logo file and needs a flat +drawing instead. Reference implementations: `public/images/network/docuware.svg` (a +partner drawing) and `public/images/placeholders/network-company.svg` (the generic +fallback). Open one of them alongside this document. + +These are a **different family** from the news heroes in `images-news.md` — much smaller, +no type, no gradients, and deliberately naive. Do not carry news-hero conventions over. + +## 1. Where the files go + +``` +public/images/network/.svg ← drawing for one specific partner +public/images/placeholders/network-company.svg ← the generic fallback, already exists +``` + +`` must match the partner's `key` column exactly — `resources/views/app/network/index.blade.php` +resolves `images/network/{$network->key}.svg` by `file_exists()`, with no registration step +anywhere. Get the key wrong and the card silently falls back to the generic placeholder. + +The cascade the view walks, in order: + +1. `cover_url` on the model (a real uploaded logo) — wins if set, +2. `images/network/.svg` — the drawing you are making, +3. `images/placeholders/network-company.svg` — generic, rendered at `opacity-70`. + +So a drawing is only ever a stand-in for a missing logo. When the partner supplies real +artwork, `cover_url` takes over and the SVG can be deleted. + +## 2. Canvas + +```xml +` has an empty `alt`. + +Keep the one-line HTML comment naming the subject — it is how the next person tells the +files apart without rendering them. + +Everything lives between **x 8–152** and **y 14–88**. There is no bleed and no +off-canvas geometry; at this size a clipped edge just looks like a bug. + +## 3. Palette + +Four values. Nothing else, and no gradients — flat fills only. + +| Token | Hex | Used for | +|---------|-----------|---------------------------------------------------| +| brand | `#500472` | one accent per drawing, plus the shrubs | +| mid | `#d1d5db` | the primary mass — the biggest shape | +| light | `#e5e7eb` | secondary masses, ground line | +| white | `#ffffff` | cut-outs: windows, handles, text lines | + +The brand colour is an **accent, not a fill**. One element carries it (a drawer, a roof +band, a magnifier, a door) at full strength or `opacity="0.65"`. If two things are purple, +one of them is wrong. + +## 4. Composition + +Five layers, in this order: + +1. **Ground line** — ``. + Identical in every drawing; it is what makes the set feel like a set. +2. **Primary mass** — the subject, in `#d1d5db`, roughly 40–45 units wide and 60–70 tall, + centred near x=80 and standing *on* the ground line (bottom edge at y=86). +3. **Secondary masses** — one or two supporting shapes in `#e5e7eb`, shorter than the + primary, flanking it. Never taller, or the silhouette goes flat. +4. **Detail** — white cut-outs at `rx="1"`–`rx="2"`: windows on a 10-unit grid, text lines + as `height="3" rx="1.5"` bars, handles as `width="8" height="4" rx="2"` pills. Suggest, + do not describe. +5. **Shrub accents** — always exactly these two, closing the composition: + +```xml + + +``` + +Corner radii: `rx="2"`–`rx="3"` on masses, `rx="1"`–`rx="2"` on details. Strokes only where +a shape is genuinely an outline (a magnifier ring) — `stroke-width="4"`, otherwise fill. + +## 5. Choosing the subject + +Draw what the partner *does*, in one object a person recognises at 64 px tall: + +- DMS/ECM → filing cabinet with a document pulled out (`docuware.svg`) +- generic company → three buildings, tallest in the middle (`network-company.svg`) + +Existing drawings to check before inventing another: +`baselhack` · `docuware` · `iway` · `odoo` · `pst` · `swiss-digital-services` · +`swiss-laravel-association` · `swiss-made-software` · `wieland-business-solutions`. + +Hard limits at this size: no text, no gradients, no shadows, no more than ~30 elements, and +**no third-party logos, wordmarks or trademarked shapes** — the whole point is that we do +not have the partner's mark. + +## 6. No codebar logo here + +Unlike the news heroes, these drawings carry **no codebar logo**. They stand in for +*another company's* logo inside that company's card — stamping our wordmark on it would +misattribute it. The 160×96 canvas has no room for a legible mark anyway. + +## 7. No PNG + +Network drawings are SVG only. They are decorative in-page images, never `og:image` +candidates, so nothing renders a raster copy. Do not run `scripts/render-news-og.sh` +against them. + +## 8. Before you commit + +- [ ] Filename equals the partner's `key` exactly (`Network::where('key', …)`). +- [ ] `viewBox="0 0 160 96"`, `role="img"`, `aria-hidden="true"`, subject named in a comment. +- [ ] Ground line and both shrub circles present, unmodified. +- [ ] Exactly one brand-coloured accent. +- [ ] No hex outside the table in §4; no gradients, no text, no partner trademark. +- [ ] Nothing outside x 8–152 / y 14–88. +- [ ] Checked at 64 px tall — the silhouette still reads. +- [ ] Partner card renders the drawing, not the generic placeholder (`cover_url` is null). diff --git a/public/images/news/placeholders/docuware-7-12-de.png b/public/images/news/placeholders/docuware-7-12-de.png new file mode 100644 index 0000000000000000000000000000000000000000..52870971a51b3ce16780752a806f86e38d3b0dd9 GIT binary patch literal 88028 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
`uqxr;P4&yfeY}?N zX?MueM6YOK4)HX|p_WOHNL{TO` z$boQ+$eAr1M{qm2kqF-W;{M4VYK#V1CBssOa1RZUEK>+m^F^Bz8`^wwF(+2V;!+&p zlYs!2zd)hiM}H<6M{td3_jJS=JDXzSg?7eL<5pEFn~ zI5qu6%#z5fbRgT5wO>M^WS^=$OKq&W_~NME>dG^7RH$9d=uF$+g>TFs?Y7xAx2~w# z{i6ow-~5@8wCB}}N!l)8{PK6}5yx!tjmD3Ey60(t3;1j4@W%aEy-5$jVH@L1Qk2&T zBoId3sWjx44Bj_tuV@4J5`(HToYbPMTXzB77qO7Bd%T%{^~(O^i`W_bk*V>#V5#73 zqA^<8m(tRVh@c}_pfj)bu33Pu?(yNMnUigOgkqB3QKnI>#&E5CXJb;tuQ84ElokXu z1Tc}}zxA-<-!2zKq0Vt*7<02x#4Njwm+2wGKV&?#ojfpK6fA@>y~*-1O8W`=HKTsVB&|6<3z+# zQvpmP(^8!)+W0ybRYqi}cyfe!Su*K!GhsPI5Km>xhc45J1EAsao@+`C7ofW!K$a+r zY2Pl$1r1OHQh8>rN^j1!g5MBU5Sgbe6)FNn?1?{ekTp~)IjYR4B92x2! z)62XeKOUbs=~-+~xmVqxYBcf26$HqJ>;ji+zq?@vG7-3RiOS}$P&z1CR2(@Nm_0YQ zWo}i6p@1bl{4)qp12h40)N!$wrMr-mk1XTEZM@^=Tw?RiNG^Zb63sxT5gY~>aKKp` zRObet#You--C#y4PzLLts#4^2)+R>sEyuywD$vGiN4UK|gmNkZ?LWN%NCjSG>=PxA XQXk8a)Mudf0fFSClp*C3MnV4%XMt