LO-FI WIREFRAME · not final UI
▣ aumik content platform editorial reader embed product context

One content engine. Every product.

Blog and news built once in aumik-agents, reused by every brand through a shared feed widget and a reading portal. Each product gets a content channel to bring in customers — owned posts for SEO & proof, a curated news feed to look current — without per-product CMS code.

See the reader side → Open the editor

The modules

✍ EditorAI-assisted drafting from a brief → human edit → schedule.
📰 News ingestMastra pulls sources, dedupes, summarises, classifies to a review queue.
📚 FeedPublic blog + news, category chips — the <ContentFeed/> widget.
💬 CommentsThreads under each post — the locked composer is the signup funnel.
🔔 NewsletterWeekly digest per product via Novu. Subscribe from any post.
🔗 Embed + RSSDrop the feed into any product; publish an .rss out.

Same module, every product

ProductChannelWhat it publishes
aumik-devBlog + case studiesModernization guides, client results
aumik-doohNews ("Pulse")DOOH / programmatic-OOH industry news
aumik-astroInsight blogRituals, Vedic explainers, horoscopes
aumik-cleaningTips blogHome-care how-tos & checklists
aumik-hospitalityTravel guidesDestination & stays guides

Switch the product context (top-right) to see the same screens re-skinned & re-themed per brand.

Where it lives

LayerHome
Engine (posts · ingest · drafts)aumik-agents · Mastra + Postgres
Embeddable UI@aumik/widgets · <ContentFeed/>
Reading shell@aumik/portal · My reading
News ingestionMastra workflow (n8n fallback)
NewsletterNovu (infra#19)

Supersedes per-product news sites. See the content pipeline →

Content pipeline

Two lanes feed one store: owned posts (AI-assisted) and curated news (Mastra-ingested). Mastra orchestrates; n8n is a fallback adapter.

How content gets made

① Owned — blog & case studies
Brieftopic / outline / client result
Mastra drafting agentwrites a draft + SEO meta from the brief + brand voice
Editorhuman edits & approves (desk-compose)
Schedulepublish now or later
② News — curated industry feed
SourcesRSS · news APIs · press releases · social lists
Mastra ingestfetch → dedupe → summarise → classify (category + which product it's relevant to) → draft
Editorial queuehuman approve / edit (desk-queue)
Publish
One content store (aumik-agents)
<ContentFeed/>per-product feed + article pages
Newsletterweekly digest (Novu)
.rsssyndication out

Why Mastra (n8n fallback)

The LLM steps — drafting, dedupe, summarise, classify — are Mastra agents/workflows (TypeScript, in aumik-agents). Where a connector or trigger is awkward in Mastra (a niche scrape, a scheduler quirk), n8n fetches and POSTs the payload back to the Mastra ingest endpoint. One pipeline of record; n8n is an adapter, not a parallel system.

The shape

post = {
  brand: "dev"|"dooh"|"astro"|...,
  channel: "blog"|"news",
  title, dek, body, keyPoints[],
  category, audience,
  sourceUrl?, sourceName?,   // news only
  seo:{slug, title, description},
  status: "draft"|"scheduled"|"published",
  publishAt
}

Editorial desk

aumik-dev · editorial desk

Drafts

7
3 AI · 4 from news queue

Scheduled

4
next: tomorrow 9:00

Published (30d)

18
12 blog · 6 news

Views (30d)

9.4k
↑ 22% · 38 signups

Recent

2hPublished "3 ways a slow site loses bookings"
1dMastra ingested 6 news items
2dScheduled "Case study: Maple Street Dental"

Compose

Editorial · AI-assisted draft → human edit → publish (the owned-content lane)

Brief → draft

✨ Generate draft uses brand voice + past posts
DRAFT (editable)
How we took Maple Street Dental from a 2019 WordPress site to a booking machine

Maple Street Dental was running WordPress 4.x with seven outdated plugins and a 6-second load time. Here's what we changed — and the result.

[ generated body continues — speed, mobile-first, online booking, the +40% number … ]

Publish settings

Channel
Category
Audience
SEO slug
Meta description
When
Publish Save draft

News queue

Editorial · items Mastra ingested & classified — approve, edit, or discard (the news lane)

ProgrammaticOpenRTB 2.6 brings native DOOH deal IDs to more exchanges
source: AdExchanger · classified → aumik-dooh · 96% relevant
EditApprove
AI / toolingNew framework cuts React hydration cost
source: Hacker News · classified → aumik-dev · 88% relevant
EditApprove
MeasurementAudience panels vs. impression multipliers: the DOOH metric fight
source: MediaPost · classified → aumik-dooh · 91% relevant
EditApprove

Each item is summarised with source attribution and tagged to the product it's relevant to. Nothing publishes without an approve here.

Sources & schedule

Editorial · what the news lane ingests, how often, and which Mastra tool handles it

SourceTypeCadenceMastra tool
Industry RSS (AdExchanger, Digiday, Smashing Mag…)RSSevery 30 minfetchFeed
News APIs (NewsAPI / GDELT, per-brand keywords)APIhourlynewsApi
Press releases (PRNewswire / Business Wire)RSS / scrapehourlyscrape (n8n fallback)
Social (X lists, LinkedIn voices)APIevery 2hsocialFetch (n8n fallback)
Per-product keywords. One ingest run feeds all products — classification tags each item to the brand(s) it's relevant to, so aumik-dev sees dev/AI news and aumik-dooh sees OOH news from the same pipeline.

aumik-dev — guides & case studies

aumik-dev · modernization guides & client case studies

Get the guide digest

One email a week for business owners. No spam.

 

Comments · 2

Join the conversation

🔒 Sign up or log in to comment. Sign up to comment

‹ Back to the feed

My reading

aumik-dev · signed in as Maple Street Dental

Saved

Migrating off WordPress without losing your content or SEO
Guide · saved 1d ago
Read

Subscriptions

Weekly guide digestonManage

My comments

on "…booking machine: Maple Street Dental"View

Same “My reading” shell (@aumik/portal) for every product — only the labels change with the product context.

Join to read & comment

aumik-dev · modernization guides & client case studies

Create account & comment

— or —

G  Continue with Google

Signing up subscribes you to the digest and unlocks comments. For business owners, it's also the front door to the product itself.

Embed the feed

Any product drops in one widget — it talks to the shared content engine

One widget, configured per brand

<AumikWidgetProvider
  agentsBaseUrl="https://agents.aumik.co"
  brand="dev">

  <ContentFeed channel="blog" />   {/* or "news" / "all" */}

</AumikWidgetProvider>

Lives in @aumik/widgets. Same component renders the feed, article pages, comment threads and the subscribe box you saw on the reader side.

Where it's used

aumik-devmarketing site → /blog + case studies
aumik-doohPulse newsroom (news channel)
aumik-astroinsights tab on the reader site
@aumik/portal"My reading" across all products

API contract

What the engine exposes · multi-tenant by {brand}

Content endpoints (aumik-agents)

GET   /api/content/{brand}/posts?channel&category&page
GET   /api/content/{brand}/posts/{slug}
POST  /api/content/{brand}/posts            # create draft (editor)
POST  /api/content/{brand}/ingest           # Mastra/n8n news push
GET   /api/content/{brand}/queue            # pending news drafts
POST  /api/content/{brand}/posts/{id}/comments
POST  /api/content/{brand}/subscribe
GET   /api/content/{brand}/feed.rss         # syndication out

Data model

posts          brand, channel, slug, title, body, category,
               status, publish_at, source_url?, source_name?
drafts         brand, payload, origin: "ai"|"ingest", relevance
sources        brand-keywords, type, cadence, tool
comments       post_id, author, body, created_at
subscriptions  brand, email, channel_prefs (Novu)

Same engine, multi-tenant by brand; the news lane writes drafts with a relevance score, the editor promotes them to posts.