Routes and Features
Routes-and-Features.mdRoutes and Features
Core Content Routes
/
homepage with dynamic latest feed, latest journal, and music cards.
/feed
- list/search/paginate feed posts from
data/feed/*.txt - create visibility depends on admin or
allowedPagescontainingfeed - create composer supports recorded voice notes; accepted recordings request browser noise suppression, echo cancellation, and auto gain when available, are previewed before posting, capped at 2 minutes, transcoded to compressed
.m4a, stored underdata/audio/voice/, and played with inline controls that include a1x/1.5x/2xspeed toggle - deleting a feed post removes voice note files referenced by the post body and its replies
- writes derived
index.toml @mentionsin BBCode are highlighted client-side for notification-aware feed posts
Related:
/feed/create/feed/edit/feed/posts/{id}
/feed/create
- requires admin or
allowedPagescontainingfeed - hardcoded
toastsees a Groq-powered post generator before the BBCode editor - Toast generation can be random or prompt-guided, uses already-published non-Toast feed posts only as weak text style samples, has a 5-step length slider from one-liner to trauma dump, then fills and unlocks the editor
- if a non-Toast post mentions
@toast, Toast may automatically add a reply to that post using the post as context after a 1 minute delay
/feed/posts/{id}
- single-post thread view for a feed item
- logged-in users can reply with BBCode, image uploads, and recorded voice notes using the same inline speed-toggle playback controls
- reply edit/delete is allowed for the reply author, admins, the original post owner, or accounts with
allowedPagescontainingcomments - replies persist under
data/feed/replies/{postId}.json - deleting a reply removes voice note files referenced by that reply
- when a non-Toast user replies to a Toast-owned post or mentions
@toastin a reply, Toast may automatically reply after a 1 minute delay with a short old-style Twitter-sized response and starts by mentioning that user
/journal
- list/search/paginate journal posts from
data/journal/*.txt - create visibility depends on admin or
allowedPagescontainingjournal - published journal bodies are trusted HTML
- preview/edit flows support draft files and optional
FORMAT:html
Related:
/journal/create/journal/create/preview/journal/edit/journal/edit/preview/journal/posts/{id}
/guestbook
- list entries from
data/guestbook/*.txt - one-post-per-IP gate via
data/guestbook/ip_index.json - owner/admin edit and delete flow
Related:
/guestbook/create/guestbook/edit
/music
- builds album grids from
data/music/frdg3/.jsonanddata/music/cactile/.json - songs reference
data/audio/* - integrates with the shared mini player; album clicks open an on-site popup track picker, while singles/remixes play directly
/gallery
- paginated listing of
data/images/* - admin delete actions call
/api/gallery/delete
/bookmarks
- server-rendered bookmark listing for logged-in users
- client-side localStorage enhancement for anonymous users
- supports feed and journal bookmark ids; legacy
newsletter:*ids are ignored
/tools/upload
- browser-to-browser encrypted file transfer using WebRTC data channels
- PHP stores only short-lived room/signaling metadata under
data/upload/rooms.json; uploaded file bytes are never stored server-side - creating a room chooses whether the creator is the sender or receiver, then produces a
/tools/upload/?r={token}share link - access is limited to the creator browser plus the first guest browser through the HttpOnly
fridg3_upload_peercookie; later browsers receiveroom_full - peers exchange ephemeral ECDH public keys through signaling and encrypt file chunks with AES-GCM before sending
- plaintext chunks are kept below WebRTC's common 64 KiB message edge after encryption overhead to avoid truncated or dropped data-channel frames
- sender and receiver compute a streaming SHA-256 checksum; the receiver only sends the success ack when file size, chunk count, and checksum match
- enforces a 100 GB client-side file limit; browsers with File System Access API support stream received chunks to disk, while fallback browsers download after completion
- both peers see transfer progress; sender progress reaches 100% only after the receiver confirms completion, and receiver progress reaches 100% after the file is written or downloaded, so either side can close the page once their bar is full
- rooms end when either peer closes the tab via a close beacon, with a short heartbeat timeout fallback for crashed or disconnected tabs
/settings
- UI shell only
- persistence handled by
/api/settings - includes theme/glow settings, optional cursor cat, and mobile-friendly-view preference
- local dev mode can bootstrap a blank-password
admin/Administratoraccount when no admin accounts exist - shows a Discord linking action for logged-in users and disables it once
discordUserIdis already linked - when logged in as hardcoded
toast, shows a JSON editor for shared Toast personalities stored indata/etc/toast-personality.json
Account Routes
/account
currently just redirects:
- logged in ->
/ - logged out ->
/account/login
/account/login
- secure session config
- CSRF protection
- login throttling via
data/accounts/login_attempts.json - reads
data/accounts/accounts.json - sets session user payload and
is_admincookie - username
toastis reserved for a hardcoded virtual account; it prompts for admin credentials, then logs in as non-admin Toast with fixedfeedandcommentspermissions - users with
mustResetPasswordare redirected into the password-change flow before using the rest of the site
/account/logout
destroys session and auth cookies, then redirects back to login.
/account/create
admin-only account creation flow that writes to data/accounts/accounts.json.
- can seed
discordUserId - can grant
commentsandchatpermissions - newly created accounts are flagged with
mustResetPassword - username
toastis reserved and cannot be created as a normal account - if a Discord id is provided, it asks the local toast bot to DM the invite credentials
- if that DM fails, the account is still created and the UI now shows the bot's concrete failure reason instead of a generic HTTP 500
- local dev mode shows a random dev-account generator that creates
userXXXX/User #XXXXwith feed/comment permissions, a blank password, no forced password reset, and no Discord invite
/account/change-password and /account/password
both update the current user password hash in accounts.json.
- first-login forced password reset lands here via
?first_login=1
/account/link-discord
- logged-in-only Discord linking flow
- validates the Discord user id, checks uniqueness across accounts, and asks the local toast bot to verify the member is in the server
- stores
discordUserIdon the account and assigns the Discordregisteredrole through the bot
/account/admin
not covered in the older references, but very real.
- admin-only account directory
- reads all accounts and renders permission badges
- links to per-account edit page
/account/admin/edit
- admin-only account editor
- supports rename, display-name change, permission changes, reset password, and delete
- delete confirmation plays a centered rip-in-half account card animation before the destructive POST continues
- the
purge user contentdanger button must purge all user-owned content; currently this includes feed posts, attached images, voice notes, and reply data - preserves unknown extra account fields through an editable JSON object field
- blocks deleting the currently logged-in account
- includes
commentsandchatas grantableallowedPagespermissions - password resets now preserve the account and flip
mustResetPasswordback on
Helpers live in account/admin/helpers.php.
Private Chat Routes
/chat
one-time private conversation manager.
- requires admin or
allowedPagescontainingchat - creates conversations with a recipient label
- lists active conversation files from
data/chat/*.json - shows canonical share links shaped like
https://fridg3.org/chat/{conversationId}that copy to clipboard when clicked - can end a conversation through an in-site confirmation popup, which deletes the encrypted JSON file immediately
/chat/{conversationId}
one-to-one conversation view.
- managers can open without claiming recipient access
- the first non-manager visitor sees a concise chat invite/auth page and receives an HttpOnly recipient cookie
- the recipient's first full chat view shows an in-site security/help popup explaining browser/account locking, encrypted storage, replies, and reactions
- later visits from that browser are allowed through
- if the recipient is logged into an account when they open an unclaimed invite, the chat links to that account instead of a browser cookie
- logged-in recipients with an active linked chat get a sidebar button above the mini-player/sidebar footer and can delete that chat themselves
- other browsers without the matching cookie get a custom access-denied page
- if the backing file is deleted, returning recipients see the ended-conversation page
- messages are stored inside the encrypted per-conversation JSON envelope under
data/chat - image/file attachments up to 8 MB are stored as encrypted per-chat blobs and served only after chat access checks
- the composer
+menu supports file upload or recording a voice note; voice notes are previewed before send, capped at 2 minutes, transcoded to compressed.m4a, and stored as encrypted chat attachments - selecting an attachment shows an attached-file indicator before send; image attachments use the site image viewer, while audio, voice, and video attachments embed with custom themed playback controls inside the chat; audio/voice controls include the
1x/1.5x/2xspeed toggle - messages can visually reply to a previous message, and clicking/tapping a message opens reply/react/delete actions; message deletion uses an in-site confirmation popup, and deleted messages stay in place as dimmed
message deletedplaceholders - reactions are emoji-based, searchable from the message context menu or the desktop-only emoji button beside the composer; the picker loads Emoji 16 Emojibase data from jsDelivr, lazy-renders results as users search/scroll, supports typed or pasted emoji from the search box, and falls back to a tiny local set if unavailable
- both sides send active/away presence heartbeats plus short-lived typing state, and the page live-polls whether the other side is online, away, or offline while showing a non-layout-shifting typing indicator inside the message box
- message sends update the current page immediately, and open chat pages poll for new messages; unfocused/hidden chat tabs play
/chat/alert.oggand prefix the page title with an unread count when the other side sends new messages - message timestamps show time only, with a date divider inserted at the first message for each day
Contact Route
/contact
- public contact form with name, email, message, and server-side anti-spam checks
- replies are sent manually from
me@fridg3.org - accepted submissions are stored under
data/contact/*.json - after storage, PHP asks the local toast service to send a Discord channel notification
/contact?dashboard=1
- admin-only contact submission dashboard
- lists submissions newest-first
- supports permanent delete
Retired legacy paths:
/emailand/email/*redirect to/contactin nginx- newsletter and mailing-list routes have been removed
Other Public Routes
/discord
simple wrapper page for the Discord community entry point.
/merch
simple wrapper page for merch links/content.
/others
misc landing page for routes that do not fit elsewhere.
Subroutes:
/others/off-topic-archive/others/toast-discord-bot/others/fridge-builds-websites
/tools
tools and utilities landing page.
Subroutes:
/tools/mdpaste/tools/frdgbeats/tools/frdgbeats/wiki
/tools/mdpaste
standalone markdown paste service for sharing notes without exposing a whole vault.
- accepts pasted markdown or client-loaded
.md/.txtfiles - live previews markdown before publishing
- supports normal markdown images plus Obsidian-style
![[image.png]]embeds that point at/data/images - optional hard-break mode keeps single line breaks in formatted paragraphs
POST /tools/mdpaste/writes temporary paste JSON underdata/mdpaste- optional password mode encrypts the markdown with AES-256-GCM before storage
- shared links render from
/tools/mdpaste/s/{pasteId} - pastes expire after 30 days
/others/off-topic-archive
frontend archive viewer backed by data/etc/off-topic-archive.json.
/others/toast-discord-bot
UI shell for toast bot status, controls, and stream playback.
The bot also exposes localhost-only service endpoints on 127.0.0.1:8765, including contact submission notifications to Discord channel 1503931489560301609. It also scans /feed activity for linked Discord accounts and sends DMs for post mentions, reply mentions, and replies to a user's own feed posts.
/others/toast-discord-bot/messages
- admin-only DM inbox/sender for toast with a thread inbox and full-page conversation view with a back button
- renders through the normal site template and mobile/desktop theme selection instead of a standalone Discord-style shell
- reads tracked DM history, resolves linked website usernames to Discord ids, and can send outbound DMs through the local bot service
- inbound user DMs are logged and can receive Groq-powered Toast replies using the local
personality.json; when users ask about fridg3.org, the bot can include small relevant snippets from the wiki and explain them in plain language - rapid inbound DMs from the same user are batched into one AI prompt; if Toast is still generating or pacing an unsent reply chunk when another DM arrives, it cancels the unfinished reply and regenerates from the queued messages
- admins can toggle an "air them" state per thread; aired users are still logged, but Toast does not generate AI replies for them
- if the Discord user is linked to a fridg3.org account, AI replies also receive compact context from that account's own recent feed posts and replies
- image and GIF DMs are sent to Groq's configured vision model as Discord attachment URLs, capped at 5 images and 20 MB per image
- AI replies are split into natural 2-4 sentence chunks and wait at least 5 seconds before each chunk is sent
- a user can send exactly
CLEARMEMORYin DM to make Toast react and ignore older DM history for future AI context - AI replies are also told about Toast's non-chat duties: radio playback, slash-command radio controls, account-linking support, and automated notification DMs
- AI replies are given an exact slash-command allow-list so website paths like
/feedare not described as Discord commands - guild messages and notification DMs do not trigger AI replies
/others/fridge-builds-websites
wrapper/marketing page for custom website work. this exists in code even though the older docs mostly ignored it.
/tools/frdgbeats
browser-based mini DAW inspired by simplified FL Studio workflows.
- Web Audio transport with BPM, play/stop, idle-stop panic, record arm, global master volume, waveform scope, and a small level meter
- editable project names
- new project menu can start a blank
Untitledproject or load starter.frdgbeatspresets from/tools/frdgbeats/presets/, including essential genre templates for house, hip-hop, pop songwriting, synthwave, orchestral sketching, and game loops - load demos menu lists
.frdgbeatsfiles from/tools/frdgbeats/demos/ - channel rack with rename, recolor, mute/solo/remove, up to 128 global pattern slots per instrument with project-wide selectable 16/32-column grids, volume/pan, and add-channel support
- piano roll edits the selected instrument's part inside the selected global pattern, places notes on pointer-down with whole/half/quarter snap starts, lets newly placed notes follow vertical pointer movement until release, lets existing notes drag horizontally between snapped positions, previews newly placed notes until pointer release, shows two octaves per octave-page selector, supports octave up/down buttons for the selected global pattern, supports chromatic piano-key rows, and stores multiple note events plus configurable snapped hold length, vertical-drag slide notes from resize handles, right-click note deletion, and middle-click velocity per note
- keyboard-to-piano input follows the FL-style
Z/S/X/D/C...andQ/2/W/3/E...layout with extra British QWERTY keys for a wider playable range; held keys sustain until released and preview the selected instrument without starting transport, whileSpacetoggles play/pause outside text fields - piano roll playback previews only the selected instrument and active pattern, while playlist playback follows the full arrangement
- playlist view uses FL-style generic track lanes with bars across the top, starts at 4 bars, can grow to 128 bars, has per-bar delete buttons, uses a non-empty-pattern dropdown plus one draggable pattern chip, places global pattern clips that trigger all instrument parts for that pattern, accepts dropped external audio files as embedded audio clips, supports right-click pattern/audio clip deletion, bar numbers start playback from that bar, and per-bar loop toggles can define a highlighted loop range
- mixer view adds modular per-channel Web Audio effects loaded from
/tools/frdgbeats/effects/; effect definitions register their own params, presets, node chains, optional custom GUIs, and injected CSS, with minimizable effect cards plus custom delay, reverb, distortion with cabinet voicing, bitcrush, compressor, limiter, flanger, phaser, chorus, instrument pitch shift, sample-only speed/tempo sync, and draggable graph EQ examples with optional precision sliders - automate view adds per-channel, per-pattern automation lanes for channel volume/pan plus numeric synth and effect params; lanes are saved in
.frdgbeatsfiles, can be enabled/cleared/removed, and support stepped or smooth values drawn across the selected pattern's 16/32-step grid - each channel can use a modular synth from
/tools/frdgbeats/synths/, a sample instrument, or a parsed SoundFont preset bank - synth instruments register VST-style Web Audio voices with saved params, injected CSS, fixed 4:3 graphical synth-tab interfaces, tagged preset banks (
[BA],[FX],[LD],[PD],[PL],[SY], and[SQ]where supported), and bundled Wave Oscillator, Analog Mono, Chip Stack, Glass FM, and Nebula Table wavetable examples with vertical drag controls - sample instruments can use bundled files from
/tools/frdgbeats/samples/or a custom upload with a loading popup, one-shot/loop/reverse playback, and a keep-duration toggle for pitch-shifted sample notes; keep-duration renders high-quality Rubber Band pitch buffers in a worker when available and falls back to the classic shifter if wasm cannot load, plus a zoomable, horizontally scrollable waveform tab for graphical start/end trimming, playback tracking, and right-click per-note sample zones - default SoundFont playback loads from
/tools/frdgbeats/soundfonts/Roland_SC-55.sf2when no user file is selected; SoundFont channels include independent bank dropdowns populated from/tools/frdgbeats/soundfonts/, and imported.sf2files are parsed client-side into preset/sample zones for playback, including a toolbar menu to set all SoundFont channels to a bundled bank or a custom upload .frdgbeatsproject files remain JSON and can embed imported sample files, dropped playlist audio clips, plus the active imported SoundFont bank as base64 assets for portable demos/projects- imports
.mid/.midias full project replacements with 32-column global pattern clips, SoundFont channels mapped from MIDI programs, and pitch-bend slides converted to slide notes; imports.frdgbeatsproject files into the full app state; project/MIDI imports show modal status with a percentage readout - exports
.frdgbeats,.mid, and rendered.wavfiles client-side with modal status and percentage readouts; WAV renders process each channel through its enabled mixer effect chain before encoding - import/export actions are grouped into popover menus with short descriptions
- save/load uses browser localStorage and preserves embedded project assets plus bundled sample/SoundFont URLs where present
/tools/frdgbeats/wiki
user-facing frdgBeats documentation rendered from Markdown files in /tools/frdgbeats/wiki/.
- uses a local wiki renderer with ordered sidebar links from
_Sidebar.md - internal wiki links stay scoped to
/tools/frdgbeats/wiki/?page=... - markdown image placeholders render as screenshot callout boxes, using alt text to describe the screenshots that still need to be captured
- includes beginner docs for quick start, interface layout, projects/files, channel rack, piano roll, playlist, instruments, samples/SoundFonts, mixer effects, automation, import/export, keyboard shortcuts, troubleshooting, glossary, and
.frdgbeatsdata contracts
Formatting / Examples / Errors
/formatting/formatting/example_page/error/403/error/404/error/50x/error/wip