My portfolio had reached a strange point. It looked like the site I wanted, but it did not behave like one. The galaxy, animated sections, and small interactions gave it personality on a powerful laptop. On an inexpensive phone, the same page could feel like a slideshow. Under the surface, years of experiments had also left behind duplicated data, tangled CSS, unnecessary client code, and very few useful release checks.
One rule before touching anything
I was not interested in making it fast by turning off everything interesting. The galaxy had to look the same, the title still had to follow the pointer, and the interactions had to keep their character. Apart from removing a click effect I no longer cared about, the job was to change how the site worked without changing what it felt like.
The invisible rebuild
Most of the useful work was not flashy. Static content moved out of the browser. Client code shrank to the pieces that were actually interactive. Data, routes, and styles gained clear owners. Old code disappeared, the blog became a real set of article routes, and lightweight pages stopped paying for the portfolio's visual machinery.
None of that made for an exciting before-and-after screenshot. It did make every later change easier to reason about. Instead of piling another fix onto a fragile page, I could finally tell which part of the system was responsible for what I was seeing.
The expensive part stayed
The galaxy was still the biggest bill. The old renderer kept the main thread busy and did work across the whole screen for an effect made mostly of tiny stars. It was fine on my laptop and brutal on a cheap Android phone.
Moving it to a worker gave the interface room to breathe. Rebuilding it as an instanced renderer meant drawing the same stars without shading empty pixels. Work now pauses when it is invisible, and a measured fallback exists for the rare case where a device genuinely cannot keep up. The visual result stayed familiar. The amount of waste did not.
The part I underestimated
Several optimizations were technically correct and still wrong. A title moved differently. A hover animation flashed. A video started one frame too late. Those changes passed a build and improved a number, but they changed the site. They had to be fixed or reverted.
That is why the final process mixed Lighthouse runs with real phones, long idle tests, and a lot of simply using the page. Performance work on an animated site is not finished when it becomes fast. It is finished when it becomes fast and still feels right.
Where it landed
The portfolio looks almost the same as it did before this work. That is the result I wanted. Underneath, it is smaller where it should be, more deliberate where it is expensive, and backed by tests and performance budgets that make regressions harder to miss.
The biggest lesson was simple: do not start by deleting the ambitious part. First find out why it is expensive. Sometimes the thing that gives a project its identity can stay. It just needs a much better engine underneath it.