www.mybakingcreations.com — Custom cakes, cookies, cake pops & cupcakes serving the San Francisco Bay Area since 2012.
Built by George Abrahamyan. Baked by Yana.
- Hosting: GitHub Pages (
gugosf114.github.io) - Domain: mybakingcreations.com (via CNAME)
- CSS: Single
style.css(~5,000 lines), CSS custom properties, fully responsive (375px–1100px+) - JS: Vanilla JavaScript, no frameworks
- Fonts: Google Fonts (Nunito, Fredoka One)
- Analytics: Google Analytics (GA4) + Google Tag Manager
- Forms: Web3Forms + Google reCAPTCHA
- Chatbot: Cloudflare Worker backend
- Internal Dashboard: Firebase Realtime Database + Firebase Storage (thursday/)
- Images: All WebP format (converted via
convert-to-webp.py, quality 82) - SEO: Schema.org structured data, Open Graph, Twitter Cards, sitemap.xml
- Dev Dependencies: Node.js (cheerio, css-tree, glob, sharp, png-to-ico)
| Color | Hex |
|---|---|
| Pink | #EC268F |
| Yellow | #FFC532 |
| Orange/Brown | #C36239 |
| Dark Brown | #622D2B |
| Cream | #9A9590 |
| Page | File | Description |
|---|---|---|
| Home | index.html |
Hero carousel (9 slides), services preview, trusted company logos, Instagram feed |
| About | about.html |
Yana's story, self-taught artist background, process timeline |
| Gallery Hub | gallery.html |
Main gallery with category navigation |
| Contact | contact.html |
Contact form (Web3Forms), phone, email, address |
| Blog | blog.html |
Blog hub with 3 published articles |
| Order Form | order-form.html |
Full order form with flavor dropdowns, date picker, product selection |
| Page | File | Description |
|---|---|---|
| Buy Now | buy-now.html |
Fast checkout for printed image cookies, 48-hour nationwide shipping |
| Order Printed | order-printed.html |
Photo cookie ordering |
| Corporate Order | corporate-order.html |
Corporate quote request, 24-hour turnaround, invoice/PO accepted |
| Page | File |
|---|---|
| Cakes Hub | gallery-cakes.html |
| Sculpted Cakes | gallery-cakes-sculpted.html |
| Realistic/Illusion Cakes | gallery-cakes-realistic.html |
| Wedding Cakes | gallery-cakes-wedding.html |
| Page | File |
|---|---|
| Cookies Hub | gallery-cookies.html |
| Hand-Piped Cookies | gallery-cookies-hand-piped.html |
| Printed Image Cookies | gallery-cookies-printed.html |
| Page | File |
|---|---|
| Cake Pops | gallery-cakepops.html |
| Cupcakes | gallery-cupcakes.html |
| Page | File |
|---|---|
| Corporate Cake Pops | gallery-corporate-cakepops.html |
| Corporate Cakes | gallery-corporate-cakes.html |
| Corporate Cookies Hub | gallery-corporate-cookies.html |
| Corporate Printed Cookies | gallery-corporate-cookies-printed.html |
| Corporate Cupcakes | gallery-corporate-cupcakes.html |
| Page | File |
|---|---|
| Corporate Services | corporate.html |
| Partners (15% referral program) | partners.html |
| Article | File |
|---|---|
| Best Wedding Cake Flavors | blog-best-wedding-cake-flavors.html |
| Corporate Event Dessert Ideas | blog-corporate-event-dessert-ideas.html |
| How to Order a Custom Birthday Cake | blog-how-to-order-custom-birthday-cake.html |
| City | File |
|---|---|
| San Francisco | custom-cakes-san-francisco.html |
| Palo Alto | custom-cakes-palo-alto.html |
| Mountain View | custom-cakes-mountain-view.html |
| San Jose | custom-cakes-san-jose.html |
| Daly City | custom-cakes-daly-city.html |
| San Rafael | custom-cakes-san-rafael.html |
| Page | File |
|---|---|
| 404 Error | 404.html |
| Order Form Modal | order-form-modal.html |
| Color Preview (internal) | color-preview.html |
| Thursday Dashboard (internal) | thursday/index.html |
about-1.html, contact-3.html, gallery-7.html, services-5.html, cakes.html, cookies.html
| File | Lines | Purpose |
|---|---|---|
script.js |
~1,470 | Main site: mobile menu, dropdowns, smooth scroll, order form modal, search, form validation |
carousel.js |
44 | Hero carousel: 9 slides, auto-rotate (4s), dot nav, responsive breakpoints |
nav-particles.js |
154 | Canvas-based animated balloon particles in header, collision detection, brand colors |
tilt-effects.js |
232 | 3D tilt hover effects on service cards, Instagram posts, company logos, spark effects |
activity-feed-widget.js |
42 | Live recent-orders feed widget (fetches recent-orders.json) |
chatbot.js |
~350 | AI chatbot widget, Cloudflare Worker integration, conversation history |
chatbot-worker.js |
— | Chatbot backend worker logic |
consultation-widget.js |
— | Consultation booking widget |
activity-feed.js |
— | Activity feed functionality |
generate-sitemap.js |
209 | Node.js sitemap generator, scans all HTML, generates sitemap.xml |
add-lazy-loading.js |
— | Adds lazy loading attributes to images |
add-theme-color.js |
— | Theme color management |
cake-preview-worker.js |
— | Cake preview worker |
js/schema-component.js |
— | Schema.org structured data injection |
| Section | Description |
|---|---|
| CSS Variables & Foundation | Brand colors, shadows, font fallbacks, responsive breakpoints |
| Halo Glow Frame | Fixed-position animated glow effect around page edges |
| Header & Navigation | Logo, dropdown menus with subcategories, mobile hamburger, search bar |
| Hero & Carousel | Multi-slide hero, text box with badge/logo/buttons, dot navigation |
| Service Cards & Grids | Tile grids (2/3/4-column), hover effects, 3D tilt animations |
| Order Form Modal | Full-screen modal, flavor dropdowns, form fields |
| Gallery Grid System | Masonry layout, lightbox, category filtering, lazy loading |
| Corporate Section | Company logo grid, trust indicators, activity feed |
| Consultation Page | Animated gradient orbs background |
| Corporate Order Page | Particles canvas, premium badge styling |
| Blog Post Styling | Article layout, featured images, typography |
| Partners Page | Referral program layout |
| Footer & Social Sidebar | Site footer, floating social links |
| Responsive Breakpoints | 375px, 480px, 768px, 968px, 1100px |
Additional: chatbot.css (~10,000 lines) for the chatbot widget.
| Service | Purpose |
|---|---|
| Firebase | Realtime Database + Storage for thursday dashboard (order management, file attachments) |
| Google Analytics (GA4) | Traffic tracking (G-KB96GDJ011) |
| Google Tag Manager | Event tracking |
| Google Fonts | Nunito, Fredoka One |
| Calendly | Consultation booking |
| Web3Forms | Form submission handling |
| Google reCAPTCHA | Spam protection |
| Cloudflare Workers | Chatbot backend, cake preview worker |
25 Fortune 500 / major company logos displayed: Google, Meta, Microsoft, Salesforce, OpenAI, Stripe, Pinterest, Instagram, Facebook, Yelp, PayPal, Discord, DocuSign, Gap, Levi's, Kaiser, Alaska Airlines, Golden State Warriors, and more.
images/
├── Branding/ Logo variations, cake box mockup
├── gallery/
│ ├── cakepops/ 33 cake pop photos
│ ├── cakes/ Sculpted & themed cakes
│ ├── realist/ Realistic illusion cakes
│ ├── wedding/ Wedding cakes
│ ├── cupcakes/ Cupcake photos
│ └── cookies/
│ ├── hand piped/ Hand-decorated cookies
│ └── printed/ Photo cookies
├── carousel 1-9.webp Hero carousel slides
company logos/ 25 corporate partner logos
All images are WebP format. convert-to-webp.py automates JPG/PNG conversion at quality 82.
| Script | Language | Purpose |
|---|---|---|
convert-to-webp.py |
Python | Batch convert images to WebP (quality 82) |
compress_images.py |
Python | Image compression |
resize_images.py |
Python | Image resizing |
generate-sitemap.js |
Node.js | Auto-generate sitemap.xml from HTML files |
add-lazy-loading.js |
Node.js | Add lazy loading to all images |
Automated validation runs on every push and PR via GitHub Actions. It checks for broken internal links, missing images/assets, CSS syntax errors, and conflicting CSS declarations.
Run locally before pushing:
npm install cheerio css-tree glob
node .github/scripts/validate-site.js- Internal broken links and missing assets are blocking errors (build fails)
- External URL issues (Yelp 403s, CDN timeouts) are non-blocking warnings
- CSS conflicts in the same selector are blocking (prevents cascade regressions in
style.css)
The GitHub Actions workflow (.github/workflows/validate-and-deploy.yml) runs validate first, then deploys to Pages only if validation passes.
Password-protected PWA at /thursday/ for internal order management:
- Firebase Realtime Database for order tracking
- Firebase Storage for file attachments
- Revenue dashboard with price columns
- Calendar view for active orders
- Due date alerts
- Smart email parser for extracting order details
- Contact links and gold-accented UI
- sitemap.xml: 30+ URLs with priority hierarchy and change frequencies
- robots.txt: Allows all crawlers including AI bots (GPTBot, ClaudeBot, PerplexityBot)
- Schema.org: Bakery, Product, Service, FAQPage, BreadcrumbList on every page
- Open Graph + Twitter Cards: Social media preview support
- Canonical URLs: Duplicate content prevention
- 6 Local SEO pages: City-specific landing pages for Bay Area coverage
- 3 Blog articles: SEO-optimized content for wedding, corporate, and birthday markets
- Instagram: @mybakingcreationscompany
- Facebook: MyBakingCreationsCompany
- Pinterest: MyBakingCreations
- Yelp: Business page linked from floating sidebar
- 9-slide auto-rotating hero carousel
- Canvas-based animated balloon particles with collision detection
- 3D tilt hover effects with light reflection
- Electric spark effects on CTA buttons
- Live activity feed showing recent corporate orders
- AI chatbot with Cloudflare Worker backend
- 700+ products indexed in site search (
search-data.json) - Masonry gallery grids with lightbox viewing
- Mobile-responsive across all breakpoints
.nojekyllfile to prevent Jekyll processing on GitHub Pages
- Phone: (415) 568-8060
- Website: mybakingcreations.com
This section tracks ongoing SEO/indexing work and Claude-assisted sessions. If you're a future Claude session picking this up: read here first, then check Google Search Console for the latest numbers.
Traffic — mybakingcreations.com
| Source | Metric | Value |
|---|---|---|
| GA4 (all channels) | Active users/day | ~40 |
| GA4 | 7-day active users | 217 |
| GA4 | 30-day active users | 1.1K |
| GA4 | Engagement rate | 95.3% |
| GA4 | Key events (28d) | 7.1K (+193%) |
| GSC (Google organic search subset) | Clicks (90d) | 1,120 |
| GSC | Indexed pages | 60 |
| GSC | Not-indexed pages | 82 |
| GSC | Indexing ratio | ~42% |
Channel mix (GA4, 7-day sessions, Apr 9-15 2026):
| Channel | Sessions | % |
|---|---|---|
| Organic Search | 136 | 44% |
| Direct | 92 | 30% |
| Unassigned | 59 | 19% (up 637% WoW) |
| Organic Social | 18 | 6% |
| Referral | 3 | 1% |
Important — don't make assumptions about channel mix:
- GSC ≠ total traffic. GSC only measures Google organic search clicks (~44% of total). The remaining ~56% comes from Direct, Unassigned, Organic Social, and Referral.
- GSC's organic-search count is accurate. It matches GA4's Organic Search sessions 1:1 (~19/day). Don't doubt the GSC number; just understand its scope.
- "Unassigned" is not the same as "no traffic." In GA4, Instagram bio/story clicks from iOS in-app browsers, GBP profile clicks without UTM tagging, and untagged SMS/email campaigns all land in Unassigned because the referrer is stripped. A 637% spike here is a real signal worth investigating. Probably Instagram or GBP, but confirm by checking Landing Page reports or setting up UTM tagging on outbound links.
- Organic Social (18 sessions) undercounts Instagram. Only clean-referrer clicks count here. Most real Instagram traffic is hiding in Unassigned or Direct.
- Key events +193% WoW.
view_corporate_order(756) andview_order_form(754) are the top two — this is actual buying-intent signal, not vanity traffic. - Singapore 18 users/7d — suspicious for a Bay Area bakery. Probably bot traffic from Singapore data centers. Worth IP filtering in GA4 Admin → Data Streams if it grows.
Not-indexed breakdown:
| Reason | Count | Source | Notes |
|---|---|---|---|
| Discovered – currently not indexed | 34 | Templated city/event/corporate pages. Do NOT request indexing — see warning below. | |
| Alternate page with proper canonical | 18 | Website | Benign www/non-www duplicates. |
| Page with redirect | 13 | Website | Likely the working half of old→new URL migration. |
| Redirect error | 10 | Website | Old www./custom-cakes-{city}.html loops. Self-resolved. Google validation started 3/28/26. |
| Not found (404) | 5 | Website | Trending down, aging out naturally. |
| Blocked by robots.txt | 1 | Website | /gallery-7 — Wix stub, correctly blocked. |
| Crawled – not indexed | 1 | /favicon.ico — benign, not a page. |
|
| Indexed-though-blocked (warning) | 1 | Website | www./gallery-7 — removal request submitted 4/15/26. |
Google rolled out a MARCH 2026 SPAM UPDATE (Mar 24–25) followed by a MARCH 2026 CORE UPDATE (Mar 27 – Apr 8). These updates targeted scaled content abuse, templated AI-written pages, doorway pages, and mass city-page networks.
This site came out ahead of the update, not behind it. Here's the actual indexing trajectory before/during/after:
| Date | Indexed | Δ | Context |
|---|---|---|---|
| Mar 11 | 54 | — | pre-update stable |
| Mar 16 | 51 | -3 | pre-update shedding |
| Mar 18 | 49 | -2 | pre-update shedding |
| Mar 22 | 44 | -5 | bottom (pre-update purge) |
| Mar 24–25 | — | — | SPAM UPDATE HITS |
| Mar 25 | 48 | +4 | initial rebound |
| Mar 29 | 59 | +11 | biggest recovery jump |
| Apr 05 | 59 | +1 | stable |
| Apr 07 | 60 | +1 | peak |
The site lost 10 pages from the index in the two weeks leading up to the update (Google shedding pre-update), then recovered +15 pages in 7 days during the update window, and has held steady since.
Downstream effect (GA4, 3-day lag consistent with Google's rollout cadence):
- Apr 01: session-duration anomaly (+6s over upper forecast bound)
- Apr 09-15: key events +193% WoW (
view_corporate_order,view_order_form— buying intent) - Apr 09-15: Unassigned channel +637% WoW (newly-indexed pages drawing in-app browser traffic)
Interpretation: The site was already building toward good-citizen status before the update (real content, real photos, real clients, real reviews). Google's re-evaluation during the March 2026 window added pages back and started surfacing them in actual search queries about 3 days later, driving a measurable buying-intent lift.
Still: do NOT click "Request Indexing" on the 34 "Discovered – not indexed" URLs. Those are the remaining templated-looking pages (12 city + 11 event + 4 corporate + 7 misc). The footer-matrix remediation (shipped 4/15) removed the bipartite-linking fingerprint that would have flagged them. They'll either organically get indexed over time or they won't — force-indexing risks undoing the favorable classification the site just earned.
Options for the 34 leftovers, in order of safety:
- Consolidate the 27 templated clones → 1 rich hub page (safest, best long-term)
- Differentiate heavily — unique content, stats, photos per page (most work)
- Wait and watch — let them stay uncrawled (zero downside)
- Leave as-is; ignore — they contribute zero clicks today anyway
Problem: 33 HTML files (index, order-form, and 31 custom-cakes-{city}.html files) each contained a footer block linking to all 30 city pages = ~930 internal matrix links sitewide. That's a textbook bipartite doorway-network topology signature — exactly what Google's March 2026 spam update flags.
Fix: Replaced the 30-city matrix footer with a single hub link to /delivery-areas. Commit: a9ae151.
Net change: 33 files, 66 deletions → 33 insertions. 930 matrix links removed. Topology is now hub-and-spoke instead of bipartite.
Fix script: was _fix_footer.py (DOTALL regex match for <div class="footer-locations">...View All...</div> block). Removed before commit. If this pattern comes back elsewhere, recreate the script.
For quick drilldown navigation — https://search.google.com/search-console/index/drilldown?resource_id=sc-domain%3Amybakingcreations.com&item_key={CODE}:
| Code | Reason |
|---|---|
CAMYFiAC |
Discovered – not indexed |
CAMYFCAC |
Redirect error |
CAMYCyAC |
Page with redirect |
CAMYGCAC |
Alternate page with proper canonical |
CAMYFyAC |
Crawled – not indexed |
CAMYDSAC |
Not found (404) |
CAMYByAC |
Blocked by robots.txt |
CAMYBCAD |
Indexed, though blocked by robots.txt (warning) |
CAMYCCAC |
Excluded by noindex tag |
CAMYECAC |
Duplicate, Google chose different canonical |
Goals: Diagnose why 82 pages weren't indexed; address specific GSC issues flagged as "Failed" or "Not Started" validation.
Work done:
- Pulled full GSC indexing report. Mapped all 9 not-indexed reason codes to item_keys for future drilldown.
- Identified footer link-matrix as programmatic-SEO fingerprint. All 33 pages with footer linked to all 30 city pages = 930 matrix links. Replaced with single
/delivery-areashub link. - Traced 10 "Redirect error" URLs — all old
www./custom-cakes-{city}.htmlchains that were looping at time of March 11 crawl. Verified via PowerShellInvoke-WebRequestthat loops are now gone (single clean 301 → 200). GSC validation already started 3/28/26; no action needed. - Drilled all 3 single-URL buckets:
- Crawled-not-indexed →
/favicon.ico(benign) - Blocked-by-robots →
/gallery-7(Wix stub, correctly blocked) - Indexed-though-blocked warning →
www./gallery-7(ghost from old Wix site)
- Crawled-not-indexed →
- Submitted GSC Removals for both
/gallery-7variants (non-www and www). Both "Processing request" as of 4/15. Prior Jan 12 removal had expired. - Did NOT fix structured data errors (FAQ 4, Breadcrumbs 3, Merchant 2, Product 2) — ran out of tool budget. Next session should pick this up.
Educational context shared with operator: March 2026 Google spam update mechanics, AI fingerprint detection stack (structural HTML hashing, cross-page similarity matrices, publishing velocity, perplexity/burstiness, entity density, internal linking topology), programmatic-SEO industry carnage post-update.
Files changed: 33 HTML files (footer block), committed a9ae151, pushed to main.
Operator catch #1: Claude reported GSC "1,120 clicks / 15-21 per day" as if it were total traffic. It isn't — GSC only measures Google organic search. Actual GA4 numbers: ~40 users/day, ~217 7-day, 1.1K 30-day. Channel mix: Organic Search 44%, Direct 30%, Unassigned 19% (up 637% WoW), Organic Social 6%, Referral 1%.
Operator catch #2: Claude assumed the Unassigned 637% spike was Instagram. Operator confirmed it isn't — he uses a bakers-agent automation app for social posting and has only posted a handful of times via that app recently. Source of Unassigned spike is still unknown — candidates: GBP profile clicks without UTM, untagged SMS/email, in-app browsers from various sources, AI-search referrals.
Operator catch #3: Operator suggested correlating the April 1 GA4 session-duration anomaly with the date of the biggest indexing jump. Claude pulled the raw GSC indexing timeline:
- Mar 22: indexed bottomed at 44
- Mar 24-25: Google Spam Update rolled out
- Mar 29: indexed jumped to 59 (biggest +11 single-day jump in the recent window)
- Apr 01: GA4 session-duration anomaly (3-day lag, consistent with Google's rollout cadence)
Reframe: Claude had been pitching the March 2026 update as a threat. Data shows the opposite — the site LOST 10 pages pre-update (54→44, Mar 11-22), then GAINED 15 pages during the update window (44→59, Mar 22-29), and has held steady since. The April 1 engagement spike and +193% WoW key events lift are downstream effects of newly-indexed pages starting to drive real search traffic. The footer-matrix fix shipped 4/15 is preemptive defense for future updates, not damage control for this one.
README updated to reflect:
- GSC ≠ total traffic (explicit disclaimer)
- GA4 channel mix table
- Google update section reframed: "THIS SITE WON" with indexing timeline proving it
- "Request Indexing" warning preserved (the 34 leftovers are still a risk if you force them)
- 2026-04-06: README.md created (11 KB, full site inventory).
- 2026-01-12: Bulk GSC removal submissions for 9 Wix-era stubs (
/about-1,/contact-3,/_frog,/cart,/_api/*,/services-5,/gallery-7). All marked "Removal expired" as of 4/15 — Google only holds removals for ~6 months. Re-submission is expected if warnings recur.
If you're a fresh Claude instance picking this up, here's what will save you 30 minutes of re-discovery:
Environment setup:
- Repo lives at
C:\Users\georg\Documents\GitHub\gugosf114.github.io\. CNAME → mybakingcreations.com. - GSC access: user is logged in to Google at
gugosf@gmail.com. Launch a CDP Chrome session viaC:\Users\georg\Desktop\launch-chrome-cdp.ps1, then useunified-automationtools with session namegsc. - Branch protection is on
main. Pushes succeed with owner bypass; the "Cannot update this protected ref" message is noise, not an error — check the ref-update line at the end of git push output.
Things NOT to do:
- ❌ Don't "Request Indexing" on any of the 34 Discovered-not-indexed URLs. That's the programmatic-SEO trap the March 2026 update was built for. (See Operations Log — the site just WON that update. Don't undo it.)
- ❌ Don't quote GSC click numbers as if they represent total site traffic. GSC = Google organic search only (~44% of total here). GA4 has the real number. Always check GA4 before making traffic claims.
- ❌ Don't assume the Instagram handle is driving most traffic. It isn't, at least not in a way GA4 can see. Organic Search is the biggest channel. If the operator says something doesn't match your assumption, trust him — he built the business and knows the channel mix.
- ❌ Don't push back on the homepage live-activity feed or the Fortune 500 corporate-client logos. Those are real orders/real clients with photos. Operator is a JD-trained compliance specialist who stress-tests adversarially — he'll correct you hard if you reflexively audit without substantiation. Already been through that loop.
- ❌ Don't create new programmatic city/event/corporate template pages. Pattern is what Google flags, not content. If something like that comes up, the answer is "consolidate into a rich hub, don't expand."
Things TO do:
- ✅ Read this README's Operations Log + Session Log before doing any SEO work.
- ✅ Use direct GSC drilldown URLs with
item_keycodes (table above) instead of clicking through the UI — faster and uses fewer tool calls. - ✅ When in doubt about operator intent, proceed with reasonable defaults rather than asking. He wants execution, not clarifying questions.
userPreferencesexplicitly says so. - ✅ Keep the hub-and-spoke internal linking topology. If you add new landing pages, link to them from the appropriate hub (e.g.,
/delivery-areas), not from every other page.
Open items (priority order):
- Structured data errors (highest-impact unfinished work). FAQ=4, Breadcrumbs=3, Merchant listings=2, Product snippets=2. Navigate via GSC sidebar (Enhancements → FAQ, Shopping → Product snippets/Merchant listings). Direct URLs like
/structured-data/faq404 — use the sidebar navigation. Drill each error row to get affected URL + specific schema field violation. Then fix JSON-LD in the affected HTML files. - 34 Discovered-not-indexed URLs — strategic decision needed: consolidate, differentiate, or leave. Not urgent; they contribute zero traffic.
- Confirm
/gallery-7removal processing completes (~24–48hr typical). If it flips back to "expired" before 6 months, that's a Google-side bug worth noting.
Operator communication style:
- Direct, concise, no corporate hedging.
- Reads thinking tags primarily, not polished output.
- Expects push-back when warranted — don't fold to agree.
- "LETS GO SIR" = execute. "hold on" = stop and think.
- Tone-match. He is in stress-test mode by default.
— Claude (session 2026-04-15)