Epoch
Built with Java 17, Spring Boot, MyBatis-Plus, React, MySQL, Redis, RabbitMQ, Elasticsearch, Docker
A community site I built and still run. People join topic groups, post and comment, chat inside each group, message each other and keep a personal schedule with reminders. The homepage is a recommended feed, and the interface is all in English.
How it grew
I started it in January 2024 while working in China, as a small forum on a familiar stack: Spring Boot with server-rendered FreeMarker and layui pages.
After moving to Melbourne to study, I rebuilt it in stages. First came the upgrade from Java 8 to 17 and the security basics, like secrets sitting in the code and weak password hashing. Then the back end became a REST API and the front end was rewritten in React. Each stage went live separately, so the site stayed up throughout.
Studying here shaped what came next. I'm moving the infrastructure to AWS in Sydney with what I learned in my cloud computing unit: nightly backups already go to S3, and uploaded files are now written to S3 as well. Since most new visitors read English, I translated the interface and later made English the only language. Reminders run on Melbourne time.
Along the way I also added an NBA stats section with 50 seasons of data, open to visitors.
Working out what to build
New features start from what people ask for or run into, and I look into each request before building anything. When people wanted to delete a comment without losing the replies under it, I made deleted comments leave a placeholder so the thread still reads. People also told me the data tables needed too much sideways scrolling on a phone, so I reworked the columns until a phone screen showed seven instead of about four.
The newest piece is the recommended feed on the homepage. It gathers candidates (new posts, popular ones, picks from group owners, people you follow), ranks them with a hot score that halves every seven days, then spreads topics out so one busy group can't take over the page. Each card shows why it's there, private groups never leak into it, and posts you've already opened move down.
Measure first
One page felt slow, and I assumed the database was to blame. It wasn't. The query took 17 ms, but the response was 2.89 MB of uncompressed JSON. Turning on gzip cut it to about 390 KB.
The AWS plan started the same way. Measuring showed the search engine held 340 KB of posts but used 2.45 GB of memory, so the plan replaces it with MySQL full-text search and keeps the whole setup within $75 a month.
Making English the only language meant changing about 1,700 translation calls and 3,260 stored values. I wrote a codemod for the code and ran the data migration once inside a rolled-back transaction to check the row counts before doing it for real.
Running something people rely on has taught me as much as building it. Their posts live on it, so the database is backed up every night, and in a restore drill I had it back in two minutes.