Tidenda

Security

Isolation, sign-in, roles, audit, secrets, signing and the organisation's own duties.

On this page

Tidenda keeps each organisation's content separate from every other organisation, lets each organisation decide who may do what, and signs what it publishes so that others can check it. This page is for administrators and security reviewers deciding how far to trust the platform, and where their own responsibility starts.

Organisation isolation

Every document, API key, webhook, workflow, AI operation, file and audit record belongs to exactly one organisation. Every read and write is limited to the organisation of the request, and no public interface or member action reaches across.

  • Members sign in and work in one active organisation at a time. Everything they see is filtered to it.
  • API keys belong to one organisation. The key decides the organisation; a payload naming another one is ignored.
  • Storage is separate per organisation: each has its own storage bucket for files, and the database enforces the organisation boundary on every row.
  • Webhooks fire only for events in the organisation that owns them.

A request for a document in another organisation is answered with 404 Not Found, so the platform does not reveal whether it exists.

Deleting an organisation

Only an owner can delete an organisation, after several confirmations; there is no undelete. Deletion removes its documents, files, settings, keys and webhooks, and everything its public sites serve. Open editing sessions are closed at once, and nothing more can be written from the moment deletion starts. People who belonged only to that organisation lose their account; people who also belong to another keep it there. A record of the deletion (when, by whom, and the outcome) is kept, as is the history of who was granted access.

Authentication

Members sign in through an OpenID Connect identity provider. The platform stores no passwords; the identity provider handles credentials, multi-factor authentication and federation. The browser holds only an HTTP-only session cookie. Signing out also ends the session at the identity provider, so the next sign-in asks for credentials again.

Integrations use API keys issued by an administrator. A key is a random 32-byte secret, shown once when it is created and stored only as a one-way hash, so a lost key must be replaced. Each key carries scopes that limit it to specific jobs: documents:create, phrases:read, phrases:write or publisher:read. A new scope is never added to existing keys automatically. See API overview.

Transport and browser. All traffic uses HTTPS, with certificates issued and renewed automatically. The application's Content Security Policy runs scripts only from the application's own address: no inline script runs except the application's own, allowed by its hash, and no script is loaded from another host.

Roles

What a member may do is decided by their roles in that organisation. A role belongs to a membership, the pairing of one person with one organisation, never to the person's account. The same person can be an owner in one organisation and an editor in another, and nothing carries over between them. The identity provider says who a person is, never what they may do.

Role Intended for May
owner Whoever is accountable for the organisation Everything an admin may, plus grant the owner role and delete the organisation
admin Day-to-day administration Manage members and roles, API keys, webhooks, workflows, AI, tags, spelling and organisation settings; switch the public site on or off and rebuild its content; permanently delete images and audio; erase removed members; everything a publisher may
publisher Whoever controls the public site Configure, publish and verify the domain of the public site, plus everything an editor may
editor Editorial staff Create and edit content

Each role includes the one below it. A member can hold several, and gets the combined permissions. New members are editors unless the inviter chooses otherwise.

Workflows add one more check. A workflow transition lists the roles allowed to take it, and the match is literal: listing only publisher excludes an admin who does not also hold publisher. See Workflows.

Guarantees

  • No escalation. A member can only grant roles they hold themselves. An admin can make another admin but never an owner.
  • There is always an owner. The last owner cannot be demoted, suspended or removed; the request is refused as a whole. To hand over, grant ownership to someone else first.
  • Revocation is fast. Roles are checked on each request, not stored in the sign-in token, so a removed role stops working within seconds, without waiting for a session to expire.
  • Suspension is complete. A suspended member keeps their record and history but has no permissions at all.
  • The server decides. Hiding a control is never the only check. Every request that changes, publishes or verifies the public site is checked against the caller's roles on the server and refused with 403 without them, including edits to the site's settings made in the live editor.
  • Switching the public site off takes it down. Its copies of articles and images are deleted from the site, every address on it answers 404, and nothing more is published to it until it is switched back on. See Public site.

Deletion and erasure

Journalism is archived, not deleted. Articles and planning items leave circulation by moving to cancelled, which can be reversed. Their history, and the signed snapshots of what was published, stay.

Wires are kept. Wires cannot be deleted from the app. They stay, with their earlier versions and signed snapshots, so every article keeps a source that is still there.

Media can be deleted for good. Members with the owner or admin role can permanently delete an image or an audio recording with its transcript, after a confirmation. Deletion removes the content everywhere the platform keeps it: the files, the document and every earlier version, the signed snapshots, cached and in-progress copies, and derived records such as usage records and the bodies of AI requests and responses. What remains is a record that the document existed, its type, and when and by whom it was deleted; its id stays reserved. An image or recording that a usable or withheld article uses cannot be deleted until it is removed from that article. See Media and Wires.

Erasing a member. Removing a member (archiving their profile) stops them signing in but keeps who they were. An owner or admin can then erase them:

  • their profile keeps its place, so links to it still resolve, but their name, email, department and job title are replaced, and the profile's earlier versions are deleted;
  • their sign-in account is disabled, signed out and deleted at the identity provider. A person who also belongs to another organisation keeps their account there; only this organisation's membership is removed;
  • in this organisation's records of who did what (the access-change audit, document histories, the AI record, AI label changes, image-rights acknowledgements, video approvals, source check warnings set aside and video shares), their id and email are replaced by a pseudonym. The same pseudonym is used everywhere in the organisation, so the records stay complete and still read as one person's, but they no longer say who that person was. The pseudonym cannot be traced back without a secret held by the platform, and differs between organisations;
  • their private documents, such as saved items and preferences, are permanently deleted.

Bylines and author links in articles are part of what was published and stay as published. Erasure cannot be undone. A member who is still active cannot be erased, and nobody can erase themselves.

Backups. The platform's database is backed up nightly and each backup is kept for 14 days. A deleted backup is kept for 14 more days before it expires for good. Content that is permanently deleted or erased therefore leaves the backups within about four weeks. A backup is restored only to recover from a failure, never to undo a deletion.

Audit

  • Document history. Every status change is recorded in the document's own history: from which status to which, who made it (a member, or a named system process such as an AI operation), when, and, for published versions, the snapshot's signature.
  • Access changes. Every role grant, change, suspension, removal and the creation of the organisation's first owner is recorded in the same step that applies it, with who did it, to whom, the roles before and after, and the time. Refused attempts are not recorded. This record survives the deletion of the organisation. Erasing a member is recorded here too, under the member's pseudonym.
  • Permanent deletes are recorded: which document, of which type, by whom and when, with none of its content.
  • Organisation deletion is recorded as described above.

API key and webhook changes and sign-ins are not part of the audit record.

Secrets and signing

Each secret is kept according to what it is for:

  • API keys are stored only as one-way hashes.
  • Webhook secrets are stored retrievably, because the platform needs them to sign every delivery. They are never shown after creation and cannot be rotated in place; replace a webhook to replace its secret.
  • AI connector keys are stored retrievably, because the platform needs them to call the provider. They are never shown after they are entered, and can be replaced.
  • Signing keys are held in the deployment's secret store, never in the database or in source control.

Signing. Every document version that reaches usable or withheld is captured as an immutable snapshot and signed with Ed25519. Uploaded images and audio are signed the same way, and so are transcript segments an editor verifies. Each kind of content has its own signing domain, so a signature for one can never pass for another. Signing keys rotate on the platform operator's schedule, and earlier public keys stay published so older signatures keep verifying.

Webhook deliveries carry two protections: an HMAC-SHA256 signature over the request, which proves the delivery came from the platform, and the snapshot's Ed25519 signature, which proves the content is unchanged wherever it travels. See Signatures and Webhook reference.

Plugins and AI providers

Plugins run in the member's browser with that member's own access, under the same organisation and role checks, and only versions an administrator has enabled are loaded. Plugin code comes only from approved publishers and is checked against its published digest before it runs. See Plugins.

AI operations send document content to the provider of the connector they use, under the organisation's own agreement with that provider. A document's history and internal notes are never sent. The models included with the platform run inside the deployment. See AI integrations.

Customer responsibilities

Some things only the organisation can do:

  • Keep API keys secret. A leaked key allows whatever its scopes allow. Store keys in a secret manager, never in source control, and replace a key at the first suspicion.
  • Harden webhook receivers. Verify the HMAC signature before reading the body, use HTTPS, and do not log rejected payloads. See Setting up webhooks.
  • Verify downstream. When published content is passed on, its receivers should verify the Ed25519 signature. The platform publishes what they need; it cannot make them check.
  • Choose plugins and AI providers. An enabled plugin can do anything the member using it can. A connector sends content to a third party. Enable only what the organisation needs.
  • Review roles. Keep the owner and admin roles to the people who need them, and remove members who leave.

Reporting a security issue

Report suspected vulnerabilities privately to the operator of the deployment in use; for the Tidenda project itself, use the contact details on the project's home page. Do not disclose a vulnerability in public issues or chat channels before the operator has had a reasonable chance to respond.