Work / Websites

Mawrolly: a website and After Effects project store for a TikTok creator with 260 thousand followers

What it was

The creator of a TikTok channel with 260 thousand followers had no place of his own online. Advertisers wrote in DMs and did not know the prices. After Effects projects were sold by hand through Telegram, and a buyer in another time zone waited for a reply until morning.

What we did

Built a bilingual storefront with an ad order form where the price fills in by itself, and a store with 23 projects. Crypto payment through NOWPayments, the server hands out the file by a signed link, no database of our own. Next to it, an After Effects version converter that runs in the browser and a chat assistant on Claude Haiku with a spending cap.

What the client got

The site is live at mawrolly.com. An end-to-end purchase with real money went through the whole chain: invoice, payment, signature check, file. Attempts to tamper with the price, promo code or link on production were repelled. In two months 331 users and 1,215 views, people reach the cart and the checkout.

ClientMawrolly, TikTok creator, 260K followers (a family project)
My roleDesign, code, RU/EN copy, payment and file delivery, chat assistant, analytics, SEO, security
StatusLive at mawrolly.com, the store takes payments, card payments are next
Result23 projects in the store, the buyer pays and downloads with no seller involved · Open
Rejected: the manual scheme. The buyer writes in DMs at night, waits for a reply until morning, the file is sent by hand in every deal. A reconstruction, not a screenshot
Rejected: the manual scheme. The buyer writes in DMs at night, waits for a reply until morning, the file is sent by hand in every deal. A reconstruction, not a screenshot
Accepted: cart, invoice from the server, signature check, a signed link to the file valid for 72 hours. The seller only gets a Telegram notification. A reconstruction, not a screenshot
Accepted: cart, invoice from the server, signature check, a signed link to the file valid for 72 hours. The seller only gets a Telegram notification. A reconstruction, not a screenshot

The task

The @mawrolly channel makes edits of Gravity Falls, Phineas and Ferb, Star vs. the Forces of Evil and anime. At the start: 260.6 thousand followers and 22.1 million likes. The money comes from advertising tracks and videos, selling After Effects projects and editing on commission. But there was no address of his own online: an advertiser wrote in DMs and did not know the prices, a project buyer came from a video and waited for a live reply, sometimes until morning.

The channel is run by my son, so we wrote the brief for ourselves: a storefront site with an ad order form, a store with payment and file delivery without a seller, two language versions. And along the way, test on ourselves the full cycle of an online store for digital goods with no database of our own and no recurring costs.

A separate pain for buyers: a project from a newer After Effects does not open in an older version, and there are no refunds. So every card had to show the minimum version, and next to it there had to be a way to downgrade the file.

Why, and what the idea was

Three people, three problems. The advertiser picks a channel and an ad type, the price fills in by itself (a track ad on mawrolly from $50, on partner channels from $35), the request flies to Telegram. The buyer puts a project in the cart, pays in crypto and gets a link right after network confirmation. The owner of an old After Effects sees the version on the card and downgrades the file in a converter that runs entirely in the browser.

The store’s main argument was settled by a “council” of five AI advisors: warnings about plugins and versions must come before the purchase but must not hide the product. The answer: the warning and the purchase became one step, an “I understand the terms” checkbox right above the pay button. The height of the mobile store page dropped from 5,421 to 2,946 pixels.

The same council killed the underwater fish theme when dozens of CSS fixes were not saving the header. Background images were chosen by measurement, not by eye: title contrast by the pixels of the letters themselves, the match of the edge between two frames (final score 0.43 out of 255).

How it went

When What happened
Stage 1 A reference in the Jinx/Arcane style. Versions v1-v4 drifted into a pirate theme, then into a corporate look, and were pulled back to the rule: structure from the reference, theme from the channel’s real content. The palette was sampled from the pixels of the banner and avatar
Next days Underwater theme: header above the water, middle and bottom below it. Many rounds of fixes to the seam between zones, a margin-collapsing bug caught
9 days later The council killed the “fish” theme. The header replaced with one frame with a built-in waterline. Domain bought, the site on mawrolly.com, ad prices approved
Next day A store with 3 items, the “M made of film strip” logo, security headers, robots and sitemap, GA4 and Clarity
A week later Our own version converter instead of a third-party one, cart, NOWPayments crypto checkout, automatic file delivery
Two days later A test purchase with real money went through the whole chain. Terms rewritten, three clauses of which were untrue. Council: the server builds the order number, the order is written as a snapshot of the deal, Telegram notifications, a limit on invoice creation
A day later Chat assistant on Claude Haiku 4.5 in production
Three weeks later A new hand-drawn logo through a CSS mask, promo codes, a sale with automatic expiry. Then an open-ended -50% sale and a free project with separate delivery without payment
Next month A fourth channel on the home page, a community block, funnel event tracking in GA, the follower counter automatic again. Security check, a spending cap on chat, CSP without unsafe-inline

Tools and method

The site is built from static HTML pages and Node.js serverless functions on Vercel, with no database of our own. Domain and DNS on Cloudflare, proxy off so Vercel can issue the certificate. Backgrounds and the logo were generated in Nano Banana Pro, fonts Russo One and Rubik. Images and icons were measured with Python scripts using PIL.

Payment: NOWPayments, the invoice is created by /api/checkout. Prices and discounts are calculated by the server from its own catalogue, not by the browser. The payment notification is verified by HMAC signature, without one the response is 401. The network fee is paid by the buyer.

File delivery: project archives sit in private Vercel Blob storage. The right to download is baked into the link itself: product id, order number, a 72-hour expiry and a signature. The server recalculates the signature, so no order database is needed for delivery. A Telegram bot tells the owner about every payment, underpayment and failed order write.

Chat: Claude Haiku 4.5 through the Anthropic API, a cached system prompt, the tools create_lead and check_ae_version. All numbers (version comparison, item counts, the price range) are computed by plain code, the model only relays them. Cap: 200 answers a day per site and 30 per person, so no more than about $15 a month.

Security: CSP with no inline scripts (14 inline blocks moved into files), HSTS, X-Frame-Options DENY, rate limits on payment, free delivery, promo codes, chat and order status. All keys only in Vercel environment variables. Analytics: GA4 with funnel events, Microsoft Clarity for heatmaps, Search Console. About 7,200 lines of code in total across pages, functions and store scripts.

Result

Home page: a full-screen header with an island and ships, the water runs down under the whole site. Channel counters, a “My channels” block for four accounts, three featured projects, community (Discord and Telegram), an ad order form. Two languages, the choice shared across all pages. The follower counter reads public TikTok profile pages with a 6-hour cache and shows hard-coded figures if that fails.

Store: 23 items, 21 edits, 1 color grading pack, 1 free project. Every card has a preview video, the After Effects version, a list of paid plugins without which effects open as missing. A product page with Product markup for search; the color grading pack has a gallery, one frame for each of 9 presets. A cart with one checkbox for all items, crypto payment, a fallback path through Telegram, and after payment the page polls the status itself and shows download buttons.

What we checked. End-to-end purchase: an invoice for $10, 10.147 USDT arrived on the BSC network, the notification passed the signature check, the file was delivered, the link returns a real .aep. Swapping the product id in the link gives “Link invalid”. Tampering attempts on production: we sent a price of $0.01, the server set its own $15; a promo code with a planted 99 percent gave an honest -10%; a paid item through free delivery got 403; a notification without a signature 401; a direct address of the file in storage 403. Converter: we built an artificial “AE 2026 project” from a real one and ran it back down, the result matched the original byte for byte, all 6,686,589 bytes. Chat: system prompt and tools 7,558 tokens, a run of 7 questions cost 1.76 cents.

Traffic over two months: 1,215 views, 331 users. In one week: 171 views (+40% on the previous week), 15 add-to-carts, 5 checkouts started, 4 free downloads and 0 payments. Five people reached the invoice and nobody paid: the only payment method right now is crypto. The next step is already decided, LiqPay for cards. What we do not know yet: whether a file opens in a live After Effects after the converter. The bytes match, the check in the application is up to the channel’s author.

Mistakes and what we took from them

CSS cannot do optics.We spent more than a week fixing the seam between the header above the water and the underwater part: blur, glare, a wavy line, a transition band. Layout cannot convincingly draw refraction at the water's edge. Fix: one frame where the waterline is already part of the shot. Rule: if a fix is being repeated for the third time, stop and look for the root cause.
The site's terms lied to the buyer.For a month the page said "the link allows up to 3 downloads", and there was no download counter in the code at all. Two more clauses described a manual scheme that no longer existed. Rule: check every promise in the text against a specific line of code.
The model cannot be trusted with numbers.The chatbot offered someone on AE 2017 projects marked "2018+", then said "about 30 edits" when there were 22. Pleading in the prompt helped partially, the error slipped through in roughly every third answer. What helped was taking the calculation into code: version comparison and counts are done by a function, the model only relays them.
The order number was assembled from what the browser sent.Junk from the request got into the number, and then that same number failed the format check. A person would have paid and been left without the file. Now the server builds the number from verified items and a random tail.
The -50% sale applied on the storefront but not everywhere.Code review found four places where the price was taken without the discount: the Telegram request, the bot's answers, the order snapshot in the log (revenue was doubled), the free cart check. Rule: check any price change in every place where the price appears.
The security policy silently switched off what we added.Analytics counters did not load until their domains were added to the CSP. The converter needs a worker via blob:, without a targeted exception the conversion simply did not run. Rule: after any new script, check the securitypolicyviolation event, not the console by eye.
A "just in case" dimming layer twice became the main problem.A 58-78% layer over the store background ate the image beyond recognition, even though the card text already sat on its own backing. Reduced to 22-38%. Rule: do not add layers until it is proven that things are bad without them.
We read the project version from a string.Inside the file it said "After Effects 2026", and that is what went on the card. The converter showed that the file format is 2019, and 2026 is the build it was saved in. The version is now determined by parsing the format.

Tools

HTML, CSS, JavaScriptNode.js serverless on VercelVercel BlobNOWPaymentsClaude Haiku 4.5Telegram Bot APIGA4, Clarity, Search ConsoleCloudflare Registrar and DNSNano Banana ProPython, PILClaude Code