I didn’t build my own blog because existing platforms are broken—I built it because I wanted a simple workflow: write my thoughts in one place, publish them on my own domain, and avoid writing and reformatting the same content again and again across multiple platforms.
Inspired by the clean, straightforward approach of Nithin Kamath’s blog (https://nithinkamath.me/blog/) and the UI of LinkedIn, I built an independent home on the web at https://blog.potluri-krishna-priyatham.tech with an end-to-end publishing, syndication, and feedback pipeline.
1. Native In-App AI Studio: Conversational Drafting & Refinement
Rather than copying and pasting drafts between external chatbots and a blog CMS, the platform includes a native AI Studio (`/ai_studio`) directly integrated into the dashboard. Powered by Google Gemini (`gemini-3.5-flash-lite`), it acts as an intelligent co-author for brainstorming and structuring content through iterative mutual discussion.
Dual Modes: Micro-Post vs. Long-Form Article
* **Micro-Post Mode:** Crafts punchy, high-engagement updates with tags and real-time X/Twitter 280-character boundary limits, paired with an interactive live card preview. * **Long-Form Article Mode:** Generates clean, modular Markdown blocks—including headings, code snippets, and key takeaways. Crucially, the AI drafts text and structure only; image and video uploads remain strictly manual so authentic diagrams and media can be attached in the editor without placeholder hallucinations.Bidirectional Pre-loading & Live Sync
The studio features zero-loss state transfer: clicking **AI Draft** from the post composer or article editor instantly carries any unsaved in-progress text and existing blocks into the studio. Conversely, when a draft is finalized, a single click can publish it immediately or load the structured blocks back into the editor to upload media and configure YouTube embeds.
2. Multi-Platform Syndication & Platform Adaptation
The blog follows the POSSE (Publish on Own Site, Syndicate Elsewhere) philosophy: content is created and canonically hosted on my personal domain, and selectively fanned out to external networks from a unified publishing interface.
Platform Adaptation: LLM Condensation
Different social networks have drastically different character constraints (e.g. 280 characters on X/Twitter vs. 3,000 on LinkedIn). Instead of bluntly cutting off sentences mid-thought, the syndication pipeline features an intelligent LLM rewrite engine (`core/syndication/rewrite.py`). It condenses the text down to fit the target platform's exact character allowance while preserving the author's voice, facts, and core meaning. Rewrites are cached by text SHA-1 and character room to avoid redundant API calls.
Dynamic Text Cards for Visual Platforms (Instagram & Pinterest)
Image-first networks like Instagram and Pinterest reject text-only updates. Rather than requiring manual design work in Canva or Photoshop, the backend incorporates an automated text-card generator using Pillow (`core/syndication/textcard.py`). When a text-only post is dispatched to Instagram or Pinterest, the engine dynamically renders the summarized text onto a clean, high-resolution (1080x1080) branded gradient card and attaches it as the primary image with the full post text as the caption.Direct Native LinkedIn REST API
Beyond multi-platform gateways, the blog integrates directly with LinkedIn’s native `/rest/posts` REST API over OAuth 2.0. This avoids third-party subscription fees and rate limits. The integration includes proactive token health checks (detecting revoked or expired tokens immediately) and automated dead-link detection to catch removed posts or login redirects.Long-Form Article Syndication (Medium, Dev.to & Hashnode)
For long-form articles, the syndication engine connects to developer ecosystems: * **Medium:** Browser bridge and manual story linking flow that validates external story URLs, registers syndication links, and tracks outbound reader journeys. * **Dev.to:** Direct integration via the Forem REST API v1 (`/api/articles`), publishing articles with canonical backlink headers. * **Hashnode:** Automated article creation via Hashnode's GraphQL API with publication ID mapping and canonical URL attribution.
YouTube Video Upload Pipeline
For video content, the composer features a dedicated YouTube upload pipeline (`/youtube/<post_id>`). It allows configuring YouTube-specific metadata (custom titles, descriptions, categories, tags, and privacy visibility) directly within the app. Video files stage chunk-by-chunk on the server and are automatically purged from local disk immediately upon successful upload. On the article page, embedded players use privacy-conscious `youtube-nocookie.com`.
3. Bi-Directional Linking & Telegram Issue Tracking
Syndication is not a one-way street:
* **Backlinks Everywhere:** Every syndicated post includes a direct backlink to the canonical post on my blog, while the blog post itself displays an interactive "Also on:" row with live badges linking to each social post.
* **Telegram Delivery Alerts:** As soon as background syndication completes, an instant Telegram notification arrives with direct URLs to all published posts.
* **Two-Way Bug Tracker:** If I notice a typo, broken link, or rendering bug on mobile, I simply reply directly to the Telegram delivery alert. The webhook bot automatically files a GitHub issue in the repository with the post context so it can be tracked and resolved.
4. Zero-SDK Cloud Storage & Backend Core
The application runs on Python 3 and Flask, hosted on Render with DNS, SSL, and media delivery routed through Cloudflare.
* **Zero-SDK Cloudflare R2 Adapter:** To avoid heavy cloud SDKs (like `boto3`) and bloated dependencies, media uploads use a custom standard-library SigV4 HMAC-SHA256 signature adapter that communicates directly with Cloudflare R2's S3-compatible API over standard HTTP. Media filenames are uniquely generated with timestamps and random hex to eliminate CDN cache collisions.
* **MongoDB Atlas Document Store:** Powered by MongoEngine ODM, providing a flexible polymorphic document schema for posts, comments, analytics events, and issue reports.
* **Rich Media Handling:** Native renderers for videos (MP4, WebM, MOV), audio (MP3, WAV, FLAC), PDF document viewer embeds, and document file attachments.
5. Privacy-First Telemetry & Outbound Analytics
Instead of loading intrusive third-party trackers or ad scripts, the blog uses a lightweight in-house analytics engine:
* Measures pageviews, scroll depth, and reading duration milestones (30s, 60s, 180s engaged time).
* Interactive emoji reactions (`like`, `heart`, `fire`, `clap`, `insightful`).
* Outbound syndication click attribution via `/api/analytics/track_click` to monitor which social platforms actually drive reader engagement back to the canonical site.
6. Modern AI Discoverability (/llms.txt)
To ensure modern AI search engines and LLM agents can understand and reference the blog without scraping clutter, the site serves structured `/llms.txt` and `/llms-full.txt` markdown feeds. This provides AI crawlers with clean, machine-readable manifests of articles, architectures, and technical notes.
7. The Open Challenge: Cross-Platform Mentions
While almost every social platform uses the `@` symbol, individuals rarely have the exact same handle everywhere (e.g. `@john_doe` on X, `@johndoe` on LinkedIn, and `@johndoe.bsky.social` on Bluesky). Resolving and mapping a collaborator's varying handles across networks without manually tweaking each post is the next puzzle on the roadmap.
Final Words
The project is open-source on GitHub: https://github.com/kittupriyatham/Blog
For anyone building multi-platform publishing pipelines: how do you manage handle mapping and cross-platform mentions?