Repository navigation
Releases: Haphior/seredina
Release list
Seredina v0.4.0
Upgrading from 0.3.x
Follow Updating to a new release:
back up the database and .env, git checkout v0.4.0, then rebuild
with the same compose command you started the installation with.
-
Migrations. Four database migrations run automatically:
- the directory, contract payments and inventory fields;
- the logo and banner images for emails;
- installation settings;
- message authors.
They only add tables, columns and types; the upgrade from 0.3.1 was
checked with data (docs/adr/0074-upgrade-check.md). -
Updates from the console are optional. To use them, run
bash scripts/enable-updater.shonce afterwards (Linux hosts). Without
it, Settings → Updates still checks for new versions. -
Worker. The worker now gets
WEB_ORIGINtoo;infra/docker-compose.yml
passes it. -
Agents. Installed agents need nothing. From their next check-in,
laptops are filed as laptops, and their monitors appear as assets. -
Node.js 22. The images now build on Node 22; the rebuild takes care of
it. Running from source (development) needs Node 22 or later. -
Single sign-on. If SSO creates accounts automatically with Google or a
generic provider and lists no allowed domains, existing users still sign
in, but new accounts wait until an admin adds the domains. With a generic
provider that doesn't sendemail_verified, turn that claim on at the
provider.
Security
-
Single sign-on.
- Automatic accounts with Google or a generic OpenID Connect provider now
need a list of allowed email domains. Without one, anyone with an account
at the provider (any Gmail address, say) could join the workspace.
Microsoft is unaffected: it is pinned to one directory. - A generic provider must say the email is verified (
email_verified).
Accounts are matched by email, so an unverified address could have
signed in as whoever already has it here. - A sign-in is bound to the browser that started it, with a short-lived
cookie, so a callback link from someone else's sign-in no longer logs
you in as them.
- Automatic accounts with Google or a generic OpenID Connect provider now
-
Dependency updates:
vite6.4.4: command handling of the editor launcher on Windows, a
server.fs.allowbypass, cross-origin script execution through custom
middleware.fast-jwt6.3.5: its verifier cache accepted expired tokens without
iat. Seredina's own tokens always carryexp.hono4.13.11 (used by the MCP SDK):serveStaticdecoded paths twice.postcss-selector-parser6.1.5: CPU exhaustion on long flat selectors
(GHSA-rj75-hqrm-r3gf), backported to the 6.x line Tailwind 3 uses.vitest5.0.3 (tests only): two@vitest/mockeradvisories.@modelcontextprotocol/sdk1.32.1: the MCP server's HTTP transport now
rejects oversized request bodies (413) and bounds JSON-RPC batches.sharp0.35.5: bounds checks in image processing.source-map-js1.2.2: a denial-of-service fix, CVE-2026-93749.
These undo Dependabot's grouped update (#20), merged after 0.3.x: it moved
the console to Tailwind 4 and its lockfile dropped a package the console's
build needs, so the console's Docker image did not build. The console stays
on Tailwind 3.
Added
- Updates from the console (
docs/adr/0077-in-app-updates.md).- Settings → Updates shows the running version and the newer releases
with their notes. - It installs one with a single click, once the optional
updater
service is on (bash scripts/enable-updater.sh, Linux): database backup
first, then fetch, rebuild and restart, with a live log. - Release sources: GitHub
Haphior/seredinaby default, or your own fork
or any git repository (internal mirror), with a token for private ones.
- Settings → Updates shows the running version and the newer releases
- Change a ticket's contact from the ticket: an existing contact or a
new one by email.- An internal note records the change.
- Earlier messages keep who wrote them; replies from colleagues in copy are
now attributed to them too.
Changed
- Node.js 22 in every image and in CI, instead of Node 20, which reached
end of life in April 2026. The OpenAI SDK's version 7 requires it. - Dependencies:
openai7,@fastify/cors11,@sentry/node11,
net-snmp3.29.2,@huggingface/transformers4.3.1.
Fixed
- Forwarded emails with no body.
- Emails forwarded as an attachment (Outlook and Gmail) now show the
forwarded message's sender, date, subject and text. - Emails whose text part is blank show their HTML content as text.
- Emails forwarded as an attachment (Outlook and Gmail) now show the
- The notifications panel no longer hides behind the page with the
Frutiger Aero theme, and is opaque and wider. - The author of system messages shows as "Sistema"/"System" instead of
SYSTEM.
Added
- Directory of companies and people
(docs/adr/0076-directory-payments-inventory.md).- Suppliers, customers, partners and internal areas, with tax ID and
contact details. - Their people (account executives, technical, billing...), with phone
and mobile. - Separate from the contacts who write in: email is optional and
retention never erases them.
- Suppliers, customers, partners and internal areas, with tax ID and
- Contract payments with email reminders.
- Link a contract to a supplier and a person from the directory.
- Set a payment schedule (monthly to yearly, or one-time) and who to
remind. - Seredina emails a branded reminder before each due date and again if it
passes unpaid. - "Record payment" keeps a history and moves to the next due date.
- New Contract payment due notification.
- Full IT inventory.
- New equipment types: laptops, tablets, switches, routers, firewalls,
access points, storage, UPS, monitors, peripherals, docks, scanners,
projectors, IP phones and cameras. The asset list is grouped by
computers, network, peripherals and infrastructure. - Assets record an asset tag, a location, who uses them, what they plug
into, the supplier, purchase date and cost, and warranty end. - The agent files laptops as laptops and registers a computer's monitors
by serial number. - The network scan recognizes more kinds of devices.
- New equipment types: laptops, tablets, switches, routers, firewalls,
Install or update
See the guide, "Updates and backups", in the documentation. In short:
git fetch --tags && git checkout v0.4.0
docker compose -f infra/docker-compose.yml up -d --buildBack up the database first. Migrations run on start and only go forward.
Seredina v0.3.1
Added
- Windows Server with Docker Desktop is supported and documented
(docs/adr/0075-windows-docker-desktop.md): a deployment page (en/es)
andinfra/docker-compose.desktop.yml, which puts the worker on the
compose network instead of host networking. CI builds and runs the stack
with that layout too.
Fixed
- Cloning on Windows no longer breaks the migrate container and the setup
scripts:.gitattributeskeeps LF line endings on every OS. - The compose smoke test now fails if the worker can't reach Postgres or
Redis, instead of only checking that its container is running.
Upgrading from 0.3.0
No database changes. On Linux nothing changes. On Docker Desktop, add
-f infra/docker-compose.desktop.yml to your docker compose commands.
Install or update
See the guide, "Updates and backups", in the documentation. In short:
git fetch --tags && git checkout v0.3.1
docker compose -f infra/docker-compose.yml up -d --buildBack up the database first. Migrations run on start and only go forward.
Seredina v0.3.0
Upgrading from 0.2.0
Follow Updating to a new release:
back up, git checkout v0.3.0, docker compose -f infra/docker-compose.yml up -d --build.
- Four database migrations run automatically (teams' members, notification
defaults and events, customer email templates, first-run setup). They only
add tables and columns: the upgrade from 0.2.0 was checked with data
(docs/adr/0074-upgrade-check.md). - Administrators see a reminder on the dashboard to go through the new
initial setup; "It's already set up" dismisses it. Choosing Spanish there
renames the four default statuses (Open → Abierto...) unless you renamed
them yourself. - Existing workspaces switch to Spanish customer emails; set the language to
English under Settings → Customer emails to keep English. - Installed agents need nothing.
Added
- Every change is checked against an upgrade from the previous release
(docs/adr/0074-upgrade-check.md). CI installs the last release, fills it
with data, upgrades it with the new migrations and fails if any existing
row changed or the old data can't be read back.
scripts/upgrade-check.shruns the same check locally. - Frutiger Aero theme (
docs/adr/0073-frutiger-aero-theme.md), under
Settings → Appearance: a sky gradient with bubbles, frosted-glass panels,
an aqua accent and glossy buttons. - First-run setup (
docs/adr/0072-first-run-setup.md): after
registering, five skippable steps take a workspace from empty to usable:- organization name, language and working hours (presets and time zone);
- connect the support mailbox;
- pick a kind of support: internal IT, customer support or
plant/manufacturing. Each one creates teams, a Category field, SLA
targets, saved replies and service catalog items, in your language,
without touching anything you already have; - invite your team from a pasted list;
- a summary with next steps.
Admins of a workspace that hasn't finished it see a reminder on the
dashboard; Settings → Initial setup reopens it.
- Connecting a mailbox with a password fills in the servers of Gmail,
Outlook.com, Yahoo, iCloud and Zoho from the address. - Teams you can manage (
docs/adr/0071-teams-and-notification-events.md).
Administration → Teams creates, renames and deletes teams and sets their
members; a person can be in several teams. Until now a new workspace had
only the "General" team and no way to add another. Deleting a team keeps
its tickets, without a team. - More notifications, and workspace defaults for them
(docs/adr/0071-teams-and-notification-events.md).- New events: a ticket lands in my team with nobody assigned; a customer
reopens a ticket; someone @mentions me in an internal note; an SLA target
is about to be missed (80% of its time used); an SLA target was missed.
Ticket events go to the assignee, or to the team when nobody is assigned. - Type
@in an internal note to mention a colleague. - Admins set what everyone gets, in the app and by email, under
Notification settings. Each person can still choose for themselves, and
go back to the workspace default.
- New events: a ticket lands in my team with nobody assigned; a customer
- Branded customer emails in your company's language
(docs/adr/0070-customer-email-templates.md).- Every email to a customer uses your logo, an optional banner and your
color, a signature, the customer's last message quoted, and "Powered by
Seredina" under the message. The logo and banner can be uploaded or
linked; the banner can link somewhere. - Administration → Customer Emails sets:
- the language (Spanish by default, or English);
- the sender name;
- the company signature;
- the wording of each automatic email, with a live preview and a test
send.
- New automatic emails: an acknowledgement when a request arrives, never
sent to autoresponders, and an optional "request closed" email. - "Request resolved" now tells the customer, in your words, with the
survey as a button. - Each agent sets their own signature under Account security.
- Every email to a customer uses your logo, an optional banner and your
Changed
- Settings in one place: the sidebar keeps the daily work (tickets,
contacts, processes, knowledge base, CMDB) and a Settings entry. The
Settings page groups the 27 configuration pages by what you're setting up
(channels, tickets and service, people and access, AI, organization), each
with a one-line description, and a search box. Configuration pages link
back to it. - Works on a phone: a top bar with a menu button opens the sidebar as a
drawer; the ticket queue shows one card per ticket; ticket detail stacks
its details under the conversation; pages use narrower margins. - Spanish that reads as Spanish everywhere.
- A workspace registered in Spanish starts with Spanish status names
(Abierto, Pendiente, Resuelto, Cerrado) and Spanish customer emails. - Priorities, the ticket's channel and the built-in role names show in the
console's language instead of LOW/URGENT, "agent" or "admin". - Dates follow the console's language and the browser's region
(27/9/26, 18:40 rather than 9/27/2026, 5:57:07 PM). - The console and the Spanish documentation use "tú" throughout; a few
screens and most of the docs used "vos".
- A workspace registered in Spanish starts with Spanish status names
- Sign-in on a self-hosted server no longer asks for the organization:
there is only one, so the page fills it in. The "create an organization"
link is gone there too, and/registerexplains that the server already
has its organization instead of failing with a technical error. - New ticket can set the team and the assignee right away, and they
are notified as if assigned afterward. - SLA policies take minutes, hours or days, save every edited priority
with one button, and can be filled in with suggested targets. - The dashboard no longer shows hidden widgets as empty cards (they're
under "Add widget"), and the first-steps checklist starts with connecting
a mailbox. - The ticket queue explains where tickets come from when there are none
yet, with buttons to log one or connect a mailbox; the assignee filter
says "Any assignee" instead of just "Any". - A customer reply to a resolved ticket now reopens it, as a reply to a
closed ticket already did. Its first resolution time is kept. - Assigning a ticket to yourself no longer sends you a notification.
- Nothing customer-facing is in English anymore for a Spanish-language
company. These now follow the email language:- portal sign-in, password reset and invitation emails;
- agent notifications;
- merge notices;
- "(no subject)";
- the attachments-not-saved note.
- Existing workspaces switch to Spanish emails on upgrade; set the
language to English in Customer Emails to keep English. - Agent replies are now emailed for service catalog requests too, not only
for email and portal ones. - The worker needs
WEB_ORIGIN(already set forapi) for the portal link
in emails;infra/docker-compose.ymlpasses it.
Fixed
- The "contract about to expire" notification preference could not be saved.
Install or update
See the guide, "Updates and backups", in the documentation. In short:
git fetch --tags && git checkout v0.3.0
docker compose -f infra/docker-compose.yml up -d --buildBack up the database first. Migrations run on start and only go forward.
Seredina v0.2.0
The first release meant for production use on a company server. See
Production on a company server
and Updates and backups.
Added
-
Versioned releases.
- Install and update by release tag instead of following
main. /api/healthreports the running version ({"status":"ok","version":"0.2.0"}).- A Release workflow publishes a tag with its CHANGELOG section as the
release notes.
- Install and update by release tag instead of following
-
Full agent inventory, for workstations and servers
(docs/adr/0069-full-agent-inventory.md, agent v0.2.0). The agent
collects about as much as GLPI-Agent or Lansweeper:- Hardware down to memory modules, disk serials, monitors and batteries.
- Network adapters.
- Software with publisher and install date.
- Updates.
- Security: antivirus and EDR, firewall, encryption, Secure Boot, TPM,
local administrators. - For servers: services, listening ports, roles, and hosted VMs and
containers.
An asset's page shows it in tabs, with a JSON download. Servers are filed
as servers on their own, and a type set by hand sticks. Serial number,
model, manufacturer and OS fill the asset's fields, and asset search now
matches serial numbers and models. Older agents keep working. -
New endpoint agent for Windows, macOS and Linux
(docs/adr/0068-go-endpoint-agent.md). The agent is now a single binary
in its own repository,
Haphior/seredina-agent, and
runs as a service.- The Devices page gives a ready-made install command per operating system.
It downloads the agent, checks its SHA-256, enrolls the device and starts
the service. AGENT_DOWNLOAD_URLpoints those commands at an internal mirror.- Enrolled devices keep their records.
- The Devices page gives a ready-made install command per operating system.
-
Account self-service (
docs/adr/0067-account-self-service.md):- people change their own password from Account security;
- "Forgot your password?" on the sign-in page emails a reset link;
- admins can invite people by email so they choose their own password,
with an "Invitation pending" badge and a resend action.
-
Contacts and personal data (
docs/adr/0066-contact-data-rights.md): a
Contacts page lists everyone who writes in. On a contact, admins can
correct their details, download a copy of their data (JSON), or
anonymize them: the name, email and everything written on their
tickets are erased, while the tickets stay as empty records so reports
don't change. Optional automatic retention anonymizes contacts with no
open ticket and no activity for a chosen number of days. For requests under
data protection laws such as Chile's Ley 21.719 or GDPR. New
contacts:managepermission, which existing admin roles get automatically. -
Connect Microsoft 365 and Gmail mailboxes with OAuth
(docs/adr/0057-email-oauth.md): the Email Channels page now offers
"Microsoft 365 / Outlook" and "Gmail / Google Workspace" next to plain
IMAP/SMTP. You register your own app in Microsoft Entra or Google Cloud,
paste its client ID and secret, and sign in as the mailbox; server
settings are filled in for you. Tokens are refreshed automatically. If the
provider revokes access, the channel shows "Reconnect needed" and stops
being polled until you reconnect. Login errors for any mailbox, including
password ones, now show on the Email Channels page. -
Email attachments are kept (
docs/adr/0058-inbound-email-attachments.md):
files attached to an incoming email (including pasted screenshots) are
saved on the ticket, with the same 8 MB / 5-per-message limits as manual
uploads. Anything that doesn't fit is named in a note on the message
instead of disappearing. -
Replies go out from the mailbox the customer wrote to, when a tenant
has more than one email channel, instead of always from the first one. -
workercan run as several replicas: each mailbox is polled under a
per-mailbox lock and a repeated Message-ID is ignored, so emails no longer
turn into duplicate tickets (docs/adr/0059-email-poll-lock.md). -
Audit log (
docs/adr/0060-audit-log.md): Administration → Audit Log
shows sign-ins (including failed ones and lockouts, with IP and browser),
changes to users and roles, and changes to API keys, webhooks, email
channels, Telegram, agents, AI settings and the knowledge base portal, plus
full data exports. Entries can't be edited or deleted, even by the app
itself. Needs the newaudit:readpermission, which existing admin roles
get automatically. -
Two-factor sign-in (
docs/adr/0061-mfa-totp.md): users can protect
their account with a code from an authenticator app (Account security, the
shield icon in the sidebar), with one-time recovery codes. Admins can
require it for the whole workspace (users set it up at their next sign-in)
and reset it for someone who lost their phone. -
Single sign-on (
docs/adr/0062-sso-oidc.md): sign in with Microsoft
365 (Entra ID), Google Workspace, or any OpenID Connect provider
(Administration → Single Sign-On). Optional allowed domains, automatic
account creation with a chosen role, and "require SSO" (admins keep
password sign-in as a way back in). -
AI triage of new tickets (
docs/adr/0063-ai-triage.md): the AI can
suggest, or automatically set, a new ticket's priority and team from its
subject and first message (AI Settings → AI triage). Automatic mode only
fills fields nobody set, and leaves an internal note saying why. -
Contracts, warranties and licenses (
docs/adr/0064-contracts.md):
CMDB → Contracts tracks support contracts, warranties, licenses, leases and
subscriptions with dates, cost and the assets they cover, shows what's
ending soon, and reminds asset managers before one ends. Asset pages list
the contracts covering them. -
Customer portal (
docs/adr/0065-customer-portal.md): the people you
support can sign in at/portal/<your-organization>with a one-time link
sent to their email (no password) to follow their own requests, reply,
attach files, open new requests and request service catalog items. Off by
default: Administration → Customer Portal. -
SLA countdown (
docs/adr/0056-sla-countdown.md): the ticket queue has
an SLA column with the time left on the next milestone, and the ticket
page shows each milestone's countdown with a progress bar. Both tick every
second, turn amber once 75% of the window is used, and red once breached. -
"Ana is typing…": agents with the same ticket open see who is writing a
reply. Nothing of the draft is sent. -
Reply-collision warning: if a colleague replies or adds a note, or the
customer writes back, while you're drafting, a notice asks you to check
before sending. -
Your own address, with HTTPS (
docs/adr/0054-server-address-and-tls.md):
scripts/configure-address.shasks for the server's domain or IP and how
to get a certificate: Let's Encrypt (automatic), your own certificate or
company CA, a generated internal CA (for an IP or internal network), or
none. It then starts an optional HTTPS proxy (Caddy) in front of
everything. The console and API now share one address, with the API under
/api, so the web build no longer needs the API URL baked in. -
Agents choose the server and trust your certificate: the Devices page
has a "Server address for agents" field. When the certificate isn't
publicly trusted, the enrollment command carries the server's CA, and the
agent trusts only that CA — certificate verification is never turned off.
--ca <file>works too. -
Live console updates (
docs/adr/0053-live-updates.md): the ticket
queue, ticket detail and notification bell now update as things happen —
a new ticket slides into the queue, a customer's reply or a colleague's
note appears in the open ticket, the bell counts up — without reloading.
The queue shows a Live / Reconnecting indicator. Built on a
Server-Sent Events stream (GET /events) fed by Redis pub/sub, so it
works across API replicas and for changes the worker makes (inbound
email, SLA breaches, escalations). Events carry ids only; the console
refetches through the normal API, so the stream can't expose anything
the viewer couldn't already read. -
Knowledge base portal access control: the public self-service KB portal
can now be disabled entirely (internal-only KB) or gated behind a single
shared access code, from a new "Portal settings" panel on the console's
Knowledge Base page. Previously any published article was reachable by
anyone with the link, with no way to turn that off. See
docs/adr/0051-kb-portal-access-control.md. -
Create a ticket directly from a process step, assigned to a user in
the same action, plus drag-to-reorder and a duplicate-step button when
configuring process templates. See
docs/adr/0052-process-ticket-creation-and-reorder.md. -
JWT_EXPIRES_INenv var for the console session length (default8h). -
Agent-based discovery (
docs/adr/0055-agent-based-discovery.md):- Reinstalling the agent on the same machine reuses its existing record
(matched by a hashed OS machine id) instead of creating a duplicate; the
old install's credential stops working. - Passive network discovery: each check-in reports the agent's ARP
table, and the devices in it become assets (sourceAGENT_NEIGHBOR),
identified by MAC — a DHCP lease change now moves the IP on the same
record instead of creating a new one. Enrolling a machine that was already
discovered this way adopts that record.
- Reinstalling the agent on the same machine reuses its existing record
-
CI now builds every Docker image and boots the full compose stack
(scripts/compose-smoke.sh, runnable locally too): migrations, console,
the API through the console...
v0.1.0-alpha.1
First public alpha. All of Phases 0-5 from docs/ROADMAP.md are in, plus a
first pass of console internationalization. This is a feature-complete-for-v1
snapshot, not a "just started" alpha — but it hasn't yet been run in
production by anyone outside this project, hence alpha.
Added
- Core ticketing: multi-tenant ticket queue with email/API/webhook/widget
ingestion, threaded replies, internal notes, merges, macros, saved views,
bulk actions, and custom fields. - ITSM/ITAM breadth (GLPI-scope): SLA policies with business hours,
service catalog, change/problem/release management with process templates,
agentless network discovery (TCP+SNMP) into a CMDB, and a real endpoint
agent (apps/agent) for hardware/software inventory on Windows/Linux/macOS
(inventory-only by design — seedocs/adr/0002-agentless-discovery.md). - AI copilot: pluggable provider adapters (Anthropic, OpenAI, local
Ollama — bring your own key), suggest-reply/summarize on tickets, a full
autonomous tool-use loop gated by a per-tenant Autonomy Policy, RAG over the
knowledge base, and an MCP server (stdio + Streamable HTTP) so external
agents can operate under the same guardrails. - Multi-tenant cloud hardening: Postgres Row-Level Security as the primary
tenant-isolation layer plus an independent Prisma-level layer, account
lockout, and a mandatory cross-tenant-leak test suite. - Integrations: inbound/outbound email, Slack and Microsoft Teams
(bring-your-own webhook), Telegram, Zabbix alert ingestion, and CSAT survey
delivery. - Console internationalization v1: English and Spanish, per-user
language preference. - Guided product tour and a customizable dashboard (per-widget
show/hide/resize/reorder via drag-and-drop, plus an "Add widget" catalog). - Documentation site (
apps/docs, VitePress): user guide, deployment/
hosting reference, and API/webhooks/MCP-server reference, in English and
Spanish, published to GitHub Pages.
Fixed
- All 4 open Dependabot alerts (a stale nested Vite copy pulled in by
VitePress, deduped via a rootoverridesentry) and the 2 real CodeQL
findings (missing workflowpermissions:); 2 further CodeQL findings
reviewed and dismissed as false positives with documented reasoning. - Route-level code-splitting and a Postgres index (
Ticket's
[tenantId, createdAt]) after a real Lighthouse-against-production-build
performance pass.