# sourcefabric/newscoop architecture

> Architecture diagram of the GitHub repository sourcefabric/newscoop, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-29). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/sourcefabric/newscoop
- Repository: https://github.com/sourcefabric/newscoop

## Overview

Newscoop is a newsroom CMS for creating, organizing, and publishing multilingual journalism. Its documented workflow centers on staff managing articles within publication issues and sections, then publishing content for readers; authorship, media, geolocation, and templates support that work. The repository also exposes article operations through a REST-oriented controller and includes user-facing account and dashboard features. The tree and excerpts establish capabilities, but do not show enough wiring to map every legacy admin route or publishing transition; those links are therefore kept conservative.

Main entry points: [`newscoop/classes/Article.php`](https://github.com/sourcefabric/newscoop/blob/v4.4/newscoop/classes/Article.php) (Article domain), [`newscoop/classes/Template.php`](https://github.com/sourcefabric/newscoop/blob/v4.4/newscoop/classes/Template.php) (Template engine), [`newscoop/library/Newscoop/Image/UpdateStorageService.php`](https://github.com/sourcefabric/newscoop/blob/v4.4/newscoop/library/Newscoop/Image/UpdateStorageService.php) (Image storage migration), [`newscoop/src/Newscoop/GimmeBundle/Controller/ArticlesController.php`](https://github.com/sourcefabric/newscoop/blob/v4.4/newscoop/src/Newscoop/GimmeBundle/Controller/ArticlesController.php) (Article API)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_editorial["Editorial workflow"]
  node_admin["Admin panel<br/>[admin.php]"]
  node_article_admin["Article editing<br/>[index.php]"]
  node_issues["Issue publishing<br/>[index.php]"]
  node_sections["Section management<br/>[index.php]"]
  node_article_model["Article domain<br/>[Article.php]"]
  node_authors["Author management"]
  node_media["Media archive<br/>[index.php]"]
  node_geo["Geolocation<br/>[GeoLocation.php]"]
end

subgraph group_audience["Reader experience"]
  node_templates["Template engine<br/>[Template.php]"]
  node_dashboard["Journalist dashboard"]
  node_accounts["Reader accounts"]
end

subgraph group_platform["Platform services"]
  node_image_storage["Image storage migration"]
  node_storage_service["Storage service<br/>[StorageService.php]"]
  node_file_storage[("File storage<br/>[Storage.php]")]
  node_database[("Newscoop database")]
end

subgraph group_integrations["Extensions and API"]
  node_rest_articles["Article API"]
  node_extensions["Plugin extensions<br/>[WidgetManager.php]"]
end

node_staff(("Newsroom staff"))
node_readers(("Readers"))

node_staff -->|"uses"| node_admin
node_admin -->|"opens editing"| node_article_admin
node_staff -->|"manages issues"| node_issues
node_staff -->|"manages sections"| node_sections
node_staff -->|"manages authors"| node_authors
node_staff -->|"manages media"| node_media
node_article_admin -->|"edits articles"| node_article_model
node_article_model -->|"persists content"| node_database
node_issues -->|"stores issue data"| node_database
node_sections -->|"stores section data"| node_database
node_authors -->|"stores author data"| node_database
node_media -->|"stores files"| node_file_storage
node_readers -->|"views publication"| node_templates
node_templates -->|"renders content"| node_article_model
node_readers -->|"visits"| node_dashboard
node_readers -->|"registers"| node_accounts
node_rest_articles -->|"uses article service"| node_article_model
node_rest_articles -->|"reads articles"| node_database
node_extensions -.->|"supports widgets"| node_templates
node_image_storage -->|"moves images"| node_storage_service
node_image_storage -->|"updates image records"| node_database
node_storage_service -->|"moves files"| node_file_storage

click node_admin "https://github.com/sourcefabric/newscoop/blob/v4.4/newscoop/admin.php"
click node_article_admin "https://github.com/sourcefabric/newscoop/blob/v4.4/newscoop/admin-files/articles/index.php"
click node_issues "https://github.com/sourcefabric/newscoop/blob/v4.4/newscoop/admin-files/issues/index.php"
click node_sections "https://github.com/sourcefabric/newscoop/blob/v4.4/newscoop/admin-files/sections/index.php"
click node_article_model "https://github.com/sourcefabric/newscoop/blob/v4.4/newscoop/classes/Article.php"
click node_authors "https://github.com/sourcefabric/newscoop/blob/v4.4/newscoop/application/controllers/AuthorController.php"
click node_media "https://github.com/sourcefabric/newscoop/blob/v4.4/newscoop/admin-files/media-archive/index.php"
click node_geo "https://github.com/sourcefabric/newscoop/blob/v4.4/newscoop/classes/GeoLocation.php"
click node_templates "https://github.com/sourcefabric/newscoop/blob/v4.4/newscoop/classes/Template.php"
click node_dashboard "https://github.com/sourcefabric/newscoop/blob/v4.4/newscoop/application/controllers/DashboardController.php"
click node_accounts "https://github.com/sourcefabric/newscoop/blob/v4.4/newscoop/application/controllers/RegisterController.php"
click node_rest_articles "https://github.com/sourcefabric/newscoop/blob/v4.4/newscoop/src/Newscoop/GimmeBundle/Controller/ArticlesController.php"
click node_extensions "https://github.com/sourcefabric/newscoop/blob/v4.4/newscoop/classes/Extension/WidgetManager.php"
click node_image_storage "https://github.com/sourcefabric/newscoop/blob/v4.4/newscoop/library/Newscoop/Image/UpdateStorageService.php"
click node_storage_service "https://github.com/sourcefabric/newscoop/blob/v4.4/newscoop/library/Newscoop/Storage/StorageService.php"
click node_file_storage "https://github.com/sourcefabric/newscoop/blob/v4.4/newscoop/library/Newscoop/Storage.php"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_admin,node_article_admin,node_issues,node_sections,node_article_model,node_authors,node_media,node_geo toneBlue
class node_templates,node_dashboard,node_accounts toneAmber
class node_image_storage,node_storage_service,node_file_storage,node_database toneMint
class node_rest_articles,node_extensions toneRose
class node_staff,node_readers toneIndigo
```

## Components

### Editorial workflow

- [Admin panel](https://github.com/sourcefabric/newscoop/blob/v4.4/newscoop/admin.php): `newscoop/admin.php`
- [Article editing](https://github.com/sourcefabric/newscoop/blob/v4.4/newscoop/admin-files/articles/index.php): `newscoop/admin-files/articles/index.php`
- [Issue publishing](https://github.com/sourcefabric/newscoop/blob/v4.4/newscoop/admin-files/issues/index.php): `newscoop/admin-files/issues/index.php`
- [Section management](https://github.com/sourcefabric/newscoop/blob/v4.4/newscoop/admin-files/sections/index.php): `newscoop/admin-files/sections/index.php`
- [Article domain](https://github.com/sourcefabric/newscoop/blob/v4.4/newscoop/classes/Article.php): `newscoop/classes/Article.php`
- [Author management](https://github.com/sourcefabric/newscoop/blob/v4.4/newscoop/application/controllers/AuthorController.php): `newscoop/application/controllers/AuthorController.php`
- [Media archive](https://github.com/sourcefabric/newscoop/blob/v4.4/newscoop/admin-files/media-archive/index.php): `newscoop/admin-files/media-archive/index.php`
- [Geolocation](https://github.com/sourcefabric/newscoop/blob/v4.4/newscoop/classes/GeoLocation.php): `newscoop/classes/GeoLocation.php`

### Reader experience

- [Template engine](https://github.com/sourcefabric/newscoop/blob/v4.4/newscoop/classes/Template.php): `newscoop/classes/Template.php`
- [Journalist dashboard](https://github.com/sourcefabric/newscoop/blob/v4.4/newscoop/application/controllers/DashboardController.php): `newscoop/application/controllers/DashboardController.php`
- [Reader accounts](https://github.com/sourcefabric/newscoop/blob/v4.4/newscoop/application/controllers/RegisterController.php): `newscoop/application/controllers/RegisterController.php`

### Platform services

- [Image storage migration](https://github.com/sourcefabric/newscoop/blob/v4.4/newscoop/library/Newscoop/Image/UpdateStorageService.php): `newscoop/library/Newscoop/Image/UpdateStorageService.php`
- [Storage service](https://github.com/sourcefabric/newscoop/blob/v4.4/newscoop/library/Newscoop/Storage/StorageService.php): `newscoop/library/Newscoop/Storage/StorageService.php`
- [File storage](https://github.com/sourcefabric/newscoop/blob/v4.4/newscoop/library/Newscoop/Storage.php): `newscoop/library/Newscoop/Storage.php`
- **Newscoop database**

### Extensions and API

- [Article API](https://github.com/sourcefabric/newscoop/blob/v4.4/newscoop/src/Newscoop/GimmeBundle/Controller/ArticlesController.php): `newscoop/src/Newscoop/GimmeBundle/Controller/ArticlesController.php`
- [Plugin extensions](https://github.com/sourcefabric/newscoop/blob/v4.4/newscoop/classes/Extension/WidgetManager.php): `newscoop/classes/Extension/WidgetManager.php`

### Other components

- **Newsroom staff**
- **Readers**

## Connections

- Newsroom staff → Admin panel: uses
- Admin panel → Article editing: opens editing
- Newsroom staff → Issue publishing: manages issues
- Newsroom staff → Section management: manages sections
- Newsroom staff → Author management: manages authors
- Newsroom staff → Media archive: manages media
- Article editing → Article domain: edits articles
- Article domain → Newscoop database: persists content
- Issue publishing → Newscoop database: stores issue data
- Section management → Newscoop database: stores section data
- Author management → Newscoop database: stores author data
- Media archive → File storage: stores files
- Readers → Template engine: views publication
- Template engine → Article domain: renders content
- Readers → Journalist dashboard: visits
- Readers → Reader accounts: registers
- Article API → Article domain: uses article service
- Article API → Newscoop database: reads articles
- Plugin extensions → Template engine: supports widgets
- Image storage migration → Storage service: moves images
- Image storage migration → Newscoop database: updates image records
- Storage service → File storage: moves files
