The site looks hand-made because it is. Here is exactly how the moving parts work, with the real numbers from the code.
Ember particles
The glowing background is a <canvas> particle system that imitates hot embers rising on convection. It has 55 particles, each with a random radius of 0.6 to 2.8 px and a rise speed of 0.3 to 1.1 px per frame. Each frame a particle moves up by its speed and sideways by sin(t/900 + phase) × 0.4, a slow sine wave that looks like turbulent air. Particles that leave the top are recycled at the bottom at a new random x, so the count never grows. Bigger particles are drawn ember orange (#ff6a00) and smaller ones blood red (#c1121f). The canvas is scaled by the screen's pixel ratio, capped at 2, for sharp dots without wasting battery, and it runs on requestAnimationFrame, in step with the display's refresh rate.
The flying devil mask
The devil mask follows a parametric path driven by how far you have scrolled (p, from 0 to 1): x = (W − w − 8) × (0.5 + 0.5 cos 5πp), y follows |sin 2.5πp|, and it tilts by sin(18p) × 18°. So it swoops back and forth across the screen five times over the length of the page.
Landing on the devil body
When the Center Theater's devil body is near the middle of the screen, a blend factor k rises from 0 to 1 (fully on when the body is within 28% of the screen height from the centre, fading out over the next 16%). The landing spot is computed from the artwork itself: the mask's chin sits at 238/250 of its height and the body's neck at 52/380 of its height, and the mask is scaled to the body's width so the head fits the shoulders. Motion is smoothed with exponential easing (each frame it covers 20% of the remaining distance, 45% once locked), a first-order low-pass filter that moves smoothly without overshooting. It counts as landed when k is above 0.98 and it is within 3 px; a squash-and-stretch keyframe (scale 1.12, then 0.96, then 1), a classic animation principle, sells the impact. The mask's pupils follow your finger or pointer by up to 6 px.
Parallax and 3D
Decorative icons move at different speeds than the page (their offset is their distance from the top of the screen times a speed factor), which the eye reads as depth. The cover art tilts in 3D toward the pointer with perspective(900px) and up to ±8° of rotation.
AI EvilJay, the built-in brain
The chatbot does not call any outside AI service and needs no API key, so it has no quota and works offline once the page is loaded. Your message is lower-cased and stripped of punctuation, common filler words are removed, and words are reduced to a simple stem (dropping endings like -ing, -er, -es and -s on longer words). Each of about 45 topics (music, podcast, each product, prices, ordering, shipping, booking, socials, support, jokes and more) has keywords; a phrase match scores 3, an exact word stem 2, a short keyword 1.5, and a near miss 1.4. Near misses use Levenshtein edit distance 1 for words of 5 letters or more, so typos like "podcats" still work. The best topic above 1.4 answers. It also remembers the last product you asked about for follow-up questions like "how much?" or "what sizes?", and your first name if you say it. Answers can include tags that become buttons: open a section, call, text, email, follow links, Support EvilJay or the fan card. The conversation stays in your browser.
Pop-ups that respect visitors
Only one pop-up can be open at a time, there is at least 60 seconds between automatic pop-ups, and there are no more than 3 a day. None appears while you are typing or using the chat, and every one closes with ✕, Escape or a tap outside. The merch spot appears once a day when you have scrolled between 22% and 90% of the page and the Vault is not already on screen. Support EvilJay appears after 80 seconds of the page actually being visible (hidden tabs do not count).
The Devil Fan Card
Sections count as explored when 35% of them has been on screen, detected with the browser's IntersectionObserver. Points: 10 per day visited, 15 per section explored, 12 per official profile opened, and 10 for using the chat. Levels: Lost Soul (0), Imp (40), Demon (90), Hell Raiser (160), Devil's Advocate (250) and EvilJay's Right Hand (380). The day streak counts consecutive calendar days. The card is drawn on a 1080 × 1350 canvas, the 4:5 portrait size social feeds display best, and shared as a PNG with the Web Share API (or downloaded where sharing files is not supported). Everything is stored in the visitor's own browser (localStorage); nothing is sent to a server.
Orders without a checkout
The Vault keeps the selected items in the browser, checks that a size, name and phone are given, and blocks spam bots with a hidden honeypot field. The order goes by email through FormSubmit, or as a pre-written text message: the site opens the messages app with the order filled in (iPhone and Android use different separators, which the site handles). No card details are ever asked for or handled. The booking form works the same way, as a pre-written text.
Speed
Product pictures are WebP files of about 35 to 76 KB, with JPG copies for link previews. Images load lazily, the Spotify player only loads when you get within 400 px of it, the theater video loads only its metadata first and autoplays muted (as phone browsers require), scripts are deferred, and fonts swap in without blocking text.
Accessibility
Animations switch off for people who turn on Reduce Motion. Buttons are at least 44 to 48 px tall for thumbs, keyboard focus is clearly outlined, icons have text labels for screen readers, pop-ups are proper dialogs, and the layout respects phone notches (safe areas).
Search engines and AI
Every page has a canonical URL and Open Graph preview data. The home page and this page carry schema.org structured data (JSON-LD): Person, WebSite, AboutPage, ProfilePage, PodcastSeries, Store, Product with Offer prices, Brand, BreadcrumbList and FAQPage. The sitemap lists every page and the product images. robots.txt welcomes search and AI crawlers by name, and llms.txt and llms-full.txt give AI assistants a plain-text version of these facts.
Privacy
The site's own code sets no cookies and runs no analytics or ad trackers. Fan progress, the merch bag and chat stay in your browser. Outside services are used only where needed: Spotify and YouTube players, Google Fonts, and FormSubmit for order emails. Opening a social link takes you to that platform.