News website

Sanaye No: a news desk with a role-controlled workflow and an SEO-ready site

Sanaye No on the Idepoo newsroom platform: an editorial workflow from draft to publication, a photo desk, reporter administration and multi-channel distribution, with a Next.js public site.

Client
Sanaye No news agency
Year
2025
Status
Live
  • Discovery and analysis
  • UX and UI design
  • Software architecture
  • Front-end development
  • Back-end and API development
  • Database design
  • Third-party integrations
  • Data migration
  • Deployment and DevOps
  • Technical SEO
  • QA and testing
  • Support and ongoing development

The result, in numbers

5
simultaneous delivery channels

Telegram, WhatsApp, web, RSS and email

16
editorial roles

with permissions at three scopes: mine, my desk, everyone

10
states in the editorial workflow

draft to published, with the routes back

The challenge

What was clear from the start: a newsroom with several desks and roles that has to know who holds a story and who approved it; a high volume of photography that must be uploaded and curated in batches; and a site whose stories have to surface fast in Google.

The solution

Launched on the Idepoo newsroom platform — our own product, not a build from zero: an editorial workflow with six main states and six side paths, all recorded with reasons and an audit trail; role-based control with permissions at three scopes; a photo-report desk with resumable batch upload, automatic EXIF ordering and duplicate detection; reporter administration with files, assignments and press cards; and simultaneous delivery to Telegram, WhatsApp, RSS and email through an outbound queue with retries.

The public site was built on Next.jswith server rendering, structured data, Persian slugs and automatic redirects when a slug changes.

Key features

  • A workflow that leaves a trace

    Six states and six side paths; nothing is rejected or returned without a recorded reason.

  • The photo desk

    Resumable batch upload, EXIF ordering, bulk captioning and duplicate detection.

  • Reporter administration

    Files, collaboration periods, assignments, and press cards issued and renewed.

  • Multi-channel distribution

    Telegram, WhatsApp, web, RSS and email, with an outbound queue and delivery tracking.

  • Archive and Persian search

    A full-text index that normalises Persian letter forms and the ZWNJ, over a Jalali archive.

  • News SEO

    Server rendering, structured data, Persian slugs and automatic redirects.

Architecture and stack

Style
Modular monolith
Patterns
Clean architectureCQRSOutbox pattern

A modular monolith on .NET 10: sixteen independent modules — editorial, reporters, photo reports, publishing, distribution, media, search and the rest — with explicit boundaries, in a single deployment. Each module owns its domain and application layer and talks to the others only through a contract; a layer of architecture tests checks those boundaries at build time.

CQRS is used where reads and writes want different shapes: the editorial workflow goes through the write path with domain rules, while the front page, the archive and search come from the read path. Delivery to channels runs through an outbound queue and the outbox pattern, so publishing a story never waits on a slow Telegram or mail provider and no send is lost.

The admin panel is React 19 on Vite and the public site is Next.js 15 with server rendering — both fed by one API. The database is PostgreSQL, and the Persian full-text index runs on it too, rather than adding a separate search engine that would have to be operated separately.

Front end
React.jsViteTypeScriptTailwind CSS

The newsroom panel

Front end
Next.js

Public site, server-rendered with structured data

Back end and API
.NET 10C#REST APIEntity Framework Core

Modular monolith, Minimal API, CQRS

Database
PostgreSQL
Search
PostgreSQL

Persian-aware full-text index and Jalali archive

Infrastructure and deployment
Docker

Docker Compose with automatic migration and health checks

Integrations

  • Telegram and WhatsApp for story distribution
  • Aparat and YouTube for video embeds

Have a similar project in mind?

Fifteen minutes is enough to say what it needs, how long it takes and where to start.