Windshift 0.8.9
Windshift 0.8.9 adds GitLab as a supported SCM provider, ships a Zammad ticket integration, introduces BDD (Gherkin)
test cases to the test management suite, turns workspace pages into a real knowledge base for the customer portal, and
makes the entire web interface available in Korean. The public API v2 keeps expanding to cover workspace configuration,
custom fields become editable in list views, workspace admins gain credential and theme tooling, the mobile app gets a
native-style rework of its create and edit flows, and new GDPR tooling handles Article 17 erasure requests with
auditable evidence. A release-long consistency pass rebuilds forms on shared design-system primitives, makes the
interface respect the permission model in every corner, keeps large installations fast, and fixes dozens of smaller
rough edges across actions, imports, custom fields, and the portal.
GitLab SCM support
Windshift now connects to GitLab as a source-control provider alongside GitHub
(@oshuej198). Configure a GitLab instance with a personal access token
— including self-hosted installations via an optional base URL — and browse available repositories, link them to
projects, and create pull requests from branches. Large instances get server-side repository search, so the picker can
find projects on a busy GitLab without paging through the unfiltered list, and the picker debounces input so keystrokes
do not hammer the SCM API.
Zammad ticket integration
Zammad tickets can now be linked to Windshift items (@Optic00). The
integration synchronizes ticket state and owners, keeps link invariants intact, and adds return links so a ticket points
back to the item it belongs to. Tickets are reconciled every minute in batches, administrative settings cover the
default group selection, and owner discovery is hardened against edge cases such as missing or ambiguous agents.
The portal knowledge base
Workspace pages become the customer portal's native knowledge base. Articles move out of the hero-search modal onto real
routes, with a browsable listing in stable tree order and search results that land on durable URLs. Agents answering a
portal request can insert knowledge-page links from a permission-filtered picker; a link becomes an in-portal article
link when the page is published through that portal and degrades to plain text otherwise, so customers never see a dead
link or a hint at hidden pages. The portal records view, search, miss, and deflection signals for the knowledge base,
articles render through the same read-only editor as internal pages, the channel's start page is picked with a
searchable page picker, and publications get a full-bleed banner.
BDD test cases
Test management learns behavior-driven development. Test cases can now be authored as Gherkin scenarios — Feature,
Background, Scenario, and Scenario Outline with Examples — and the case detail view renders those scenarios alongside
the regular steps. When a test run executes a scenario outline, each examples row runs as its own case, so data-driven
behavior is tested and reported per example. BDD test cases are exposed through API v2 as well.
The underlying Gherkin parser accepts the supported English-keyword subset with data tables, doc strings, tags, and
comments, and rejects unsupported constructs with precise line and column errors instead of silently dropping them.
GDPR erasure and user offboarding
Administrators get a dedicated, irreversible erasure flow for GDPR Article 17 requests: erasing a user first offboards
them, marks the account as erased, and persists a DSAR completion record with intake evidence, approving admin, and
policy version. Erasure is distinct from administrative offboarding, which is itself now strictly irreversible and
complete, and no activation path can revive an erased account. Audit logs intentionally keep their pseudonymized
identifiers, and work history is retained under a deleted-user-N pseudonym until the containing record is deleted.
API v2 keeps expanding
The public API v2 now exposes the configuration surface: configuration sets, workspace roles, screens and screen-field
configuration, custom-field provisioning, and hierarchy levels, with localized screen responses. The admin frontend
delegates its custom-field and screen mutations to the same shared services the API uses.
Separately, the AI chat and daily briefing endpoints are now reachable with REST v1 bearer tokens through the ai:chat
and ai:read scopes, and the generated OpenAPI contracts were regenerated to match.
Item updates treat custom_field_values as a per-field patch: keys in the payload set their field, a null value clears
it, and keys left out are preserved server-side — a partial payload no longer wipes the fields it does not name, and
history records exactly the fields a patch touched.
Mobile, reworked
The mobile PWA gets a native-style editing pass. Status and assignee edits use bottom sheets with drag-to-dismiss,
creating an item is a dedicated page instead of a modal, and the item detail is editable for the first time, with an
unsaved-changes guard. Pages, search, and the command palette are available in the mobile shell, every mobile input is
floored at 16px so iOS no longer zooms on focus, and desktop deep links redirect to the mobile surface on phone
viewports. A later fix breaks an infinite template-effect loop in the create page.
Korean localization
The web interface is now fully available in Korean (@tttaliesin). A new
ko locale translates every surface — navigation, dashboard, channels, admin, analytics, workflows, workspaces, teams,
and more — and 한국어 appears as a first-class option in the language picker.
Story points rollup
The dashboard gains a story-points-by-assignee widget backed by a new aggregate endpoint (GH #255), and item summaries
roll story points up recursively from children, with a hint on the item detail sidebar showing how the total is composed
(GH #256).
Custom fields in list views
List views now render custom fields through the same renderer as the item detail, and scalar fields — text, numbers,
dates, selects — are editable right in the cell. Pickers resolve labels for selected values that are not in the lazily
loaded option list, so triggers and chips never show raw IDs, and row-level editing no longer leaks option caches across
mixed-workspace collections.
Automation and configuration
Automations on parent transitions can now condition on the count of open children, whether an item sits inside a
parent's subtree, and on milestone fields, and type-filtered item.updated triggers fire on any field change instead of
only when filtered fields change. Effective configuration — workflows, status lists, and similar workspace settings —
resolves through a canonical path with a shared workspace cache and falls back to the default config set, which also
fixes status lists and workflows disappearing in workspaces without an explicit config-set assignment.
Workspace administration
Workspace admins get a credentials module in workspace settings: action credentials can be created, rotated, and deleted
per workspace, while inherited all-workspace or shared rows render read-only. Workspace admins can also assign
configuration sets to their own workspace, and themes gain an optional company logo upload so the application can carry
your branding.
Permissions improvements
The interface now respects the permission model everywhere it renders an affordance. Without item.edit, the item title
renders read-only, board cards do not drag, and the detail page hides its write controls; quick-add and the create modal
require item.create; moderating other people's comments requires comment.edit_others; test-management affordances
follow test.manage and test.execute; page management appears only with effective page permissions; and
board-configuration palette commands and role assignment require workspace.admin. The server draws the same lines.
Performance and scale
A release-long pass bounds the queries that used to grow with data: Todoist sync loads a bounded number of links per
run, recurrence deduplication looks only at the generation window, notification email batching reads bounded chunks,
pull-request link refresh scans page by keyset, and the auth policy affected-users listing paginates. The metrics
collector caches its domain summary between scrapes, event deliveries reconcile from per-consumer cursors, the global
rank migration derives its progress incrementally, and workspace deletion cleans up more thoroughly.
Around the app
- The TRMNL summary plugin gains a next-up milestone, a full-height layout, and a closed-today count on the completed
board. - The personal task history filter for completed tasks gains a None option.
Consistent design system
Forms across the app are rebuilt on shared primitives: TextField replaces ad-hoc Label+Input pairs, dialogs use
TabStrip and ModalBackdrop, loading and error states render through StateDisplay, and list views adopt Badge and
Modal with stable test ids. Hardcoded Tailwind colors are replaced with tokens, dark-mode neutral hover colors are
corrected, decorative transitions and animations are removed, and hover styles move from JavaScript mutations to CSS.
The portal routes its approval confirmations through the shared confirm composable — with the global dialog properly
mounted — and the workspace admin navigation appears immediately after creating a workspace (GH #258).
Reliability and fixes
- Creating an action honors the
is_enabledfield on the create request, so automations can be created in a disabled
state instead of always starting active (@valentimarco). - Actions execute with correctly resolved structured context inputs, hydrate their execution inputs without retaining
stale item state, and no longer perform redundant field reads or log failures from stale joined names
(@Optic00). - The Jira import decodes board filter IDs flexibly and reads Jira Assets responses that use numeric IDs and
epoch-millisecond timestamps. - Custom fields keep their display order when edited, mirror-linked fields can be edited and preserve their linkage, and
the delete guard matches custom-field-value keys exactly. - The workflow transition list fetches through API v2 (@Sinago87).
- Portal knowledge-base search is scoped to the requesting portal's wiring, and the workspace picker is limited to
administered connected workspaces. - SSO logins no longer trigger Windshift's own email verification: every successful OIDC or SAML login marks the account
email-verified, so SSO users never see the verification banner again regardless of claim shape (GH #272). The provider
setting now only decides whether identities can be auto-linked to existing accounts without a verified email claim,
and its label describes exactly that. - Frontend pagination deduplicates rows that drift across V2 pages, fetch-teardown TypeErrors are treated as expected
background-sync noise, and the rich-text toolbar delays its collapse on blur so the first click below the composer
lands.
Clearer security reporting
The published security policy is rewritten into a full responsible-disclosure guide
(@Lopseg): what to include in a report, which channels to use — and
which to avoid — and how reports are triaged, remediated, and acknowledged.
Thank you
Thank you to Ben (@Optic00), Nikita (@oshuej198),
@Sinago87, @tttaliesin,
@valentimarco, and @Lopseg for contributing to this
release, and to everyone who took the time to report issues.