Back

Qué Mal Poema

A fully automated daily poetry platform.

Personal project · December 2025 – present

0 entries published
0 CI/CD workflows
0 services integrated

Overview

Qué Mal Poema is a daily poetry publishing platform. Every day it ships one entry: an original poem of mine, a cited poem by another author, and a prose analysis. It has been running since December 2025 with 160+ entries published, every single day, without interruption.

It looks like a simple, clean website. Behind it is a complete publishing system, automated end to end, that I built alone. The goal was to focus 100% on writing and fully delegate publishing and site updates to automation.

The problem

I wanted to publish poetry daily to nurture my passion for writing and sharpen my creative and analytical writing. But daily consistency runs into friction: formatting, uploading files, updating indexes, deploying the site. If every post cost me time and attention, the project wouldn’t survive.

The answer wasn’t to write less — it was to remove the manual publishing work entirely.

The solution

The workflow I designed is the heart of the project: from iPad to live site, hands-off.

  1. I write in iA Writer on my iPad, in plain text.
  2. I run an iOS/iPadOS Shortcut. That’s the only thing I do.
  3. The Shortcut POSTs the text to a Google Apps Script web app, which parses it and writes it to the correct tab in Google Docs.
  4. A GitHub Action pulls the content via the Google Docs API (service-account auth), generates the source text files, and builds the metadata.
  5. OpenAI automatically generates keyword tags for each entry.
  6. The action commits, deploys the static site on GitHub Pages, and notifies me on Telegram that the entry is live.

Architecture

  ✍️  iA Writer (iPad)
        │  plain text
        ▼
  📲  iOS Shortcut  ──POST──▶  ☁️  Apps Script (doPost)
                                      │
                                      ▼
                                 📄  Google Docs
                                      │  Docs API · service account
                                      ▼
  ⚙️  GitHub Action  ──▶  🐍  Python  ──▶  🤖  OpenAI
        │              parse · validate        (keywords)
        │              SHA-256 · merge            │
        │                                         ▼
        │                                 🌐  GitHub Pages
        ▼
  🔔  Telegram: "published ✅"

The only manual step is running the Shortcut. Everything else is automated.

Tech stack

LayerTechnology
AuthoringiA Writer, iOS/iPadOS Shortcuts
Capture bridgeGoogle Apps Script (web app doPost), managed with clasp
ContentGoogle Docs API (service-account auth)
ProcessingPython (parsing, validation, SHA-256 fingerprints, merge)
AIOpenAI API (keyword generation)
CI/CDGitHub Actions (6 workflows)
NotificationsTelegram Bot API
FrontendVanilla JavaScript, HTML, CSS (static)
HostingGitHub Pages

Technical challenges solved

Poem typography rendering

Poems need precise indentation. I built an anchor system (|) that measures pixel positions via a canvas using the actually-rendered font, aligning verses to the exact pixel, plus right-aligned lines.

Edit detection

Each poem carries a SHA-256 fingerprint over normalized text, so I can detect when I edit something in Google Docs and re-publish only what changed.

Idempotency & reliability

I separated metadata (in archivo.json) from poem text, with a pending → merge flow and pre-validation, so automated publishing is safe and repeatable.

Secrets in CI

Service-account credentials are injected securely into the Actions (written via Python to avoid newline issues), never exposed in the repository.

Results

  • 160+ entries published continuously since December 2025.
  • Zero manual publishing work: writing and tapping a Shortcut is the whole process.
  • A simple public-facing site hiding a full pipeline: API integrations, CI/CD automation, and orchestration across multiple services.

What this project demonstrates

I built a complete end-to-end system alone — from mobile capture to production deploy — integrating several APIs and services. But above all, it grew from a real, personal problem: I put technology in service of a creative practice, automating the boring parts to protect the part that matters — writing.