Skip to content

Gabriele Bolognese

Backend developer, founder of FlashFX, part-time video editor.

Based in Italy · Software & Motion Design · Est. 2024

About me

I'm 17 years old

and 287 days 05 hours

49 minutes, 06 seconds, since

One square to the right is one week. Ninety years, 4,680 of them.

928 weeks lived · 19.8%

  • Lived
  • This week
  • Ahead
  • Milestone
  • Setback
  • FlashFX
  • Birthday, before 13
  • Birthday, 13 on
32 marked events
  1. YouTube channel started, first edits in Shotcut
  2. YouTube channel peak, 350 videos
  3. Channel hacked, 600+ videos deleted overnight
  4. First Fiverr account, freelance career begins
  5. First client, Emerals, $5 a video
  6. First payment card
  7. Emerals client lost, income gone again
  8. HowToAI discovery, automation era begins
  9. YouTube automation fails completely
  10. First line of code ever, Vision AI Demo begins
  11. Italian mathematics nationals, champion category
  12. Vision AI Demo crashes, first real debt
  13. Second €200 loan
  14. National coding competition, top placement
  15. FlashFX named, TypeScript and motion design
  16. TypeScript solo grind, building alone
  17. New editing client, $250 a month
  18. Bolt hackathon, final submission
  19. Bolt hackathon, defeat
  20. 3,400 Discord members
  21. FlashFX v1.0, public launch
  22. FlashFX reaches 5,000 users · turned 17
  23. Co-founder joins, Camille hired
  24. FlashFX v1.2, AI animation tier
  25. Y Combinator interview invitation
  26. Co-founder left, and the whole of June went with him
  27. Two weeks in Dublin, first English-speaking country
  28. Back from Dublin, the worst possible week to lose
  29. Launch day, and FlashFX becomes a company
  30. First 100,000 views on X, inside one week
  31. The marketing mess, four platforms taken on at once
  32. Comeback: TikTok running, three Instagram accounts steady, no YouTube yet

GNI 2026 · Gara Nazionale di Informatica

1st place in the Italian national computer science competition

Two days of competition at the Istituto Tecnico Pinin Farina in Moncalieri, May 2026, after a first day for arrival, against 31 finalists from technical schools across Italy. Two tests: a project to design and build, and a coding test. I finished first overall.

Read press (Italian)

Read from GitHub, LeetCode and YouTube at build time, not typed in by hand.

GitHub statistics

Every number below is read from @gabrielebolognese at build time.

14,580

Total contributions

Since 29 October 2024

  • 2024 283
  • 2025 7,494
  • 2026 6,803

415days

Longest streak

11 Nov 2024 to 30 Dec 2025

34days

Current streak

17 Aug to 19 Sept 2026

Contribution history

The last 12 months. 684 days with at least one contribution since the account opened. The year-by-year split is in the breakdown above.

Live at build, 19 September 2026. @gabrielebolognese

Main repositories

Latest devlog entry

Rewrote the plan ladder twice in one afternoon, and put seven screens of joke under the footer.

Read the full entry

LeetCode new account

38 days old, and it shows. Read from @gabrielebolognese at build time. There is nothing here to be impressed by yet, which is the reason to publish it: the interesting version of this block is the one in six months, and it is only interesting if this one exists.

Submission history

The last 12 months, drawn on the same scale as the GitHub grid above so the two can be compared honestly. 31 active days in it.

Live at build, 19 September 2026.

Solved by difficulty

234 solved Easy 72 Medium 122 Hard 40
Difficulty Solved Available
Easy 72 965
Medium 122 2,115
Hard 40 975

234

Problems solved

of 4,055 on the site

31days

Days active

Since 12 August 2026

12days

Current streak

Last solved 18 September 2026

#753,829

Global rank

Across every LeetCode account

YouTube barely started

Long form on building FlashFX, when something is worth more than a paragraph. Read from @gabriele.bolognese at build time.

9

Subscribers

Channel opened Oct 6, 2024

1video

Published

Latest 11 August 2026

17

Total views

Across the whole channel

The channel so far

  1. Trying to find an after effects alternative small montage

    17 views 11 August 2026

One video on the channel, so there is nothing to rank yet. Snapshot, 14 August 2026. Counts read from the channel page, not the Data API.

Countdown

-- Days
.
-- Hours
.
-- Minutes
.
-- Seconds

To get 100k followers on Instagram

Four things, one of them finished.

The FlashFX editor: animation library, canvas and multi-track timeline, view 1 of 4The FlashFX editor: animation library, canvas and multi-track timeline, view 2 of 4The FlashFX editor: animation library, canvas and multi-track timeline, view 3 of 4The FlashFX editor: animation library, canvas and multi-track timeline, view 4 of 4

01 Live Since 2024

FlashFX

A browser-native motion graphics and video editor. The After Effects workflow, with nothing to install and no licence.

  • TypeScript
  • WebGPU
  • WebCodecs
The FlashFX roadmap page

02 Live Since 2026

FlashFX Roadmap

The public roadmap for FlashFX. What has shipped, what is being built, and what is queued behind that, on one page.

The FlashFX landing page, view 1 of 4The FlashFX landing page, view 2 of 4The FlashFX landing page, view 3 of 4The FlashFX landing page, view 4 of 4

03 Live Since 2026

FlashFX landing page

The front door for FlashFX. What it is, who it is for, and the argument for using it instead of the desktop tools.

  • TypeScript
The FlashFX documentation site, view 1 of 4The FlashFX documentation site, view 2 of 4The FlashFX documentation site, view 3 of 4The FlashFX documentation site, view 4 of 4

04 Live Since 2026

FlashFX documentation

The official product documentation for FlashFX. Still in alpha, and filling in as fast as the editor itself does.

  • TypeScript
FlashCC, the carousel editor: slide list, canvas and slide settings, view 1 of 4FlashCC, the carousel editor: slide list, canvas and slide settings, view 2 of 4FlashCC, the carousel editor: slide list, canvas and slide settings, view 3 of 4FlashCC, the carousel editor: slide list, canvas and slide settings, view 4 of 4

05 In development Since 2026

FlashCC

FlashFX for carousels. Built procedurally rather than generated, fast, fully editable, with no AI anywhere in it.

  • TypeScript
The BrandBoard grid, with featured tiles and their countdowns down the left

06 In development Since 2026

BrandBoard

A board where you buy a square to feature your X, Instagram or YouTube. $2 each, up to 20 by 20, cleared every month.

  • TypeScript
Threshold: monetization thresholds for each platform, view-count goals and a weekly posting calendar, view 1 of 3Threshold: monetization thresholds for each platform, view-count goals and a weekly posting calendar, view 2 of 3Threshold: monetization thresholds for each platform, view-count goals and a weekly posting calendar, view 3 of 3

07 In development Since 2026

Threshold

Creators rarely know when monetization comes or what to do next. Threshold reads your profile and builds a plan that answers both.

No screenshot yet

08 In development Since 2026

Knowledge Tree

A study tool shaped like a tree. Every topic is a node, so how deep a branch runs, what is already covered and how it all connects stay visible.

No screenshot yet

09 In development Since 2026

GDiary

A daily log of what actually got done. One entry a day, kept so a week is a record rather than something to reconstruct afterwards.

No screenshot yet

10 Concept Since 2026

Flash3D

FlashFX aimed at 3D motion graphics rather than 2D, with depth as a first-class axis instead of a 2.5D camera bolted on.

Six places, six different reasons. Pick whichever one you actually use.

LinkedIn

Build updates and the reasoning behind product decisions. The fastest growing of my accounts.

Connect with me

YouTube

Long form on building FlashFX, for the things worth more than a paragraph.

Watch a build

Instagram

The daily side of it: training, studying, and the parts of building that do not screenshot well.

Follow the logs

Peerlist

The developer profile: work history, stack and projects, in the format other developers read.

See the profile

Connectively

A source profile, for journalists looking for someone to quote on browser-based tooling.

Quote me

Reddit

Where I read far more than I post, mostly about graphics programming.

Find me there

FlashFX

The product itself. Browser-native motion graphics and video editing, with nothing to install.

Try it now

What I am building, what broke, and what it cost. Sent when there is something worth saying.

№ 012 ·

The Marketing Mess

The last issue ended with a test for the week after it, and I called the test boring: keep the same cadence for seven days with no spike in them, and see whether the floor moves.

This is that week. What I found out is what cadence costs once it is multiplied by four.

What happened

After launch, every platform turned into a to-do list. Instagram, TikTok, X, LinkedIn, and a few more queued up behind them. Each one had a good reason to be there, and each one, on its own, was a reasonable thing to take on. Together they were not a marketing plan. They were a tide, and by this week I was underneath it.

Nothing broke. There is no wreckage to point at, which is exactly the shape of my last setback, and it is the reason I am writing this one down while it is still happening instead of six weeks after.

Four platforms is four jobs

The mistake is inside the phrase "post everywhere". It sounds like one task done four times. It is four different jobs that happen to share a subject.

Read this

№ 011 ·

300 Followers in a Week, and the Dip Was the Useful Part

A fortnight ago the FlashFX account passed 100,000 views on X inside a single week, which is now on the timeline as a real event. This is about the number underneath that one. Views are a measure of how far something travelled. Followers are a measure of whether anyone wanted it to happen again.

Last week the account reached 300 followers. Seven days. What I did not expect is that the interesting part would be a day in the middle where the number went the wrong way.

The shape

Up sharply at the start. Then a day where the count went backwards instead of forwards. Then up again, past the dip, to 300 by the end of the week.

I want to be precise about how that felt, because the feeling was wrong. On the day it dropped, the obvious reading was that I had posted something bad and was being corrected for it. That reading is almost never right, and it is worth knowing why before it happens to you.

Unfollows lag follows, and that is the whole explanation

Read this
View full newsletter

Six years. Four rebuilds. One product.

Conflict of interest: this is a self-written account. It exists to lay down how I got from where I started to where I am now, and nothing here has been checked by anyone else. Updated monthly.

Skip story
01

The Hacked Channel

It all started when I was 11, in 2020, in peak COVID. The world was locked inside, and I did exactly what every kid my age did: he played games. Minecraft specifically. I tried others, but nothing stuck the same way, I was genuinely addicted, and I didn't fight it. A few months in, I started watching more and more gaming videos, and something clicked: I want to do this. So I started a YouTube channel. I had absolutely no idea what being a content creator actually meant. I genuinely believed that whatever I posted would go viral, no script, no audio quality, nothing. I was posting videos on average daily, some days hitting 4 uploads. On an HP laptop with 1TB of storage and 16GB of RAM. The audio was… bad. Terrible. After a few months of posting raw recordings, I started noticing that people were adding effects to their videos. I was 11, in middle school, zero clue what video editing was. So I did the obvious thing: Googled "free video editing tool." First result was Shotcut. It turned out to be perfect for my machine, lightweight, relatively fast to learn, even if I had to figure most of it out on my own. Around that same time, I hit a wall with Italian tutorials. Searching in English just gave better results. My TikTok feed started shifting to English Minecraft content too, and without even trying, my English improved. Not polished, not British, but real, conversational English. Before I even turned 13, I switched Minecraft's in-game language to English. By the time I was 13, I'd been in the game for over a year and a half, editing for almost as long, but "editing" really just meant cutting clips and slapping on default effects. Still, somehow, the channel crossed 1,000 subscribers with 450+ videos. Looking back now, I'm genuinely stunned it got that far given the quality. The real shift came when I wanted to make YouTube Shorts. Shotcut didn't have a vertical preset, so I had to switch editors, and that's how I found CapCut. This was way back, version 2.9 or 3.0, when auto-captions were still free. For the OGs, you know what that means. Through Shorts tutorials, I started actually learning about pace, hooks, and what real editing looked like.

"The channel was called playmoj"

Then came the crash. The channel had over 600 videos. I was running a hardcore world series, like every other YouTuber at the time, and sitting at around 1,560 subscribers. I was 13, I wanted to grow faster, and like an idiot I ended up on one of those scam websites promising subscribers. They hacked my account, deleted every single video, and replaced them with their own scam content. The channel, playmoj, was gone. I couldn't sleep. I'd lost everything I'd spent over a year building, video by video. I had some clips saved and created a second channel reposting them, but it got 5 views per video. So I quit entirely. That copy channel still exists if you're curious, just don't expect any quality lol: https://www.youtube.com/@playmoj_/videos That hurt more than I expected a YouTube channel to hurt. But it wasn't the end.

02

First Real Money

After quitting, I didn't touch editing for a while. It was late 2022, I had just turned 14, and I was just browsing around, trying new games. Then I came across Cyberpunk 2077. It looked insane. I had to play it. But my HP laptop couldn't run it, not even close, so I needed a new PC, which meant I needed money. This was the Andrew Tate era. I was a bit late to it because of my age, but after a week of watching dropshipping videos, I stumbled onto one about making money as a video editor. Something clicked. I already knew how to edit, sort of, so I went that route. I created my first Fiverr account and gig. I remember how ridiculously long it took just to set everything up, the gig settings were a lot to go through. But eventually I launched my first public freelancer profile. Worth noting: I was still editing in CapCut at this point. 2 weeks later, a guy with the nickname "hansa" reached out about an opportunity. The job was simple: take a GTA gameplay recording and cut out the best parts. The pay was $5 per video. Each video took well over an hour because the raw footage was sometimes 3 hours long and I just skimmed through it manually. Not exactly great math. Over time I pushed the rate to $15, then $20 per video, which made the hourly pay at least decent.

The channel was Emerals, my first ever client: https://youtube.com/@emeralsrp

Then high school started, and everything got harder. The workload quadrupled overnight and the quality of my edits dropped noticeably. They saw it. But hansa defended me. He knew I was a newbie, he understood the situation, and he kept me in anyway. Some days I was so exhausted from school that I'd edit for 20 minutes with basically zero effort and call it done. He defended me even in those moments. That meant a lot.

03

The First Crash

In April 2023 I got my first card, a Revolut account under my mom's name, because PayPal wasn't cutting it anymore. By the end of it all, I made around $1,200 from that single editing job over 6 months. It wasn't a lot. But it was mine, and it was the first time I'd ever made real money from something I built myself. June 2023, Emerals quit. Hansa was gone, and just like that I had no income again. But this time was different. Those 6 months had actually made me a decent editor. I knew what I was doing now, at least compared to the CapCut kid who was cutting 3-hour GTA recordings for $5 a pop. And honestly, if I ever become someone, a big part of that is on hansa. He kept me when my quality was trash, when I had zero experience, when school was destroying me. He never had to do any of that. I never even learned his real name. So losing him was my first real setback.

I posted 2 or 3 new gigs on Fiverr. All of them flopped, for months. Nothing. And when nothing is happening, it's very easy to just… stop. So I did. I went back to gaming, no editing, no channel, just wasting time. That stretched all the way to August 2023. Then I came across a channel called "HowToAI," which has since been deleted by YouTube for repeated copyright strikes. That channel was the peak of the YouTube automation era, the idea that you could run a faceless channel using ChatGPT and AI tools and just print money. I didn't know much about ChatGPT at the time, but this channel made it sound like a goldmine. I was convinced enough to actually buy their course.

I started new channels in the video editing niche. And I burned money like wildfire, on YouTube editors, thumbnails, assets, everything. I had zero financial responsibility. The $1,200 I'd worked 6 months to earn started disappearing fast. And then it was just gone. It was December 2023. I had just turned 15. Months of effort, not a single dollar made from the YouTube automation thing. Complete failure. But it gave me something: it showed me that AI was powerful. Like, genuinely powerful. That stuck with me.

Over the Christmas break I started going deeper into it, and somehow that path led me to coding. School hadn't even introduced it yet, that was coming the next year. So on January 3rd, 2024, with a newly released AI called Claude, I started building a tool. January 3rd, 2024. I sat down with Claude and started coding. I had never written a line of code in my life. And Claude at the time was nowhere near as capable as it is now. But I was so excited about this idea of AI just building things for me that I was completely blinded by it. I genuinely thought I had found the cheat code to everything.

I developed for a full month straight. And at some point I needed credits to keep going, which meant I needed money, which I didn't have. So I asked my cousin for a loan. He was 14, running a Vinted reselling operation and selling other stuff online, while I was sitting there with nothing. Which is genuinely funny, because just months earlier it had been the complete opposite. He said yes. I borrowed €200, he sent it over on Revolut, and I bought the credits. But what was I actually building? Let me go back a second.

Remember when I said high school hit me like a wall? The workload was almost unbearable, and on top of that I was doing karate. Time was the one thing I never had enough of. So a thought started forming: what if there was an editor that could make animations faster? Easier? Or even better, automatically? The idea kept growing. I started thinking through every possible use case, every angle, every type of person who might need this. I meditated on it for a while. And then I came up with… The idea had a name: Vision AI Demo. And it had to solve 3 specific problems at once. First, it had to be easy to learn, not overwhelming from the start like so many editors I'd tried before. Second, it had to be completely free, like Shotcut was for me, because I desperately wanted After Effects but couldn't afford it. Third, it had to be lightweight enough to run on any machine, including the kind of HP laptop a broke 15-year-old uses.

So I started building it on bolt.new. Pure vibe coding, zero expertise, just me and an AI figuring it out prompt by prompt. And somehow, it was actually working. Something real was taking shape. Then I asked the AI to move some files around. Reposition them in the folder structure. Simple enough request. It broke everything. Every single path in the codebase got scrambled. Pages were importing files that had been moved or didn't exist anymore, and I had no idea what was happening because I didn't have the technical knowledge to even understand what "file paths" meant. I just knew the whole thing was red and crashing.

04

Four Rebuilds

I had roughly $55 in credits left. And I did the only thing I knew how to do: I kept asking the AI to fix it. "Fix this error." Over and over, with no further context, because I didn't understand that the root cause was the file restructuring I had requested several prompts earlier. I burned message after message chasing individual errors without ever touching the actual problem. Each fix broke something else. Permanently red. 40 minutes of this and it became clear: it was over.

The project was gone. All those hours. And most importantly, the $200 I had borrowed from my 14-year-old cousin. I had just enough credits left to scrape together a landing page using the few video clips I'd recorded before the crash. It's still up if you want to see what could have been: https://vision-ai-home.netlify.app This one hit like a truck. Much harder than losing the YouTube channel. That was just time. This was debt, something I had never experienced before. It was around March 2024, and my grades collapsed. Zero motivation for anything. Some crying nights, alone, asking ChatGPT why it hurt that much.

The answer it gave me was actually pretty simple: when I started building with AI, I felt something like winning the lottery. I couldn't sleep at night, I'd stay up messaging the AI just to see more progress, more features appearing out of nothing. I genuinely, deeply believed I had won. That I'd be selling this app soon, that the money would come, that everything was about to change. And then it all came crashing down, from the stars to the floor, in a single night. I remember it was a Friday. The moment I realized everything was gone, I had to go to a pizza party with my family. I had to sit there and hide it. What I didn't know yet was that this was only the first of 4 crashes. The first of 4 full rebuilds from scratch. I wrote up what the file path actually cost me and, later, what all four rebuilds cost together. The months after were rough. I tried to restart editing, but there was zero motivation, barely enough to get out of bed some days. I had to force myself because the $200 debt was real and heavy, especially with zero income at 15. $200 at that age isn't nothing.

Nothing came from the editing attempts. Because you can't force output from an empty tank. After about 2 months things started stabilizing, mostly because I landed a one-time gig for $40. Not a lot, but it was necessary. It chipped away at the debt. And from there, I did something risky: I went back to my cousin and asked for another $200 to retry the site. He didn't have it this time. So I had to find another way. August 2024. One year after the YouTube automation disaster. My cousin and I started selling AirPods, not exactly the most ethical operation, but I was still 15 with hopes and dreams, so here we are.

The model was simple: fake AirPods bought at $21 a pair, sold as the real thing. We pooled our money, $40 from me, $10 from him, and bought 2 pairs. A week later we sold 1 for $150. With that we bought 5 more. The plan was to split them, 3 for me, 3 for him, but he'd been doing Vinted reselling for a while already and moved product way faster than I did. So I handed mine over to him too. They sold, though never again at $150, more like $60 to $80 a pair. But it worked well enough that with the leverage of that first successful flip, he lent me another $200. This time I couldn't fail. I genuinely couldn't. There was no more runway. Long story short: I failed again. But not for the same reason as before. This time it wasn't 1 fatal mistake, it was the opposite problem: it got too big, too fast, and nothing was ever finished. Here's what happened.

I started building the editor, which you can still see here: https://create-video-editor-ur5p.bolt.host. Then I got excited and started building a blueprint generator: https://endearing-jelly-e95215.netlify.app. Then another AI video editing tool. Then I went back and tried to remake Vision AI: https://symphonious-maamoul-085d5a.netlify.app. Then yet another AI video editor project: https://ai-video-editor-app-i877.bolt.host. 5 separate tools. All vibe coded. All half finished. All disconnected from each other. None of them good. Another $200 gone. But this time, when the dust settled, it felt different. Not lighter exactly, but different. Because I had actually learned things along the way. New experiments, new patterns, a better understanding of what was and wasn't possible. The biggest realization from all that chaos was this: yes, I could build an editor that runs in the browser. But no, I could not rely on AI to build it for me. That was the line. And I finally understood where it was.

Fast forward a few months. Late 2024, early 2025. Things were stable, not exciting, just stable. School was average, training was consistent, life was moving at a normal pace. Then January 1st came around, and I did what I apparently always do on January 1st: I started building something. This time it was a thumbnail generation tool, because I wanted to give YouTube automation one more shot. I had a few credits left and figured, why not. But something was different about this build. Mostly because bolt.new had switched from their own agent to Claude, which by this point was already becoming genuinely powerful. And working with it, something clicked architecturally that had never clicked before. I had been looking in the wrong direction the entire time. I didn't need to build a video editor in the traditional clips-and-timeline sense. What I actually needed to build was a motion design tool.

That realization changed everything. I still had 4 days of Christmas break left. So I did something I'd never done before: I sat down and started learning TypeScript from scratch, alone, no course, no classroom. I was 16. I started with JavaScript for about a week, then went straight into TypeScript and React. All day sessions, sometimes running into the night. While learning, I also started building. And I figured out that the easiest entry point was a UI design tool. I needed a name, didn't think too hard about it, and landed on FlashFX. Fast, effects, like After Effects. Simple. The very first prototype is still up if you want to see where it all started: https://tubular-profiterole-10ec69.netlify.app. Then go look at what FlashFX is today: https://editor.flashfx.app. The distance between those 2 things gives me actual nostalgia.

Still, I couldn't build everything I envisioned with AI alone. So I also made a separate version myself, something I called FlashFX Editor, a real attempt at building a video editing tool with my own hands. The skills weren't there yet. I knew it. But I was closer than I'd ever been. February 2025. The AI credits were gone. No more bolt.new, no more vibe coding. All I had now was TypeScript and whatever I could figure out on my own. So that's what I did for the next month and a half. Mini projects, one after another. Task managers, small video trimmers, audio remixing tools on the web. Dense, unglamorous, necessary work. I basically learned everything I know in TypeScript during this phase. I'll skim through it because honestly there's not much to say: I woke up, went to school, came home, did TypeScript, went to sleep. That was it. Every day. One casualty worth mentioning: I stopped training for a long time during this stretch, and lost a good chunk of the physical progress I'd built up.

Then April 2025 arrived with a surprise. Out of nowhere, I got a new editing client. Completely random. The month before, in March, I had updated my Fiverr gig presentation video, not because I was actively pushing it, just a small refresh. I had kept the account alive through everything, even through a ban incident I'll get to later. This new client was Italian, working in the financial trading niche, and the offer was actually decent: $250 per month for 4 videos per month. For what the job required, that was good money. The problem was me.

I was still deep in the TypeScript learning phase. I was also trying to actually perform at school for once. And I had just restarted training. The exact problem that made me want to build the software in the first place was now staring me in the face: I had no time to edit. So the edits were trash. After the first payment came in, I was already late on the first deadline. Revisions piled up and I didn't have time for those either. He had paid upfront, and I want to be honest about what I did next: I burned all $250 the same day. Maybe even the same hour. I bought AirPods Max for around $145 to try reselling again, and threw the rest into AI credits. All of it, gone immediately. He threatened to send me to a debt collection agency. I spent an entire day begging him not to. We eventually reached an agreement: instead of cancelling, he wanted 6 videos delivered, not 4, all by a fixed deadline. So I did them.

The revisions were brutal. I think I burned a few hundred hours across those videos. Some had 5 revisions, some had 8. At times 2 rounds in a single day, constantly exporting, sending, waiting, fixing, repeating. My grades collapsed again. So badly that I actually didn't pass the year in June and had to take a recovery test in September just to be admitted to the next year. But the client, to his credit, understood what was happening. He stopped at 5 videos and let it go. When that was finally over, the relief was genuine. I just sat there and breathed. This is probably the center of the entire FlashFX story. After everything, the wasted credits, the 145 fake AirPods Max sitting in a box that I never sold to a single person, the endless revision cycles, the failed year, I was at zero again. And then I saw it: Bolt's world's largest hackathon. Over $1 million in prizes. First place: $100,000 in cash.

That number hit me like a defibrillator. If I won this, or even placed, it would fix literally everything. The debt, the credits, the pressure, all of it. In 1 shot. The excitement that came with that realization was unlike anything I'd felt in months. So I made a decision: full rebuild. Third one. Forget the thumbnail design tool. Forget the motion graphics direction. This hackathon had a lot of design tools competing, so I needed something original. I went back to the editor concept and started building the second version of FlashFX Editor from scratch. And because the hackathon required all projects to be built in bolt.new, I was vibe coding again, but this time with a critical difference: Bolt gave all participants free premium access, around $20 in credits. Every single prompt had to be perfect. I couldn't waste one. I also did something I hadn't done before: I built a team.

There was me. A friend of mine. And a guy I met directly through the hackathon, who went by the Discord username "developer guy." He was in his 30s, an experienced TypeScript developer, while I was still 16. When we didn't want to burn bolt credits, he would jump in and write code directly. He was a massive asset. The build lasted a month. Tailored prompts, careful decisions, developer guy filling the gaps. But when the deadline arrived, the product still wasn't complete. Not even close, honestly. Then the last 3 days happened. Developer guy clutched. He tore through the worst bugs, the ones that made the app genuinely unusable, and got the export function working. Trash quality exports, but exports. It worked enough to submit.

"I finally understood where the line was: I could build it. But I could not rely on AI to build it for me."

June 30th, 2025. Submission day. We sent it in with full hope that something, anything, would come of it. You can still find the hackathon build here: https://flashfx-project-fina-yfbd.bolt.host. Probably the single most important artifact in FlashFX history. And it was also here, somewhere between the last-minute bug fixes and hitting that submit button, that we made it official. We weren't just building a tool anymore. We agreed to make a company. We called it FlashFX.

The decision day for the hackathon winners were on july, i remember attending the awards, full of excitement for the third time, and for the third time, a massive delusion... not only we didn't win anything, but the idea that won the first place was literally a video editor like ours. the idea of an ai video editor has won, but not ours, because it was uncomplete. and once again, out of HUGE, immense regret, i deleted the project, keeping only the link above as final proof. but one thing was learned: we pitched the idea to all the other hackathon members, and it got huge respect. people actually wanted it, there was market demand. this wasn't a sign to stop but to keep going one more time.

05

FlashFX

This time, i made flashfx starting from that old project for thumbnail generation (https://tubular-profiterole-10ec69.netlify.app) started learning how it worked, and started making my own updated version. i was also getting a few side gigs, that allowed me to do more tests with ai for the actual ai video editor, one of them is still up at https://create-thumbnail-des-n8ht.bolt.host

when i had a working prototype on my own, i started using ai again to make a better frontend, while i was still learning libraries like theatre.js for scenes, three js for 3d models, and many more. i started making different versions (with the help of bolt) like:
- Very first demo: https://loquacious-fenglisu-cfa1be.netlify.app
- first actual working prototype: https://flashfx-duplicated-1d4a.bolt.host
- FlashFX with 3d: https://flashfx-duplicated-6a36.bolt.host

other tests have minor improvements.

in this time i also started growing the community, with the discord, the instagram and on december 2025, after turning 17, linkedin, that by now, is the fastest and best growing social. on February 2026 i started making flashfx V1, the first very functioning version, with no bolt.new unless frontend and some libraries implementations, and the difference is very noticeable.

"Photoshop became Canva. Premiere became CapCut. Now After Effects becomes FlashFX." The argument, in full

A little earlier, in January (good things always happened in january, like always), i got to know my future co-founder, remember when i first quit Minecraft and started going into Youtube automation? i also met him, he owned a discord community that at the time had little over 1200 members, and asked me if i could be an editing mentor for a course of his. i accepted, got actually a sale, then quit in that difficult moment when i failed everything in youtube automation and lost my hard earned 1200. we remained in contact once every 2 months at best, then on december, he joined flashfx team, and on jan he became official co-founder. and he hired a very talented marketing manager called Camille Luciano from the philippines, that helped us so much with building the socials and the discord. turning flashfx into an actual team. I've gone very fast on the last 7/8 months because it was essentially growth, i finally exited after the hackathon that loophole of doing something and not completing it, now the app finally works.

all this to have: https://flashfx.app

06

The Company

On 7 August 2026 FlashFX opened to the public, finished rather than in pieces, and the legal structure started underneath it the same day: an Italian S.r.l., which is what a company here actually is once it stops being a person with a project. Both of those are their own story: launch day and the company underneath it, and the six weeks before it that nearly cost me the date.

Over €5,000 went in before the first day of trading, none of it on the product. Everything up to this point was building. This part has a balance sheet, and it is one day old, so there is nothing honest to write here yet beyond that it has begun.

What happens next is not written here yet. It is in the devlog, most days, and in the newsletter when it is worth more than a paragraph.

Skip timeline

A record of the milestones, launches and moments that shaped my path.

  1. YouTube Channel Started, First Video Editing with Shotcut

    Age 11. Peak COVID. A Minecraft YouTube channel launched with zero knowledge of what content creation meant, no script, no audio quality, sometimes four uploads a day on an HP laptop. After a few months, discovered Shotcut through a Google search for "free video editing tool." Also the year English replaced Italian as the primary language for tutorials, gaming content, and eventually everything.

  2. YouTube Channel Peak, 350 Videos and Growing

    Age 12. playmoj had grown to around 350 uploaded videos, posted with near-daily consistency since the channel's start. No strategy, no monetisation, no audience playbook, just an obsessive upload rhythm on a family HP laptop. The editing had improved, the thumbnails had improved, and for the first time it felt like something real was being built.

  3. YouTube Channel Hacked, 600+ Videos Deleted Overnight

    The channel, playmoj, had over 600 videos and sat at 1,560 subscribers. A scam website promising subscribers led to a full account compromise: every video was deleted and replaced with scam content. A year and a half of daily uploads, gone in a night. Some clips were recovered and reposted on a second channel. It got 5 views. Then everything stopped.

  4. First Fiverr Account Created, Freelance Career Begins

    Age 14. Needed money to buy a PC that could run Cyberpunk 2077. After a week of watching Andrew Tate-era dropshipping videos, landed on a video about making money as a video editor. Already had the skill. Created the first Fiverr account and launched a gig, still editing in CapCut.

  5. First Freelance Client, Emerals, $5/Video GTA Edits

    Two weeks after launching the first Fiverr gig, a user called "hansa" reached out. The job: cut 3-hour GTA recordings down to highlights. Pay: $5 per video. Each edit took well over an hour. Over the following months, the rate climbed to $15 then $20. Hansa kept the job going even when school destroyed the quality. He never had to.

  6. First Payment Card, Revolut Under Mom's Name

    April 2023: opened a Revolut account under mom's name as PayPal was no longer sufficient to handle freelance payments. The first real financial infrastructure for the business, at 14 years old.

  7. Emerals Client Lost, $1,200 Earned, Income Gone Again

    June 2023: hansa quit, and with him the Emerals editing contract ended. Over six months, roughly $1,200 had been made, the first real income ever built from scratch. The rate had been pushed from $5 to $20 per video. When it ended, the skill was real. The income was not.

  8. HowToAI Discovery, YouTube Automation Era Begins

    After months of failed Fiverr gig attempts following the loss of the Emerals client, stumbled onto a YouTube channel called HowToAI promoting faceless AI-automated channels. Bought their course. Started burning money on editors, thumbnails, and assets across the video editing niche, fast.

  9. YouTube Automation, Complete Failure, AI Stays

    December 2023, just turned 15. Months of effort, zero dollars made from the YouTube automation experiment. The $1,200 earned from six months of editing work had been burned on editors, thumbnails, and assets. Complete failure, but the exposure to AI tools left something behind: a genuine conviction that AI was powerful, and that it could be used to build something real.

  10. First Line of Code Ever, Vision AI Demo Begins

    January 3rd, 2024: sat down with Claude and started coding for the first time. No prior experience. The idea, an editor that could make animations faster and easier, had been forming for months. Built on bolt.new through pure vibe coding. For weeks, it was actually working. Something real was taking shape.

  11. Italian Mathematics Nationals, Champion Category Qualifier

    Qualified for the Italian mathematics nationals in the champion category. Competing at this level while simultaneously failing school due to freelance overload and managing the early stages of FlashFX development.

  12. Vision AI Demo Crashes, First Real Debt, Worst Night

    A single file restructuring request scrambled every import path in the codebase. With only $55 in credits left, the same error-chasing loop burned through everything. The project was gone. The €200 borrowed from a 14-year-old cousin was gone. It was a Friday. A pizza party had to be attended. The grades collapsed. Some nights were spent asking ChatGPT why it hurt that much.

  13. Fake AirPods Operation, Second €200 Loan

    With no other runway available, started a resale operation with a cousin: fake AirPods bought at €21 a pair and flipped for €60–150. The first pair sold for €150. The profits funded another €200 loan to restart FlashFX development, leading directly to the fourth and final rebuild.

  14. National Coding Competition, Top Placement

    Placed at the top of the national coding competition. School had only introduced coding the year prior; this placement came after months of self-teaching TypeScript, React, and browser-based tooling, all driven by FlashFX development, not classwork.

  15. FlashFX Named, TypeScript and Motion Design Breakthrough

    January 1st: started building a thumbnail generation tool and had the key architectural realisation, not a video editor, but a motion design tool. Started learning TypeScript from scratch, no course, no classroom. Named the project FlashFX. The first prototype went live within days. The distance between that prototype and what FlashFX became still gives genuine nostalgia.

  16. TypeScript Solo Grind, AI Credits Gone, Building Alone

    With bolt.new credits exhausted, all vibe coding stopped. The next month and a half was nothing but solo TypeScript: task managers, video trimmers, audio remixers, dense, unglamorous, necessary work. This stretch produced the core technical foundation that FlashFX would eventually be built on.

  17. New Editing Client, $250/Month Freelance Contract

    A new Fiverr client appeared out of nowhere after a small gig presentation refresh the month before. An Italian client in the financial trading niche, offering $250/month for four videos. The job spiralled into brutal revision cycles, collapsed grades, and a failed school year, but it also funded the next phase of FlashFX development.

  18. Bolt Hackathon, Final Submission

    June 30th: FlashFX Editor was officially submitted to the Bolt hackathon. The team committed to building a company together on the same day. The submission marked the moment FlashFX went from a personal project to a formal venture.

  19. Bolt Hackathon, Submission and Defeat

    FlashFX Editor was submitted to Bolt's world's largest hackathon, featuring over $1,000,000 in prizes. The team, including "developer guy," an experienced TypeScript developer met through the event, spent a month building and clutched a working export in the final three days. The project didn't place. The winner was also a video editor. The idea was validated. The product wasn't finished.

  20. 3,400 Discord Members, Community Milestone

    The FlashFX Discord community crossed 3,400 members, all acquired organically. The community had become one of the core distribution channels and proof points for product-market fit heading into the v1.0 launch.

  21. FlashFX v1.0, Public Launch

    FlashFX launched publicly for the first time as a fully working product. After four complete rebuilds and nearly two years of development, the app was finally something real, a browser-based motion design and video editing platform that actually worked.

  22. FlashFX Reaches 5,000 Users, LinkedIn Launched, Turned 17

    FlashFX crossed 5,000 users entirely through organic growth. LinkedIn was launched as a founder visibility channel and quickly became the fastest-growing social platform for the project. Also the month of turning 17.

  23. A Co-Founder Joins, Camille Hired as Marketing Manager

    Someone I first met years earlier, during the YouTube automation era, became official co-founder after rejoining the project in December. He brought on Camille Luciano from the Philippines as marketing manager, turning FlashFX into a real team and accelerating community and social growth.

  24. FlashFX v1.2 Released, AI Animation Tier Launched

    FlashFX v1.2 shipped with a dedicated AI animation tier, marking the first monetised feature beyond the one-time 3D unlock. The first genuinely stable, production-ready version of the platform, built almost entirely without vibe coding.

  25. Y Combinator Interview Invitation, Summer 2026 Batch

    FlashFX received an interview invitation for Y Combinator's Summer 2026 batch. The culmination of two years of building, failing, rebuilding, and growing to over 8,000 organic users, all before turning 18.

  26. Co-Founder Left, and the Whole of June Went With Him

    My co-founder, official since January, left. What followed was not a bad week but a bad month: every week of June went the same way, ground lost rather than gained, against a launch date that did not move to make room for it. The run did not end with June either; it carried through the week before Dublin, and picked back up the day I returned.

  27. Two Weeks in Dublin, the First Time in an English-Speaking Country

    Fourteen days in Ireland. English stopped being a school subject and became the thing every day happened in, which taught me more in two weeks than a year of lessons had. Found a calisthenics community training outdoors in the city and trained with them, in a place where nobody knew me or what I was building. The trip was worth taking. The date was not mine to choose, and it fell in the run-up to launch: the two weeks a launch can least afford to lose.

  28. A Major Setback, at the Worst Possible Moment

    Came home on 24 July to a project that had lost its momentum, and the twelve days that followed went on recovering ground instead of gaining it, the stretch that was supposed to be the final push before launch. A month already lost, two weeks away, then twelve days spent catching up: that is the real cost, and it is the honest half of the trip. It broke on 5 August. Everything since then is in the devlog.

  29. Launch Day, and FlashFX Stops Being a Project

    FlashFX opened to the public, complete and fully usable rather than released in pieces. The same day, the legal structure underneath it started: an Italian S.r.l., the limited-liability form a real company takes here, with a notarial deed, a registration in the Registro delle Imprese and a tax number attached to it. Over €5,000 went into getting to this line (subscriptions, compliance, a business advisor) before a single day of trading. Two years of building end here, and the part with a balance sheet starts.

  30. First 100,000 Views on X, Inside One Week

    The FlashFX account passed 100,000 views in a single week, the first time it has done that. Eight days earlier the product had launched, so this is the first week the account had a finished thing to point at rather than a work in progress. Reach is not revenue and 100,000 views is not 100,000 people, but it is the first evidence that the distribution side works at all, which two years of building had never tested.

  31. The Marketing Mess

    A month after launch, Instagram, TikTok, X and LinkedIn each turned into a daily job of its own, all taken on at once, and by this week they had crowded out the building. Nothing broke, which is the same shape as the six weeks before launch, and the reason this one is named in its first week rather than its sixth. Written up in the marketing mess.

  32. The Comeback: TikTok, and Three Instagram Accounts on Schedule

    One week after the marketing mess, the platforms have a rhythm instead of a tide. TikTok is running for the first time, and three Instagram accounts are posting consistently, not whenever there happened to be room. YouTube is still not started, and that belongs in this entry too: a comeback is not the same thing as every platform being handled, and a gap is worth writing down while it is still only a gap.

To be continued

The timeline is updated for every major event, usually once a month.

What I shipped, what broke, and what it taught me. One line a day from inside FlashFX, with the long version underneath.

  1. Day 7 #

    Rewrote the plan ladder twice in one afternoon, and put seven screens of joke under the footer.

    Show details Hide details

    Landing page

    Scope of the session: pricing, and one deliberate piece of nonsense. 3 commits, 12 files changed, +341/−89, one new component.

    Nothing today was checked in a browser. The autoplay-on-arrival behaviour, the section rhythm and the pricing table’s appearance are verified structurally only.

    The $29 tier is Pro, and the $39-per-seat Teams tier is gone, replaced by Ultra at $89.

    • Number: 9 files, +138/−69. No per-seat plan remains.
    • Hard part: the prices were restated in seven places and not one of them derived from the pricing data: the cards, the comparison table, /pricing metadata (three separate title and description pairs), its Offer graph, four FAQ answers, the refund-policy standfirst, the 404 route list, and the collaboration row in comparisonData.ts. Four of those are read by crawlers. Editing only PricingSection.tsx would have left the old prices live in the structured data while the visible page showed the new ones, which is worse than either being wrong on its own.

    The plan ladder was then revised again, hours later, on stated numbers.

    • Number: credits 1M / 50M / 200M, version history 30 / 60 / 90 days. The whole 3D set except advanced materials opened to the free tier, comments and guest access on every plan, and AI in 3D added as an Ultra-only row. 37 rows across 3 columns, checked by reading the three feature-group arrays back out of the source and printing them side by side. Every row is populated in all three columns.
    • Hard part: this contradicted work from ninety minutes earlier. The first commit derived $854/yr, 70 GB, 1,750 credits and 1 year of history from a stated “Ultra is 3.5x Pro”; the second replaced two of those with hand-set numbers, so the ratio now holds for storage only. Credits are 4x from Pro to Ultra and history is 1.5x. The comment in PricingSection.tsx says not to “restore” the ratio, because the derivation reads as more principled than the explicit numbers and someone will be tempted.

    Deleted the claim that the free tier is a complete manual editor with no AI features.

    • Hard part: the free tier now carries 1M AI credits and none of the AI tools. Motion graphics, the assistant, image search and generation, the background remover and the sound generator are all still Pro and up. That is exactly what was specified, and the prose was rewritten to match the table rather than paper over it, but a credit allowance with nothing in the table to spend it on is incoherent on its face. Logged in FIX.md as unresolved rather than guessed at. Same with advanced materials, PBR, toon and wireframe: it was the one 3D row not named in the list to open up, so it stayed paid instead of being swept along with the other four.

    Six full-height sections below the footer: two blank, “Stop scrolling”, blank, “I warned you”, blank, then a muted video.

    • Number: 4 files, +171/−17. Homepage only, confirmed present in index.html and absent from pricing, faq and about.
    • Hard part: the footer is rendered by app/layout.tsx, so “under the footer” leaves the layout as the only mount point, and the layout is every route. Seven viewport-heights of joke under the refund policy and six SEO landing pages is a defect, not a joke, so the component gates itself on usePathname().

    The site backdrop measures scroll progress against the end of the page rather than the end of the document.

    • Hard part: this is the one that would have shipped silently. SiteBackdrop drives its colour ramp off scrollY / (scrollHeight - innerHeight). Adding seven screens of padding stretches that denominator, so the real content would never reach the light end of the gradient and the footer would sit in the same navy as the hero: a joke below the fold quietly recolouring everything above it. Fixed by subtracting the height of any [data-fx-beyond] element, which is a named contract rather than a special case for one component.

    The video got its own visibility observer instead of the shared embed hook.

    • Hard part: useVideoEmbed carries a 400px rootMargin so videos are ready before you arrive, which is exactly wrong here: it would have the video playing to an empty screen while the visitor is still two sections above. This one has no rootMargin, a 0.55 threshold, and disconnects after firing so it cannot restart on the way back up. Muted regardless of the brief, since no current browser honours autoplay without it.

    Verification, and one false alarm.

    • Number: server HTML contains zero <iframe> on every route, and the video id is not in it until the observer fires. The Offer graph on /pricing carries Free $0, Pro $29, Ultra $89. No “Teams” and no “$39” survives on any route.
    • Cause: a verification script reported “0 JSON-LD blocks” on /pricing and was wrong. The pattern assumed the script tag opened with its type attribute, while the tags carry an id first. The structured data was correct all along. A pattern that finds nothing looks identical to a page that contains nothing.
  2. Day 6 #

    A camera settings dialog, a schematic view and a bezier flight path in the editor, and two wrong install-size figures corrected on the site.

    Show details Hide details

    FlashFX

    Scope of the session: the 3D camera and the editor around it. 24 commits, one of them empty and pushed by accident, 52 files changed, +2777/−323. Typecheck stayed at 0 errors and lint at its 127 baseline through every commit.

    Anything touching WebGPU or pointer behaviour is verified in the Node harness only, so it still needs a browser to feel.

    The Cloner no longer crashes the editor, and it draws its instances.

    • Number: verify:cloner-render, 8 assertions.
    • Cause: it was never being skipped, it was being mis-bucketed. A resolved cloner has no drawable payload of its own, and the renderer’s catch-all else filed it as a shape, so the shape packer dereferenced layer.shape and threw on every single frame.
    • Hard part: the real fix was upstream. resolveFrame now expands a cloner into per-instance stamps of its source layer and hides the source, the way C4D does, and the bucketing skips any resolved layer with no payload. The note in CLAUDE.md claiming the if-chain “safely skipped” it was wrong, and has been corrected.

    Space plays the video even while a number field has focus, and Esc or a click outside deselects.

    • Hard part: a focused <input> swallows Space as a literal character, so “press space to play” silently typed a space instead. Play now wins over the field, except while text is actually being edited, and deselect had to clear the canvas selection and the timeline selection both.

    Multi-select outlines sit on parented objects instead of up and to the left of them.

    • Cause: the bounds check was reading a layer’s own position rather than its position after the parent chain has been applied.

    The site and the app got a search-engine pass, and the FlashFX mark now sits in both headers.

    • Number: a rewritten index.html head, plus robots.txt, sitemap.xml, a web manifest, an inline brand logo, and a rasterised social-preview image and touch icon.
    • Hard part: a raw & inside the OG image’s aria-label broke librsvg, which is strict XML, and produced a blank PNG; escaping it to &amp; fixed it. The sitemap lives at editor.flashfx.app/sitemap.xml.

    The dashboard tabs work: Recents, All, Starred, Trash and Templates.

    • Number: verify:trash, 5 assertions on the retention math. 7 days to purge, 30 if starred, and a permanent delete that asks you to type the project name, the way GitHub does. The new Templates tab carries 4 scene deep links: galaxy, city skyline, rocket launch and forest.
    • Hard part: keeping the retention math pure enough to prove in Node. Purge time is derived (trashedAt plus retentionDays) rather than stored, and “starred gets longer” had to survive the round trip with no background job to lean on.

    An After Effects style Camera Settings dialog, with coupled lens fields and working depth of field.

    • Number: Zoom, Angle of View, Focal Length, Film Size and Comp Size, in two columns with a placeholder for a tutorial video. verify:camera3d, 24 assertions. How After Effects actually behaves was researched with a multi-agent workflow first, then the algebra written to match it.
    • Hard part: the four lens fields are one identity, Z = f·C/F, so storing all of them would desync the moment one was keyframed. Only Zoom, in pixels, is stored and render-affecting; focal length, angle of view and f-stop are derived for display and cannot drift. Depth of field is a per-3D-layer circle of confusion routed through the existing blur pipeline, honouring After Effects’ “lock to zoom”.

    Fewer buttons in the editor chrome.

    • Number: the FlashFX brand button is gone from the top bar, which now reads just “Projects”; the separator is gone from the dashboard header; “Render” and a small “Export” collapsed into one Export button; and the Animation Builder is hidden, with the code kept.

    A 2.5D Camera Parallax template.

    • Number: cards at varying depth with a keyframed truck and push, reachable by deep link.

    A 3D View in the inspector: a flat schematic of the world, next to the live canvas.

    • Number: shown when a camera is selected, with the tab sidebar hiding to make room. Drag the camera or its point of interest to place them and the main canvas updates as you drag. A WebGPU validation-error scope went in alongside it, so a validation error is captured and logged instead of escalating into a lost device.
    • Hard part: the Side view would not drag. The SVG used a fixed square viewBox with the default preserveAspectRatio, which letterboxes, while the pointer math assumed a linear stretch, so clicks skewed on the letterboxed axis. Fixed by tracking the element’s real pixel size as the viewBox with preserveAspectRatio="none", which gives a 1:1 pointer mapping on both views.

    A “Disable Camera” toggle renders the screen flat, as if no camera existed.

    • Number: top right of the canvas. Screen only; an export always keeps the camera.
    • Cause: the whole 3D path already checks for a camera before it runs, so removing it for the screen render produces the exact 2D result with nothing else changed.

    Camera interaction polish.

    • Number: full-width Top and Side tabs, double-click the camera to open Settings (the inline button is gone), a precision drag mode where the world moves at 40% of pointer speed, and aperture handles in millimetres that mirror each other.

    A camera-path keyframe editor inside the 3D view.

    • Number: a rhombus that follows the camera to key its position, keyframe markers anchored in the world (click to seek, right-click to delete), a dotted “possible path” that becomes a solid line at two keys or more, and a right-click menu per segment.
    • Hard part: the drawn path is sampled from the real evaluated eye rather than guessed, so what is on screen is exactly what renders, for any interpolation.

    The camera path is a smooth spatial bezier with draggable tangent handles.

    • Number: verify:camera-path, 4 assertions: collapse-to-lerp, byte identity, bow and u-tracking. Right-click a segment for Smooth (automatic Catmull-Rom tangents), Straight or Hold.
    • Hard part: making it a strict opt-in generalisation. A cubic bezier whose control points sit on the 1/3 and 2/3 line collapses to a straight lerp, so a path with no tangents is byte-identical to the old linear one, and that is proven rather than assumed, which is what stops the existing harnesses regressing. Timing also had to keep coming from the real keyframes: the along-path parameter u is extracted from the actual interpolation of whichever axis moves most, so easing and holds on the position keys still drive the fly-through.

    Project cards show a random frame from the scene, refreshed on every open.

    • Cause: tens of projects otherwise look identical in a list.
    • Hard part: the old capture called canvas.toBlob() on the WebGPU canvas at teardown, which hands back a blank or stale frame. The new one renders a random frame to an offscreen target on the live device, reusing the warmed-up texture caches and never touching the visible canvas so there is no flash, then downscales to a small WebP and overwrites the old blob in place.

    A loading splash covers the editor on open until the scene, the assets and the first frame are ready.

    • Hard part: opening a project janks the main thread for a couple of seconds (deserialise, resolve, first WebGPU render), which would freeze a normal JS-driven loader too. The spinner and the progress bar are pure CSS transform animations, so they run on the compositor thread and keep moving straight through the freeze.

    Every Transform property row has a revert-to-default button.

    • Number: position to the composition centre, scale to 1, rotations and Z to 0, opacity to 1. Keyframe-aware, and dimmed when the value is already at its default.

    Landing page

    Scope of the session: competitor facts, and one full-bleed 3D section. 10 commits, 21 files changed, +1573/−255, two new components and four supplied logos.

    Centred four tool logos that sat off the ends of their own cables.

    • Number: third attempt at this. The first two moved the wrong element.
    • Hard part: framer-motion writes transform inline, so animating y or scale on the same element that carries Tailwind’s -translate-x-1/2 -translate-y-1/2 silently discards the centring and positions the element by its top-left corner. That is half a logo in each axis, not a few pixels, which is why nudging offsets in the previous two commits changed nothing. Fixed by splitting centring (outer div, plain inline transform) from animation (inner motion.div). The trap is already documented in CLAUDE.md and still cost three attempts in one file.

    Published an After Effects install size, then corrected it 39 minutes later.

    • Number: three places carry the figure: LoadTime, SystemRequirementsSection and FeatureComparisonTable.
    • Hard part: helpx.adobe.com is unreachable from this environment, timing out on the current page, both versioned pages and the /in/ and /sg/ mirrors, across several sessions. The first commit aligned everything to 15 GB because that is what the site had already been publishing. Weighing four secondary sources afterwards put two independent references on 8 GB tied to a specific build (25.6, November 2025), against one on 15 GB with no version tie and one on 5 GB matching older releases. The site’s long-standing number was the weaker reading. Corrected to 8 GB, still second-hand, with the source table recorded in FIX.md so it can be re-weighed rather than re-derived.

    Looked for the DaVinci Resolve equivalent and found that no published figure exists.

    • Hard part: Blackmagic publishes no disk-space requirement at all. Their stated minimums cover CPU, GPU and RAM, and the tech-specs page is about control panels. Third-party figures run 2 GB to 7 GB with nothing primary behind any of them. The site’s “3-4 GB desktop install” was invented somewhere upstream and appeared in three places. All now say “multi-gigabyte”, the only thing every source agrees on.

    A full-bleed section of flat layers standing in depth, with a camera moving through them.

    • Number: three commits in 88 minutes. Shipped as a rig plus a live inset of the camera’s own view, reworked to a 65/35 split, then rebuilt to open on a flat picture that comes apart. The final form renders one scene through two cameras into two scissored viewports.
    • Hard part: the geometry could not be hand-tuned. Two constraints pull opposite ways: the backdrop must cover the shot camera’s frame across the whole dolly, which wants it large, and the rig view must frame the whole set at any orbit angle, which wants it small. Four attempts at picking a radius failed because raising the orbit distance while lowering the field of view left R*tan(fov/2) roughly constant, so the framing never improved. Replaced with a bounding-sphere fit, radius / sin(half fov), recomputed on resize since horizontal fov moves with aspect. A sphere is the same size from every direction, so the framing holds at every angle instead of at the one it was tuned at.
    • Hard part: making the camera bigger and pushing the layers further apart are in direct conflict, since a deeper scene means a wider fit and a smaller camera on screen. Resolved by sizing the body from the fitted radius rather than in absolute units, so it holds about 10.5% of frame height regardless of depth.
    • Cause: nothing in this section was checked in a browser. Framing, the parallax ratio (12.7x foreground against backdrop) and near-plane clearance are verified structurally only, by projecting the scene’s corners in Node against the constants read back out of the source file.

    Reordered the pen tool demo so the cursor moves, clicks, and only then places the anchor.

    • Hard part: it placed the point and moved the cursor from the same instant, so each anchor appeared under a pen still travelling towards it. It read as the drawing happening to the cursor rather than because of it. Separately curved, the 0-to-1 blend from polyline to bezier, was assigned rather than animated, so the one moment a pen-tool section exists to show was crossed in a single frame. Driving it with framer’s animate also fixed the handles, which are drawn at cx * curved and so now grow out of the anchors rather than appearing at full length. Splitting the curve into one path per segment, which the draw-on needs, forced the stroke gradient to userSpaceOnUse, or each segment would have restarted it: four small rainbows instead of one sweep.

    The screenshot carousel expands on click, with arrows the height of the image.

    • Hard part: a drag ends with a click event on whichever card was under the pointer, so every fling would also have opened a picture. framer only fires onDragStart once its own threshold is crossed, which makes it exactly the signal for “that was a drag, not a tap”. The arrows track the image height with items-stretch, so the row takes its height from the only item with an intrinsic size and nothing has to measure anything.
  3. Day 5 #

    Forty commits across eight fronts in the editor, and twenty new components on the landing page.

    Show details Hide details

    FlashFX

    Scope of the session: breadth. 40 commits, +9917/−362, about 253 file changes, across eight areas of work. Typecheck stayed at 0 errors and lint at its 127 baseline through every commit.

    Anything touching GPU rendering or pointer behaviour is verified by structure only, Node harnesses plus guards, so it still needs a browser to confirm by feel.

    Six more Figma time-saver milestones, M17 through M22.

    • Number: 6 commits. Outline Text (M17) turns a text layer into editable letter shapes that can be moved point by point; batch rename (M19, Ctrl+R) renames a whole multi-selection at once with tokens, numbering and pattern matching; a freehand draw tool (M18, Shift+P); rulers with tick marks and labels, plus snapping to whole pixels while dragging (M20); linked colour styles (M21), so changing a colour once updates every layer using it; and outline stroke with hole-preserving booleans (M22).
    • Cause: shape and text fill and stroke now read the linked style first, before the material overlay is applied.
    • Hard part: preserving holes through a boolean means tracking even-odd winding, not just unioning the outer rings.

    A tutorial that builds a complete title-card scene by driving the real editor.

    • Number: phases 1 to 5 in 4 commits, chapters 1 to 10, with a spotlight overlay on the interface and a prompt on first open.
    • Hard part: it runs the actual store actions rather than a scripted fake, so every step has to tolerate real state and undo. A canned animation would drift from the editor the first time anything moved.

    Buttons on the landing page open the editor on a template that plays immediately.

    • Number: 3 commits. /?template=<id> loads a fresh project that plays on open and can then be edited; the first one is a tuned particle hero.
    • Hard part: the splash overlays the app while WebGPU warms and pre-rolls about 8 frames before playing, so the heaviest first frames happen behind it. And the seeding has to wait until the async scene load actually swaps the composition reference, or it lands on the wrong document and gets overwritten.

    “Use this” inserts a working animation at the playhead, timing and motion included, not only the artwork.

    • Number: 9 commits, 24 or more templates. Scenes (beach, forest, night), weather (sunset, rain, city, snow), creative (galaxy, phone chat, pen, clock, fireworks, rocket, coffee, confetti, spinner) and four showcases: Chain Reaction (a Rube Goldberg with 200 balls), Departure Board (split-flap flip wave, parallax planes, rain matte), Bar Chart Race (pre-computed reordering) and Recursive Editor (FlashFX animating a video editor). An “All” button inserts every template one after another. verify:anim-templates, 132 checks.
    • Hard part: templates are authored 0-based and rebased to the playhead, rescaled if the composition fps differs from the authoring fps. The Recursive Editor lives or dies on cursor believability, so the cursor engine is a bezier arc plus ballistic velocity, overshoot, dwell, sub-pixel noise and icon swaps. And the bar-race reorder is baked, because a live reorder needs a per-frame sort the keyframe model cannot express.

    An AI chat panel that can be toggled on, in the style of VS Code and Copilot.

    • Number: 2 commits, a mockup. It takes the right 20% of the screen and compresses the layout in every mode except preview. Assistant replies without borders, a loading state while thinking, streaming text and a response timer; the composer buttons (add file, from Drive, image and the rest) are placeholders.
    • Cause: internally there is a streamResponse() seam with a canned reply behind it, so a real model drops in later with no change to the UI.

    A new layer type that draws patterns on the graphics card at full resolution.

    • Number: phases 1 to 3 in 6 commits. generativePattern covers 11 types (waves, plasma, kaleidoscope, mosaic and 7 more) with a palette editor, and the layer has bounds, so it moves, resizes and masks like a rectangle, with animatable scale, rotation, warp and contrast, and blending with the layer below. verify:pattern, 16 checks.
    • Hard part: the config’s type whitelist was still hard-coded to the original 4 types, so every new type silently parsed back to plasma; the harness caught it as 'plasma' !== 'clouds'. And blend cannot read the scene texture progressively, so each mode is a separate pipeline whose fragment output form is matched to its blend state: 4 variants, normal, add, multiply and screen.

    The timeline’s layer-name column sizes itself to the busiest track.

    • Number: 2 commits. It doubles in width in Edit mode, then grows to fit, up to a limit. Clip counts are computed O(N) through a Map, not per-track-per-render.

    The start of After Effects style cards positioned in space.

    • Number: M0 to M3 plus M6, with M2 landing last, in 8 commits. verify:mat4, 9 checks; verify:camera3d, 17; verify:scene3d, 5.
    • Cause: built so a 2D project renders byte-identical at every step, with the depth fields defaulting to 0 and the GPU path switched on by an is3D flag. M0 is a matrix core plus optional Z position and X/Y rotation on Transform. M1 is a camera layer that resolves to view and projection each frame, and its default frames the composition 1:1 at any zoom, so a single layer switched to 3D does not jump. M3 is the per-layer 3D toggle, with X, Y and Z position and rotation rows in the inspector. M2 is the renderer projecting each 3D layer through the camera in the shader (added to the image, shape, text and pattern uniforms) and sorting by depth, far to near, with 2D layers holding their existing order.
    • Hard part: the y-down handedness trap. The default camera was flipping both screen axes against the renderer’s y-down convention, and the first harness only checked magnitudes, so it passed anyway. Fixed with a −Y composition-up vector and pinned with signed-parity assertions (top-left lands at (−1,+1), and so on). The GPU projection itself cannot be proven outside a browser, so it is additive and guarded, a zero-initialised is3D flag means no 2D layer can be affected, and everything that is actually hard, parity, foreshortening and painter order, is proven in Node.

    Landing page

    Scope of the session: new sections, and the cost of rendering 176 of anything. 37 commits, 133 files changed, +6052/−656, twenty new components and nineteen new images.

    Eight new sections, at roughly one per 25 minutes.

    • Number: “Edit in plain English”, the media pool, procedural animation, templates, a two-audience section with CSS-3D workstations, a Features run above the 3D section, and a five-part “Not convinced yet?” AI block. 8 new section components and 8 new demo components.
    • Hard part: several were rebuilt immediately after shipping because the first reading of the brief was wrong. The procedural section went through three forms in 21 minutes: one cube becoming eight things, then 2D squares and kaleidoscopes at 1200ms crossings, then every radial formation cut. Evaluating the formations numerically in Node found the actual defects: the mandala reached radius 1.08 against a frame of 1.00, and the tunnel crossed the frame edge at 40% opacity, so it was sliced rather than fading.
    • Hard part: app/page.tsx is a server component, and dynamic(() => import('./X').then(m => m.X)) written there fails at prerender with “Cannot access X.then on the server”. The dynamic call has to live inside a 'use client' module. Two files exist only for that.

    The 176-card feature grid skips everything off screen.

    • Number: roughly a dozen cards are on screen at any time.
    • Hard part: content-visibility: auto alone breaks the page. A skipped card measures zero, so the document collapses and the scrollbar jumps. contain-intrinsic-size: auto 190px is the necessary other half, and auto is what makes the browser remember each card’s real height after it has rendered once.
    • Cause: this grid was described as 179 cards in the previous day’s commit and in code comments. The real count is 176 (47+90+39). The 179 came from a loose title: pattern matching entries outside the three data files.

    Removed the last grid backgrounds, so the shader field runs through every section.

    • Hard part: the iceberg image below the grid has top and bottom fades hand-matched to #141f40, and meeting a shader field they would read as a hard seam. It keeps its solid ground, with a lead-in gradient taking the page from the field into the flat colour.

    Settled the RAM floor at 4 GB across the site, and removed every em dash from visible copy.

    • Number: the RAM figure had been contradictory across seven files. /lightweight-video-editor alone said “Works on 4 GB” twice and “Requires only 2 GB” once.
    • Hard part: the em-dash script’s tidy pass ran a whitespace-before-comma substitution on every line and ate the indentation off chained .join(' ') calls. Caught because the candidate count jumped from 206 to 248 between runs; fixed with an early return so only dash-bearing lines are touched. A blind dash-to-comma replacement also produced comma splices (“you are always on the current version, there is nothing to download”), so the replacement is keyed on the word after the dash: connector to comma, clause-opener to full stop, -ing to comma, digits to hyphen, otherwise a colon.

    The editor has a single deep-link contract in lib/editor.ts.

    • Number: ?template=<id>, with a whitelist typed so an unknown id is a compile error.
    • Hard part: the editor silently ignores ids it does not recognise. No error, the visitor just lands on an empty dashboard. Nothing in this repo can validate an id at build time, so the whitelist is only as good as the discipline around it.

    Moved the workstation figure out of the laptop it was rendering inside, then reverted it.

    • Hard part: the figure and the laptop lid genuinely occupy the same depth range in the preserve-3d stack, so the browser interleaves them. It is not a spacing problem, and moving the figure down or forward does not fix it: the shapes intersect. The revert restores the interpenetration, which the commit says out loud rather than quietly putting things back.
Every entry

What's next? scale. FlashFX is entering its growth phase, with a YC interview on the horizon, a product that users love, and a roadmap that brings professional-grade AI animation tools to every creator on the planet. If you are an investor, collaborator, or potential partner who believes in the project, I would like to speak with you.

Reach me at the.real.gabryy@gmail.com

Follow my Instagram for daily logs
or ask me a question
Who is Gabriele Bolognese?
I am an Italian founder and self-taught developer, and the creator of FlashFX, a browser-based motion graphics and video editing platform. I started out as a video editor and a YouTube creator, then taught myself TypeScript and built FlashFX on my own.
What is FlashFX?
FlashFX is my browser-based motion graphics and video editing platform, built as an alternative to desktop software like After Effects and Premiere Pro. It runs entirely in the browser with no install, and more than 8,000 people use it.
Who founded FlashFX?
I did. I built the product on my own across four complete rebuilds before launch, and I am still it’s lead developer.
How did Gabriele Bolognese learn to code?
I am entirely self-taught. I started with AI-assisted prototypes, lost an early codebase to a file restructuring error, and rebuilt from the fundamentals in TypeScript. That failure is the reason FlashFX eventually got engineered properly, and why I make alot less mistakes now.
Where is Gabriele Bolognese based?
I am based in Rovigo, in the Veneto region of northern Italy, and I work on FlashFX remotely.