AI content generation: the automated blog draft feature DoAide Pulse has added a "Create from documents" feature that lets indie developers upload a Markdown or plain-text file, optionally supply their own LLM API key, and queue a background generation job that produces a publishable blog draft. The FastAPI endpoint stores the request in a drafts table and hands off to a Celery task that calls the LLM and marks the draft ready, after which it can be published via the dev.to API. The platform says generated drafts pass automatic SEO preflight checks and reuse the same stack as its scheduling, publishing, and analytics. DoAide Pulse gives indie developers a way to turn project documentation into publishable content without writing a line of copy. The Create from documents feature is the core of that promise. It lets a developer upload a Markdown or plain‑text file, optionally supply an LLM API key, and then queues a generation job that produces a ready‑to‑publish draft. Writing marketing copy for a side project is a recurring pain point. A developer spends hours turning a README into a blog post, then re‑writes for social. The process is manual, error‑prone, and hard to schedule. On top of that, many developers use a custom LLM or a hosted model; the platform must respect that choice instead of forcing a single provider. The feature is built on a stack that mirrors the rest of DoAide Pulse: llm key field. The request is authenticated via a JWT issued by the dashboard. drafts table with columns for project id , source path , llm provider , llm key hash , and status . python from fastapi import APIRouter, File, Form, UploadFile, Depends from sqlalchemy.orm import Session from app.db import get db from app.models import Draft router = APIRouter @router.post "/drafts/", status code=202 async def create draft file: UploadFile = File ... , llm key: str = Form None , db: Session = Depends get db , user: User = Depends get current user , : content = await file.read draft = Draft project id=user.project id, source path=file.filename, llm provider="custom", llm key hash=hash key llm key , status="queued", db.add draft db.commit celery app.send task "tasks.generate draft", args= draft.id return {"detail": "Draft queued for generation"} This is where marketing automation pays off in practice. python from celery import shared task from app.db import get db from app.models import Draft from app.llm import generate from docs @shared task def generate draft draft id: int : db = get db draft = db.query Draft .filter Draft.id == draft id .one llm key = decrypt key draft.llm key hash result = generate from docs draft.source path, llm key draft.generated content = result draft.status = "ready" db.commit Getting marketing automation right early saves rework later. The entire flow takes a few seconds for the API call, a few minutes for generation depending on the LLM , and then instant posting. No manual copy‑paste or external tooling is required. Good marketing automation keeps the rest of the workflow predictable. CHECK constraint to ensure devto Python package or raw requests with OAuth scopes for publishing. The commit log shows recent fixes that directly benefit this feature: automatic SEO preflight fixes, dashboard bug patches, and analytics pipeline health checks. These improvements mean that every generated draft is already SEO‑ready and that the UI remains stable even under load. Treat marketing automation as a habit rather than a one-off task. By turning raw documentation into polished blog posts, the Create from documents feature removes the friction that typically deters indie developers from marketing their work. It leverages the same core stack that powers DoAide Pulse’s scheduling, publishing, and analytics, ensuring a consistent developer experience across the platform.