{"slug": "ai-content-generation-the-automated-blog-draft-feature", "title": "AI content generation: the automated blog draft feature", "summary": "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.", "body_md": "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.\n\nWriting 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.\n\nThe feature is built on a stack that mirrors the rest of DoAide Pulse:\n\n`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`.\n\n``` python\nfrom fastapi import APIRouter, File, Form, UploadFile, Depends\nfrom sqlalchemy.orm import Session\nfrom app.db import get_db\nfrom app.models import Draft\n\nrouter = APIRouter()\n\n@router.post(\"/drafts/\", status_code=202)\nasync def create_draft(\n    file: UploadFile = File(...),\n    llm_key: str = Form(None),\n    db: Session = Depends(get_db),\n    user: User = Depends(get_current_user),\n):\n    content = await file.read()\n    draft = Draft(\n        project_id=user.project_id,\n        source_path=file.filename,\n        llm_provider=\"custom\",\n        llm_key_hash=hash_key(llm_key),\n        status=\"queued\",\n    )\n    db.add(draft)\n    db.commit()\n    celery_app.send_task(\"tasks.generate_draft\", args=[draft.id])\n    return {\"detail\": \"Draft queued for generation\"}\n```\n\n This is where marketing automation pays off in practice.\n\n``` python\nfrom celery import shared_task\nfrom app.db import get_db\nfrom app.models import Draft\nfrom app.llm import generate_from_docs\n\n@shared_task\ndef generate_draft(draft_id: int):\n    db = get_db()\n    draft = db.query(Draft).filter(Draft.id == draft_id).one()\n    llm_key = decrypt_key(draft.llm_key_hash)\n    result = generate_from_docs(draft.source_path, llm_key)\n    draft.generated_content = result\n    draft.status = \"ready\"\n    db.commit()\n```\n\n Getting marketing automation right early saves rework later.\n\nThe 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.\n\n`CHECK` constraint to ensure `devto` Python package (or raw `requests`) with OAuth scopes for publishing.\nThe 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.\n\nBy 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.", "url": "https://wpnews.pro/news/ai-content-generation-the-automated-blog-draft-feature", "canonical_source": "https://dev.to/sumaninster/ai-content-generation-the-automated-blog-draft-feature-234j", "published_at": "2026-10-18 17:15:48+00:00", "updated_at": "2026-10-18 17:17:42.491409+00:00", "lang": "en", "topics": ["ai-tools", "generative-ai", "developer-tools", "ai-products"], "entities": ["DoAide Pulse", "FastAPI", "Celery", "dev.to"], "also_reported_by": [], "alternates": {"html": "https://wpnews.pro/news/ai-content-generation-the-automated-blog-draft-feature", "markdown": "https://wpnews.pro/news/ai-content-generation-the-automated-blog-draft-feature.md", "text": "https://wpnews.pro/news/ai-content-generation-the-automated-blog-draft-feature.txt", "jsonld": "https://wpnews.pro/news/ai-content-generation-the-automated-blog-draft-feature.jsonld"}}