โ† Back to blog

I Actually Fixed Everything. Here's What That Looked Like.

Part 2: I executed every fix from my audit checklist in 48 hours. A dedicated /about page with structured data, an author box on every post, and 12 expanded articles. Here's exactly what changed and why.

by Jay10 min readVIBE.LOG

When I ended Part 1, I had a to-do list.

I didn't wait. Over the next two days, I went from task list to deployed changes. Not because I'm impatient (okay, maybe a little), but because fixing the obvious stuff had to happen before I could credibly reapply to AdSense. Every day the site was in "semi-fixed" state was a day Google's crawler was potentially seeing mixed signals.

Here's what actually happened.


๐Ÿ“„ The /about Page: Proving I'm Real

This was the top priority. Google needed a standalone, indexable page where they could verify that a real human runs this site.

I didn't write a generic bio. I built the entire page around E-E-A-T signals โ€” Expertise, Experience, Authoritativeness, Trustworthiness. These are the actual criteria Google uses to evaluate author credibility, especially for YMYL content (medicine, finance).

The page structure:

/about page architecture:
 
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚  Person Schema JSON-LD                  โ”‚
โ”‚  (credentials, affiliation, photo URL)  โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚  Hero Section                           โ”‚
โ”‚  "Jay โ€” Licensed Pharmacist"            โ”‚
โ”‚  "Senior Researcher at [Company]"       โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚  The Story                              โ”‚
โ”‚  How a pharmacist became an indie maker โ”‚
โ”‚  (proof of domain expertise)            โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚  What I Build                           โ”‚
โ”‚  โ€ข PKยทSwift (pharmacokinetics)          โ”‚
โ”‚  โ€ข VORA (AI meeting assistant)          โ”‚
โ”‚  โ€ข CryptoBacktest (finance)             โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚  Philosophy                             โ”‚
โ”‚  Why I build this way                   โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚  Call to Action                         โ”‚
โ”‚  Read the Blog / Get in Touch           โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

The page is 471 lines. Not because I was padding it โ€” every section had a purpose.

Key move: I included the honest truth. "Jay โ€” licensed pharmacist and senior researcher at a pharmaceutical company. No formal CS background. Builds production-grade AI tools anyway."

Why include the lack of CS degree? Because it's more credible. Anyone can claim expertise in coding. Fewer people will claim they don't have formal training and then show you they built production systems anyway.

The page also integrated Person schema JSON-LD with:

  • @type: Person
  • name, jobTitle, affiliation
  • url (canonical link)
  • Credentials and expertise areas

Then I updated every internal link across the site that used to point to /#story to now point to /about.


๐Ÿ‘ค The Author Box: Humanizing Every Post

This was the other half of the "prove I'm real" strategy.

I created an AuthorBox component that appears at the end of every single blog post:

What the AuthorBox shows:
 
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚  [J]  Written by                       โ”‚
โ”‚       Jay                              โ”‚
โ”‚       Licensed Pharmacist ยท            โ”‚
โ”‚       Senior Researcher                โ”‚
โ”‚                                        โ”‚
โ”‚  "Building production-grade AI tools   โ”‚
โ”‚   across medicine, finance, and        โ”‚
โ”‚   productivity โ€” without a CS degree." โ”‚
โ”‚                                        โ”‚
โ”‚       About the author โ†’               โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

Before the AuthorBox, a reader could finish a post about pharmacokinetics or cryptocurrency without knowing if the author was:

  • A real person
  • An AI writing filler content
  • A 14-year-old with a hobby
  • An established expert

Now every post has author credibility built in. And that link to /about feeds two birds with one breadcrumb: it reinforces that there's a real human here, and it drives internal traffic to the trust-signal page.

Added to all 33 published posts.


๐Ÿ—‘๏ธ The RED Post Intervention

Part 1 identified three posts that were dangerously thin:

Post Length Decision
"Hello World" 183 words Unpublished
"Global UX Is 200 Tiny Fixes" 285 words Expanded to 1,084 words
"Why I Shipped Before Backend" 425 words Expanded to 1,032 words

The "Hello World" post was literally just an introduction. It had to go. Keeping it would signal to Google: "This site publishes filler content."

The other two got the rewrite treatment. I didn't just add words. I added substance:

"Global UX Is 200 Tiny Fixes" started as a one-example post about removing two Korean words from a button. I expanded it to cover the philosophy behind micro-UX improvements, additional real examples from the codebase, before/after comparisons, and code snippets showing the actual changes.

"Why I Shipped Before Backend" was pure philosophy. I rewrote it to include a walkthrough of the actual PKยทSwift shipping strategy, the timeline and decisions, what broke and what held up, and the trade-offs in retrospect.

Same posts. Completely different value proposition.


๐Ÿ’ช The YELLOW Post Surge

Part 1 found that 52% of my posts were YELLOW grade โ€” borderline. Under 800 words, or lacking depth.

I expanded all 12 of them:

Each got the same treatment: technical detail, real code, domain-specific context. The goal wasn't word count padding โ€” it was making sure any reader (or Google's crawler) could actually learn something.

Total: +1,055 lines added across 12 posts.

The breakdown shifted dramatically:

Content Grade Distribution:
 
Before:                        After:
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”      โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ GREEN  13 (39%) โ–ˆโ–ˆโ–ˆ  โ”‚      โ”‚ GREEN  24 (73%) โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ”‚
โ”‚ YELLOW 17 (52%) โ–ˆโ–ˆโ–ˆโ–ˆ โ”‚  โ†’   โ”‚ YELLOW  8 (24%) โ–ˆโ–ˆ   โ”‚
โ”‚ RED     3 ( 9%) โ–ˆ    โ”‚      โ”‚ RED     1 ( 3%)      โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜      โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

A 61% reduction in low-grade content.


๐ŸŽจ Visual Formatting Pass

While I was in expansion mode, I applied formatting improvements to all 33 posts:

  • Section headers with emoji (improves scannability)
  • Bold callouts for key stats and numbers
  • Italic emphasis for important concepts
  • Better code block formatting

This wasn't about changing the message. It was about making the message readable. Google's ranking system doesn't directly score "looks nice," but human readers โ€” including Google's quality reviewers โ€” read more carefully when content is well-formatted.


โš™๏ธ Technical SEO Refinements

Behind the scenes, I fixed the bugs that the audit agents had found:

Google's structured data validator was flagging a missing logo in the Organization JSON-LD:

Before:                        After:
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”       โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ Organization {      โ”‚       โ”‚ Organization {      โ”‚
โ”‚   name              โ”‚       โ”‚   name              โ”‚
โ”‚   url               โ”‚       โ”‚   url               โ”‚
โ”‚   contactPoint      โ”‚       โ”‚   logo โ† NEW        โ”‚
โ”‚ }                   โ”‚       โ”‚   contactPoint      โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜       โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

DateModified Support

Every post used to show the same publish and modified date. Now the frontmatter supports an optional updated field:

---
title: "Some Post"
date: "2026-02-20"
updated: "2026-03-04"   โ† tells Google the content is maintained
---

When this field exists, it populates the BlogPosting schema's dateModified, which tells Google the content is actively maintained โ€” a trustworthiness signal.

Author URL Standardization

Updated the blog post schema, FAQ schema, and layout metadata to link to /about instead of the homepage. Centralizes author credibility in one place.


๐ŸŽฏ Ad Experience Cleanup

Google reviews ad experience during the approval process. I made three fixes:

No-Fill Detection โ€” The AdUnit component now detects when an ad doesn't fill (blank space, network issues) and hides the entire container. Before, empty ad boxes would flash on the page.

Advertisement Label โ€” Added an "Advertisement" label above ad units. Transparency is required by Google's policies, and showing it proactively improves trust.

Better Placement โ€” Moved ads to avoid the "ad sandwich" pattern (content โ†’ ad โ†’ content โ†’ ad โ†’ content). Now there's one ad after the article introduction and one after the blog preview list. The reading experience comes first.


๐Ÿ“Š The Checkpoint

Site Health: Before vs After
 
Before                          After
โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
3 RED posts                     1 RED post (โ†“ 67%)
17 YELLOW posts                 8 YELLOW posts (โ†“ 53%)
13 GREEN posts                  24 GREEN posts (โ†‘ 85%)
No author identity              Full AuthorBox on every post
No /about page                  Dedicated /about with schema
Incomplete schema markup        Complete org + author schema
Empty ad boxes possible         No-fill detection + labels
Ads sandwiching content         Clean ad placement
2 weeks old                     ...still 2 weeks old

The one thing I can't fix: time. Google wants to see 3โ€“6 months of consistent publishing before approving AdSense. I'm still in month one.

But everything else? Fixed.


๐ŸŽฌ What Happens Next

I'm keeping a discipline: one new blog post per week. By early April, I'll have three months of consistent history. By late May, six months.

In April, I'll reapply. Not before. No point rushing โ€” Google will just see the same new-domain flag.

Between now and then:

  • Keep the YELLOW and GREEN posts updated with new information
  • Publish genuinely useful content every week (no filler)
  • Track what works (which posts get engagement and backlinks)
  • Build a real audience, not just Google's approval

If AdSense approves in April, great. If not, I'll audit again and find the next layer of fixes.


๐Ÿง  What I Actually Learned

Here's the thing I didn't expect to realize.

When I first got rejected, I thought Google was being unfair. Thirty-three posts, a fully structured site, all the technical SEO boxes checked โ€” and they said low value? I took it personally.

But after going through every fix, I started seeing it differently.

Google wasn't asking me to game an algorithm. They were asking a simpler question: "If a stranger lands on this site, would they trust it? Would they come back?"

No /about page means no face behind the words. Thin posts mean the author didn't care enough to go deep. No author box means the content could have been written by anyone โ€” or no one. These aren't arbitrary hoops. They're the same things a reader would notice.

The rejection forced me to ask myself a question I'd been avoiding: Am I building this for Google's approval, or for the people who actually read it?

The answer should always be the same. Google's job is to surface content that's worth someone's time. My job is to write content that's worth someone's time. When those two things align, the approval is just a side effect.

I'm not mad at the rejection anymore. It made the site better โ€” not for the algorithm, but for the person reading this sentence right now.

If you're dealing with the same "low-value content" rejection, don't think of it as Google saying your work isn't good enough. Think of it as Google saying: "Show your readers who you are. Give them a reason to stay."

That's not a bad thing to be told.

I'll post an update when the reapplication happens. But honestly? Even if it takes another round, the site is already better than it was two days ago. And that's the part that actually matters.

2026.03.04

Written by

Jay

Licensed Pharmacist ยท Senior Researcher

Building production-grade AI tools across medicine, finance, and productivity โ€” without a CS degree. Domain expertise first, code second.

About the author โ†’
ShareX / TwitterLinkedIn