Anime Semantle

Devlog

← Back to Game

A chronological record of how Anime Semantle was designed, what broke, and how it got fixed, newest first. This includes the missteps and failed attempts, not just the parts that went smoothly. New entries get added to the top of this list as changes land. For a retrospective on the AdSense review saga specifically, see this write-up.

Strategy guide, answer statistics, and solve-rate tracking

Published a strategy guide built from real similarity data — reference tables and a full walkthrough using measured values like "when the answer was One Piece, Naruto scored 0.552 and Haikyu!! scored 0.000." Also added an answer statistics page aggregating the daily answer archive (genre distribution, anime/character ratio), regenerated automatically every day. Finally, deployed a Cloudflare Worker + D1 API that counts daily players, solvers, and give-ups — once enough data accumulates, per-day solve rates will be published.

Paying down SEO tech debt — redirects and the sitemap

The third review came back with the same rejection, so this time the whole site got audited from a crawler's point of view. Two problems surfaced. First, internal links and canonicals pointed at .html URLs that the host 307-redirects, causing duplicate indexing and canonical errors — all internal URLs across 50 files were unified to the extensionless form. Second, Google hadn't re-read the sitemap in three weeks because an old version contained an invalid changefreq value (quarterly). A regex bug in the daily automation that silently stopped sitemap updates was found and fixed too, and the sitemap was resubmitted in Search Console along with indexing requests for the new pages.

Contact email address changed

Changed the contact inbox to hograywm@gmail.com. Updated the email on the main page footer note, the contact page, and the privacy policy page across both KO and EN.

robots.txt cleanup, a contact page, deploy config fix

Removed a robots.txt Disallow rule that was conflicting with the noindex meta tags, letting search engines actually read them. Added a standalone contact page, and fixed a Cloudflare Workers deploy failure caused by a missing wrangler.jsonc config file.

A fix that made things worse, then a change of direction

On top of the wordlist page, 36 genre pages were added — and the second review rejected the site for the same "low-value content" reason. The actual cause turned out to be that this had scaled up a pattern of repackaging MyAnimeList data 34x over. Those pages were set to noindex to remove them from search, and a daily-updating past-answers archive unique to this site was built instead. The about page was also updated with the actual measured data behind the similarity weighting choice. A redirect-loop SEO issue on the about/privacy/archive pages was discovered and fixed during this same investigation.

"Low-value content" rejection, and a list page in response

AdSense rejected the site for "content with little value." Assuming the standalone game itself was too thin, a full anime/character wordlist page was built in response. In hindsight, this specific fix set up the next rejection.

Monthly auto-refresh + Discord notifications

Locked in the monthly data refresh schedule and added a Discord notification summarizing new/removed titles after each update. The first version had a bug that misflagged existing entries as new, fixed the next day.

The fight against CLS (layout shift)

Spent several days tracking down layout shift during page load — locking the scrollbar, reordering the results section, and chasing down the remaining sub-pixel shifts. The similarity calculation logic was also redesigned from scratch around this time, and the "70% structure + 30% synopsis" weighting used today traces back to this rework.

Building the auto-update pipeline

Set up GitHub Actions to automate data collection, translation, and similarity computation for the first time. The pipeline built here is still the basis for the monthly automated data refresh running today.

Expanding the answer pool and splitting into chunks

The number of precomputed neighbors stored per item grew in stages from 100 to 3,000. As the data grew, we hit Cloudflare Pages' 25MB per-file limit, so the similarity JSON was split into 5 separate files. The English version and character translations were also added around this time.

First deploy

Anime Semantle went live. The initial setup included the meta tags and ads.txt required for ad review, along with basic SEO tags.