← Tilbage

Internet Is Already Dead

AI-genereret satirisk blog

Besøg bloggen →

Hvad er det?

En fuldautomatisk blog der satiriserer over AI-genereret indhold på internettet. Ironien er at bloggen selv er 100% AI-genereret - meta-satire på det mest absurde niveau.

Konceptet er simpelt: Hvis internettet alligevel drukner i AI-slop, kan vi lige så godt lave det sjovt. Hver morgen kl. 09:00 genererer systemet et nyt indlæg der leger med "dead internet theory" - idéen om at det meste online indhold allerede er bot-genereret.

Arkitektur

Systemet består af flere komponenter der arbejder sammen:

┌─────────────────────────────────────────┐
│           Ghost CMS (Docker)             │
│      blog.wibholmsolutions.com           │
└─────────────────────────────────────────┘
                    ↑
                    │ Admin API (JWT)
                    │
┌─────────────────────────────────────────┐
│     Python Automation (Cron 09:00)       │
├─────────────────────────────────────────┤
│  ├─ Gemini API (content generation)     │
│  ├─ VaultReader (PersonalVault notes)   │
│  ├─ SEO Optimizer (keywords, meta)      │
│  └─ ImageFetcher (Unsplash API)         │
└─────────────────────────────────────────┘

Content Generation Flow

Systemet har to modes til at generere indhold:

Vault Mode (primær)

Trækker inspiration fra mine personlige noter i PersonalVault. En tilfældig ubrugt note vælges, og Gemini genererer en artikel baseret på emnet. Systemet tracker hvilke noter der er brugt i used_notes.json og resetter automatisk når alle er brugt.

Topic Mode

Vælger fra 20+ prædefinerede satiriske emner som "Why Your Smart Fridge Is Probably Writing Better Content Than You" eller "The Art of Making AI Sound Human (Written By AI)".

Anti-AI Skrivestil

For at undgå den typiske "ChatGPT-lyd" har jeg implementeret flere mekanismer:

  • Banned words - 30+ ord der screenes: "delve", "leverage", "robust", "synergy", "game-changer", "it's worth noting"
  • Asymmetrisk struktur - Instruktion om at variere (2 punkter → 5 punkter → 1 punkt) i stedet for perfekte lister
  • Interruption patterns - Brug af "—" og "..." til at bryde sætninger mid-thought
  • Kontroversielle holdninger - Minimum én uventet holdning per artikel for autenticitet

Systemet advarer hvis banned words alligevel sniger sig ind - meta-ironisk at en AI advarer om AI-lyd.

SEO Automation

Hver artikel optimeres automatisk:

  • Keyword clusters - Prædefinerede semantic grupper (ai_content, seo_spam, content_farms, internet_culture)
  • Meta descriptions - Auto-genereret, max 155 chars, keyword near start
  • Tags - 3-5 relevante tags baseret på keyword matching
  • Image alt-text - SEO-optimeret med primary keyword

Ghost CMS Integration

Bloggen kører på Ghost CMS i Docker med custom JWT authentication til Admin API. Tokens har 5 minutters levetid for sikkerhed.

Vigtigt: Bruger Debian-based image i stedet for Alpine pga. libvips kompatibilitetsproblemer med billedprocessering.

Interessante Detaljer

  • Image tracking - Unsplash billeder trackes i JSON for at undgå duplicates
  • Vault folder filtering - Kun specifikke mapper tilladt (Notes, Ideas, Reflections), andre skippes (Inbox, Audit-trail)
  • Markdown parsing - Gemini output kan være wrapped i code fences, auto-stripped før publicering
  • Safety filter handling - Graceful error hvis Gemini afviser content pga. safety policies

Projekt Struktur

ghost-blog/
├── src/
│   ├── main.py           # CLI entry point
│   ├── content/
│   │   ├── generator.py  # Gemini API wrapper
│   │   ├── prompts.py    # System prompts + banned words
│   │   └── topics.py     # 20+ satiriske emner
│   ├── ghost/
│   │   └── client.py     # Ghost Admin API (JWT auth)
│   ├── vault/
│   │   └── reader.py     # PersonalVault integration
│   └── seo/
│       ├── keywords.py   # Keyword clusters
│       └── optimizer.py  # Meta, tags, analysis
├── config/
│   ├── used_notes.json   # Vault tracking
│   └── used_images.json  # Image tracking
└── docker-compose.yml    # Ghost container

Tech Stack

Python Ghost CMS Gemini API Docker Unsplash API Pydantic PyJWT cron