Skip to content

Releases: Haphior/seredina

Seredina v0.4.0

Choose a tag to compare

@github-actions github-actions released this 22 Oct 19:24
52fa910

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.sh once afterwards (Linux hosts). Without
    it, Settings → Updates still checks for new versions.

  • Worker. The worker now gets WEB_ORIGIN too; 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 send email_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.
  • Dependency updates:

    • vite 6.4.4: command handling of the editor launcher on Windows, a
      server.fs.allow bypass, cross-origin script execution through custom
      middleware.
    • fast-jwt 6.3.5: its verifier cache accepted expired tokens without
      iat. Seredina's own tokens always carry exp.
    • hono 4.13.11 (used by the MCP SDK): serveStatic decoded paths twice.
    • postcss-selector-parser 6.1.5: CPU exhaustion on long flat selectors
      (GHSA-rj75-hqrm-r3gf), backported to the 6.x line Tailwind 3 uses.
    • vitest 5.0.3 (tests only): two @vitest/mocker advisories.
    • @modelcontextprotocol/sdk 1.32.1: the MCP server's HTTP transport now
      rejects oversized request bodies (413) and bounds JSON-RPC batches.
    • sharp 0.35.5: bounds checks in image processing.
    • source-map-js 1.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/seredina by default, or your own fork
      or any git repository (internal mirror), with a token for private ones.
  • 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: openai 7, @fastify/cors 11, @sentry/node 11,
    net-snmp 3.29.2, @huggingface/transformers 4.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.
  • 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.
  • 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.

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 --build

Back up the database first. Migrations run on start and only go forward.

Seredina v0.3.1

Choose a tag to compare

@github-actions github-actions released this 28 Sep 10:23
17c6316

Added

  • Windows Server with Docker Desktop is supported and documented
    (docs/adr/0075-windows-docker-desktop.md): a deployment page (en/es)
    and infra/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: .gitattributes keeps 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 --build

Back up the database first. Migrations run on start and only go forward.

Seredina v0.3.0

Choose a tag to compare

@github-actions github-actions released this 28 Sep 02:55
018b1ea

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.sh runs 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.
  • 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.

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".
  • 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 /register explains 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 for api) for the portal link
    in emails; infra/docker-compose.yml passes 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 --build

Back up the database first. Migrations run on start and only go forward.

Seredina v0.2.0

Choose a tag to compare

@github-actions github-actions released this 27 Sep 15:39
8a6e1d4

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/health reports the running version ({"status":"ok","version":"0.2.0"}).
    • A Release workflow publishes a tag with its CHANGELOG section as the
      release notes.
  • 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_URL points those commands at an internal mirror.
    • Enrolled devices keep their records.
  • 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:manage permission, 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.

  • worker can 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 new audit:read permission, 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.sh asks 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_IN env var for the console session length (default 8h).

  • 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 (source AGENT_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.
  • 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...

Read more

v0.1.0-alpha.1

v0.1.0-alpha.1 Pre-release
Pre-release

Choose a tag to compare

@Haphior Haphior released this 22 Sep 15:45

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 — see docs/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 root overrides entry) and the 2 real CodeQL
    findings (missing workflow permissions:); 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.