Changelog
Every shipped change, newest first. Sourced from CHANGELOG.md in the repo.
- 2026-06-18
Fix
- ·Preset-Laden ĂŒbertrĂ€gt jetzt den Effekt-Typ ans GerĂ€t (#80). Beim Laden einer
.prst-Datei â und beim Speichern in einen Slot â sendete der Editor nur Toggle, Parameter und Author per USB-MIDI, aber nie den Effekt-Typ selbst (SysExsub=0x14). Das GerĂ€t behielt dadurch seinen zuvor geladenen Algorithmus pro Block, sodass Parameter und An/Aus-Zustand auf dem falschen Effekt landeten (die App zeigte z. B. âUK 800", wĂ€hrend das GerĂ€t noch âTweedy" hatte und keine Werte ĂŒbernahm). Beide Sync-Pfade senden jetzt pro Block in der Reihenfolge Effektwechsel â Parameter â Toggle, mit kurzer Settling-Pause, damit das GerĂ€t den Algorithmus umschalten kann, bevor die Parameter ankommen.
- ·Preset-Laden ĂŒbertrĂ€gt jetzt den Effekt-Typ ans GerĂ€t (#80). Beim Laden einer
- 2026-05-19
Security
- ·Admin-Flag wird auf allen öffentlichen Read-Paths enforced. Gallery,
/api/share/[token],/share/[token]/download,/share/[token]/jsonund Sitemap filtern jetzt zusĂ€tzlich aufflagged: false. Bis hierher konnte ein admin-geflaggtes Preset weiter ausgeliefert und von Googlebot gecrawlt werden â Moderation entzieht Inhalte jetzt tatsĂ€chlich. - ·
fast-xml-builderHIGH-Advisory geschlossen â (GHSA-5wm8-gmm8-39j9, CVSS 6.1) durchnpm update @aws-sdk/client-s3. Erreichte prod via@aws-sdk/xml-builder. - ·Admin-PATCH-User akzeptiert keine Email-Ănderung mehr. Bisher konnte ein kompromittierter Admin-Account Victim-Emails ĂŒberschreiben und sofort einen Password-Reset triggern â Account-Takeover. Email-Ănderungen brauchen jetzt einen Out-of-Band-Weg.
- ·Avatar-Upload gehÀrtet: Magic-Byte-Probe (JPEG/PNG/WebP Signaturen),
limitInputPixels: 25 Mund try/catch umsharp()â eine PNG-Bombe oder umbenannte BinĂ€rdatei erzeugt jetzt 400 statt 500 mit CPU-/RAM-Spike. - ·Avatar-Cache
immutableentfernt â (Cache-Control: public, max-age=3600). Eine Admin-User-Löschung wirkt jetzt innerhalb einer Stunde an jedem Cache-Layer.
Fix
- ·Middleware-Auth-Guard erkennt
pt-BR. Die Regex(de|en|es|fr|it|pt)war beim Locale-Add nicht mitgezogen worden, sodass/pt-BR/profile&/pt-BR/adminden Cookie-Presence-Check der Middleware ĂŒbersprangen. Page-Level-validateSessionhat es abgefangen â kein Datenleck â, aber Defense-in-Depth weg. Regex wird jetzt ausLOCALESgeneriert; Test stellt sicher, dass jeder Eintrag der LOCALES-Tuple gematcht wird. - ·
/api/admin/commentsnutztwithAdminAuth-Wrapper â statt manuellemtry/catch(requireAdmin)â konsistent zu allen anderen/api/admin/*Routen.
- ·Admin-Flag wird auf allen öffentlichen Read-Paths enforced. Gallery,
- 2026-05-19
Features
- ·30 s Audio-Schnipsel pro Preset. Owner können beim Save-to-Gallery oder nachtrÀglich auf
/share/[token]ein MP3- oder M4A/AAC-File (max 30 s, max 2 MB) anhĂ€ngen. Player erscheint auf der Share-Page (voll), im Homepage-Featured-Block und auf jeder Gallery-Card (Icon). Nur ein Player spielt gleichzeitig â Klick auf einen Card-Play pausiert alle anderen. - ·Admin-Audit fĂŒr fremdes Audio. Wenn ein Admin Audio eines fremden Presets ersetzt oder löscht, wird die Aktion mit Reason (bei Delete) im AdminAction-Log auditiert.
Storage / Validation
- ·Neuer Garage S3-Bucket
gp200editor-audio. Server prĂŒft Mime + Magic Bytes + GröĂe (†2 MB) + Dauer (†30.5 s viamusic-metadata) vor jedem S3 PUT.
Schema
- ·Drei neue nullable Felder auf
Preset:audioKey,audioMimeType,audioDurationMs.
- ·30 s Audio-Schnipsel pro Preset. Owner können beim Save-to-Gallery oder nachtrÀglich auf
- 2026-05-19
Features
- ·Brasilianisches Portugiesisch (pt-BR) als 7. Locale. Vorher war
pt.jsonfaktisch brasilianisch ĂŒbersetzt (Salvar/Senha/usuĂĄrio/arquivo); der Inhalt wandert nachpt-BR.jsonund steht jetzt brasilianischen Nutzern als eigenes Locale mit đ§đ·-Flag im Switcher zur VerfĂŒgung.pt.jsonwurde mit ~175 gezielten Substitutionen auf echtes europĂ€isches Portugiesisch konvertiert (Guardar/Palavra-passe/utilizador/ficheiro/Iniciar sessĂŁo/A guardar/A carregar/Ligar/Registo/Rastreio).
i18n-Polish (Sprach-Review aller 7 Locales)
- ·DE/IT: 4 Admin-Buttons (
Unpublish/Republish/Flag/Unflag) waren noch englisch â jetzt ĂŒbersetzt. - ·DE:
home.featured.titlehatte den âFeatured ·"-PrĂ€fix verloren â wieder dran. - ·IT:
home.featured.titlehatte âTop Rated" englisch â jetzt âPiĂč votati". - ·FR: tu/vous-Inkonsistenz behoben â drei FAQ-Antworten + zwei Tooltips + die Verify-Confirm-Seite waren in
vous, wÀhrend die App sonsttunutzt. E-Mail-Templates bleiben bewusst invous(formaler Kontext). - ·PT-BR: Ein EU-PT-Slip in
gallery.rate.ownPresetTooltipkorrigiert.
Fix
- ·Ăbersetzungs-Skript-Bug korrigiert. Beim BRâEU-Sweep der
legal.privacyOverviewTextwurde âsalvo quando exigido por lei" (im Sinne von âauĂer wenn") fĂ€lschlich zu âguardado quando exigido por lei" umgeschrieben. ZurĂŒckgedreht.
- ·Brasilianisches Portugiesisch (pt-BR) als 7. Locale. Vorher war
- 2026-05-19
Security
- ·Comments leak after un-publish â fixed.
GET /api/presets/[id]/commentsnow refuses to return the thread when the preset has been made non-public or flagged. POST top-level + Reply gained the same gate (Reply previously checked neither). Anyone who had the preset id from a previous public link can no longer continue reading a thread the author tried to retract. - ·Featured-Preset Sybil-Dampening verstÀrkt. Bayes-Konstante
mvon 5 auf 10 â eine einzelne 5â -Bewertung von einem Accomplice-Account scoret jetzt nur noch ~4.09 (statt 4.17) und schiebt sich nicht mehr vor etablierte Presets mit echtem Rating-Verlauf.
Bugfixes
- ·Inline-Rating Optimistic-UI ohne Rollback â bei fehlgeschlagenem POST blieb die UI bei der Phantom-Bewertung. Snapshot+Restore +
errorTooltip-Toast. - ·Comment-Textarea verlor Inhalt bei 429/Auth-Fail â
CommentFormclear jetzt nur bei Success; bei Fehler steht der Text zum Retry da. - ·CommentSection swallowed 401/5xx silently â separate Toasts fĂŒr Rate-Limit, Session-Expired und generischen Fehler.
- ·Gallery-Rating Page 2+ zeigte falschen Count â bereits-bewertete Presets jenseits der ersten SSR-Page bekamen
existingRating=0, was bei Re-Rating zu Phantom-Counts fĂŒhrte. Session-Lookup zog ans/api/gallery-Endpoint, jede Card trĂ€gt jetzt korrekte Rating-Context. - ·AdminCommentsTab hatte keine Pagination-UI â alle Comments jenseits der ersten 50 waren unerreichbar. Load-More-Button + In-Flight-Guard.
UI / i18n
- ·Confirm-Dialog vor User-Soft-Delete. Klick auf âDelete" beim eigenen Kommentar öffnet jetzt einen BestĂ€tigungsdialog (Soft-Delete ist nicht reversibel â
bodywird genullt). Admin-Hard-Delete behĂ€lt seinen separaten Reason-Dialog. - ·Drei hardcoded englische Strings korrigiert â (
CommentsHeader,Email verification required, Admin-Cancel-Button) â jetzt in allen 6 Locales ĂŒbersetzt. - ·Toter i18n-Key entfernt â (
comments.adminDeleteReasonLabelâ Admin-Tab nutztadmin.comments.hardDeleteReasonLabel).
Schema / Performance
- ·Index
Comment(createdAt DESC)â die Admin-Moderation-Liste sortiert ohnepresetId-Filter; der bisherige Compound-Index half nicht. Cheap forward-looking change. - ·Shared
commentSerializerâ Avatar-Mapping (avatarKey â /api/avatar/<key>) lebt jetzt insrc/lib/commentSerializer.ts; PATCH gab bisher den Raw-avatarKeyzurĂŒck, alle anderen Routes serialisierten zuavatarUrl. Inkonsistenz behoben.
- ·Comments leak after un-publish â fixed.
- 2026-05-18
Features
- ·Inline-Rating in der Gallery â Bewertungen können direkt auf der Gallery-Liste abgegeben werden. Anonyme Klicks zeigen einen Tooltip mit Login-Link; eigene Presets sind erwartungsgemÀà nicht bewertbar.
- ·Kommentare auf Share-Pages â Plaintext-Kommentare mit 1-Level-Threading (Top-Level + Reply), max 1000 Zeichen, URLs werden automatisch verlinkt (
rel=nofollow). Verifizierte User können kommentieren, jederzeit editieren und soft-löschen. Soft-Delete zeigt einen Platzhalter, Replies bleiben sichtbar. - ·Admin-Moderation fĂŒr Kommentare â Neuer Tab im Admin-Dashboard: Liste der letzten 50 Kommentare. Hard-Delete erfordert einen Grund (5â200 Zeichen) und wird im AdminAction-Log auditiert; kaskadiert auf Replies.
- ·Featured Preset auf der Startseite â Bayes-Average (m=5, C=globaler Durchschnitt) ĂŒber alle Presets mit Ratings der letzten 30 Tage. Hero-Block mit Signal-Chain-Grafik (Amp/Cab-Realnamen), Sternebewertung, Beschreibung und den 3 neuesten Kommentaren. Fallback auf All-Time-Best wenn das 30-Tage-Fenster leer ist.
- ·FX-Loop SEND/RETURN editor â neuer Insertion-Point-Editor analog zum offiziellen Valeton GP-200 Editor. Pfeile (
âSEND,âRETURN) lassen sich per Drag & Drop oder Tastatur (â/â) zwischen den 11 Effekt-Slots (PREâŠVOL) verschieben. Bypass-Anzeige wenn SEND === RETURN. ARIA-konform (role="slider", vollstĂ€ndige Screenreader-Labels in allen 6 Sprachen). - ·Live MIDI fĂŒr FX-Loop â SEND/RETURN-Bewegungen werden bei verbundenem GerĂ€t sofort als SysEx
sub=0x20ans Pedal geschickt. Push-Constraint (SEND †RETURN) feuert bei Bedarf zwei Messages, um beide Pfeile synchron zu halten. - ·
.prstCodec fĂŒr FX-Loop â SEND/RETURN werden an Bytes0x92/0x93(innerhalb des Routing-Section-Headers) gelesen und geschrieben. Round-Trip-stabil, inkl.rawSource-basierter Presets.
Schema
- ·Neue Tabelle
Commentâ mit Self-FK fĂŒr 1-Level-Threading (parentIdnullable), Soft-Delete-Marker (deletedAt/deletedBy), Cascade-Delete bei Preset/User/Parent-Removal.
Protocol
- ·
sub=0x20Reorder vs. FX-Loop Move differenziert âdecoded[14]/[15]halten SEND/RETURN (vorher fĂ€lschlich als Konstanten markiert);decoded[27]ist ein Diskriminator:0x08= SEND verschoben,0xBA= RETURN verschoben,0x44= reine Routing-Umordnung. Reverse-engineered aus zwei USB-MIDI-Captures (2026-05-18), byte-fĂŒr-byte verifiziert.
- 2026-04-11
Features
- ·PRST Library + JSON API â 145 curated Valeton GP-200 presets ingested from guitarpatches.com, each served with real-world amp/cab names (e.g. "MarshallÂź JCM800", "FenderÂź '65 Twin Reverb"). New
/api/share/[token]/jsonendpoint serves a round-trip JSON document with signal chain, highlights, and raw preset data. - ·SEO-crawlable signal chain on share pages â every share page now renders the full effect chain as semantic HTML with both Valeton fake names and real-world brand names. Google rich results supported via schema.org/Product markup per preset.
- ·Amp category landing pages â 64 new pages at
/[locale]/amp/[slug](e.g./en/amp/marshall-jcm800,/en/amp/mesa-boogie-dual-rectifier-modern-mode), each listing all presets using that amp. Pre-rendered for both locales. - ·hreflang + canonical + JSON-LD â every share page gets
<link rel="alternate" hreflang>for de/en/x-default,<link rel="canonical">, schema.org/Product JSON-LD with auto-extracted brand, Open Graph + Twitter Card metadata. - ·Dynamic Open Graph images â 1200Ă630 PNG per share page generated on demand via Next.js 15
ImageResponse, showing preset name + amp + cab real names with Preset Forge branding. - ·Ingest pipeline â new
scripts/ingest-presets.tsCLI with four source adapters: guitarpatches.com (polite 10s crawl delay), GitHub Code Search, Valeton factory folder, and a manual curated-URL list. Automatic validation (TSRP magic + checksum), dedup by source URL + sha256 content hash, auto-generated descriptions + tags. - ·Sitemap coverage â 586 URLs including 128 amp category pages, 450 preset URLs (de/en/json), and 8 static pages. Force-dynamic so newly-ingested presets become indexable without redeploying.
Bugfixes
- ·Decoder NaN handling â real .prst files from guitarpatches.com carry NaN bytes in unused effect params; the decoder now substitutes 0 so validation doesn't drop ~10% of the library.
- ·Factory-size checksum â 1176-byte factory presets no longer trip the out-of-bounds read at offset 0x4C6.
- ·Description generator â
generateDescriptionno longer produces "cabinet cabinet" when the real name already contains the module label. - ·metadataBase â Open Graph image URLs now resolve to
https://preset-forge.com/...instead ofhttp://localhost:3000/....
Local CI
- ·GitHub Actions removed â replaced with
scripts/local-ci.shrunning lint + typecheck + vitest + next build locally. Newnpm run cientry point.
Performance + Security (pre-library)
- ·Paginated
GET /api/presetsand/presetsSSR page (default 100, max 500) â previously unbounded. - ·Capped
sitemap.xmlquery at 10 000 rows withorderBy: updatedAt desc. - ·Memoized
getEffectParamslookup inEffectParams. - ·Middleware regex compilation moved to module scope (single pattern instead of three per request).
- ·
next-intlupgraded to 4.9.1 (GHSA-8f24-v5vv-gm5j open redirect). - ·
DELETE /api/admin/users/[id]refuses to delete admins â forces an auditable PATCH demotion first. - ·Per-IP rate limit on
/api/auth/forgot-passwordalongside the existing per-email limit, closing the account enumeration side-channel.
- ·PRST Library + JSON API â 145 curated Valeton GP-200 presets ingested from guitarpatches.com, each served with real-world amp/cab names (e.g. "MarshallÂź JCM800", "FenderÂź '65 Twin Reverb"). New
- 2026-03-24
Features
- ·Live param updates from hardware â When the user turns knobs on the GP-200 (Volume, Gain, Presence, Bass, Middle, Treble), sliders update in real-time in the webapp. New sub=0x10 DâH knob notification parsing with discriminator (bytes[29:37]=all zeros = knob, otherwise = toggle).
- ·AMP Head Panel â New
AmpHeadPanelcomponent showing the AMP block's main knobs (Gain/Presence/Volume + Bass/Middle/Treble) prominently at the top of the editor. Auto-detects AMP model from preset. - ·Collapsible head sections â AMP Head, Preset Info + Patch Settings, and Controller sections can be independently toggled via a button bar at the top of the editor.
- ·Auto-load preset names â After device connect, all 256 preset names load automatically in the background. Previously required opening the slot browser first.
Bugfixes
- ·Correct initial slot detection â State dump decoded[8:10] LE16 contains the active slot. Previously always returned slot 0. Verified via captures 084047 (slot 13/04-B) and 084156 (slot 0/01-A).
- ·Bank switching on device slot change â When device changes to a slot in a different bank, editor now pulls the entire new bank and switches tab. Previously loaded wrong preset into wrong tab.
- ·MIDI operation serialization â Background
loadPresetNamesno longer conflicts withpullPreset/pushPreset. AddedpauseNameLoading()that aborts name loader before any pull/push/write operation. - ·Nibble-encode slot for slots > 127 â SysEx data bytes must be 0-127. Slot 252 (64-A) was sent as raw 0xFC (invalid). Now nibble-encoded at [25:26] in
buildPresetChangeand decoded inonMidiMessage. - ·Status bar shows editor preset name â
currentPresetNamefrom editor takes priority over stale cachedpresetNames. - ·ControllerPanel visible when disconnected â Shows at 50% opacity instead of hidden.
- ·Cache-Control no-store in dev mode â Prevents browser from serving stale JS after code changes.
Protocol
- ·State dump header decoded â decoded[0:10]: constants + active slot at [8:10] LE16. Verified via captures 084047 (slot 13/04-B) and 084156 (slot 0/01-A).
- ·DâH Knob notification (sub=0x10) byte[22]=block, byte[24]=param, [29:37]=zeros discriminator, [37:45]=nibble float32 value. AMP block=3: param 0=Gain, 1=Presence, 2=Volume, 3=Bass, 4=Middle, 5=Treble.
- 2026-03-23
Features
- ·EXP controller assignments â Hardware-verified EXP1/EXP2 parameter selection + min/max via SysEx (sub=0x14 + sub=0x18).
- ·NAM upload analysis â Captured IR upload protocol (sub=0x1C, multi-chunk).
- ·Patch Settings â VOL/PAN/Tempo live editing via sub=0x10.
Protocol
- ·Save-to-Slot sub-slot index â decoded[4] = A(0)/B(1)/C(2)/D(3). Without this, save always wrote to slot A.
- ·Effekt-Change-Response (sub=0x0C) Block index, effect ID decoded from DâH notification.
- ·EXP/Controller Assignment â Navigation (sub=0x18) + Min/Max write (sub=0x14), hardware-verified.