Skip to content
Vusul

Features

160 features. Every one written out.

This list was not prepared for marketing. It comes from the same file that feeds the product’s in-app help screen — take a feature out of the product and it leaves this page too.

Start here

The entries that change a buyer’s decision. Everything else is in the full catalogue below, each with its own anchor.

Every feature ships with a written verification scenario.

Under each catalogue entry sits a written, step-by-step scenario you can run on screen. The in-app system guide shows them to the workspace owner; this is the list we walk by hand before a release. We have no automated test suite for the interface — which is exactly why this list exists.

Full catalogue

16 categories, 160 entries. Each purpose is the product’s own help text; it is not restated here.

Tasks & Views

See tasks as list, board, calendar, timeline; filter, group, save.

18
View Engine (4 View Types)
Shows the same task set as list, board, calendar, and timeline so you can pick the layout that fits the job.
List View
Shows tasks as table-like rows for fast scanning and inline field edits.
Cross-group Drag & Drop in the List
The board's logic brought to the list: drop a row inside another group and that group's field is written onto the task (status, priority, assignee, cycle, milestone, or a select/user/checkbox custom field). Dropping inside its own group reorders it instead. On label, due-date and project groupings a drop writes nothing — those axes are multi-valued or derived, so only reordering stays live.
Board (Kanban) View
Manages tasks visually in status columns; drag a card to change its status.
Calendar View
Shows tasks on a calendar by due date so you can spot busy days and deadlines at a glance.
Timeline View
Shows tasks as horizontal bars across their date range so you can visualize durations and overlaps.
Timeline Rescheduling & Dependency Arrows
A timeline bar is now something you grab, not just read: drag its body and the task's start and end move together, drag an edge and only that date changes. While dragging, a preview shows the range it will land on and how many days it shifted, with the original position left behind as a dashed ghost. "Blocks" relations are drawn as arrows between bars, and an arrow turns to a warning colour when a task starts before its blocker finishes — so you spot the clash without reading dates.
Preset Views
Provides ready-made views like Today, Upcoming, Priority, Active, Backlog, All tasks, and Completed so you land on the right list without setup.
Filters
Filters tasks by fields like status, priority, project, label, assignee, and date so you only see what matters.
Grouping
Groups tasks under headers by status, priority, assignee, label, date, project, cycle, or milestone so you can see the distribution at a glance.
Swimlanes
Splits the board into horizontal lanes by a second field so you see both status columns and, say, assignee-based rows at once.
Sorting
Sorts tasks by one or more fields so the most important work rises to the top.
Display Options
Toggles which fields (number, priority, assignee, label, project, date, estimate) appear on cards and rows, and whether completed tasks are shown.
Saved Views
Saves a filter, group, and sort configuration under a name; share, rename, or delete it from the sidebar.
Bulk Actions
Selects multiple tasks and changes their status, assignment, or labels — or deletes them — all at once to speed up repetitive work.
Full Backup (ZIP)
The "Data" menu in the view toolbar downloads the whole workspace as a single ZIP. CSV gives you task rows only; the ZIP unpacks into separate JSON files: tasks, statuses, labels, projects, cycles, milestones, custom fields — plus, new in this round, comments, attachments, saved views and task templates. Attachments come along as files, not just as a list: each one is written into the archive's attachments/ folder under its own id (attachments/{id}{ext}) and its row in attachments.json names that in-zip location in a path field — so you can open the files straight out of the backup without going back to the server. There are two ceilings: 25 MB per file (the same as the upload limit) and 200 MB for the whole archive. A file past a ceiling, or one the storage cannot produce, keeps its metadata row and loses only its bytes, with no path field; manifest.json does not hide that — it counts how many attachment files were written (attachmentFiles), how many bytes they took (attachmentBytes) and how many were skipped (skippedAttachments). The backup is always limited to the tasks you can see, and comments and attachments — bytes included — are filtered from that same set, so a guest cannot read the comments of a project they have no access to, nor extract its files.
Import Tasks by Pasting CSV
The same "Data" menu is not one-way: right below the export entries sits a CSV import. Copy a table and paste it into the box (first row is the header; title is required, description, priority, status and dueDate optional) and the rows become tasks in your workspace. When it finishes you get a summary of how many tasks were created, how many rows were skipped and whether any row failed. Rows with an empty title are skipped, and a CSV carrying Jira issue keys will not create the same tasks twice if you paste it again. A status name that matches none of your workspace statuses does not cost you the task — it is created with the default status. For large migrations that need file upload and column mapping, use the Import wizard in workspace settings.

Task Detail

Everything inside a task: properties, description, comments, attachments, subtasks and more.

23
Creating a Task (Template, Duplicate Warning, Draft Recovery)
Open the same create dialog from anywhere: start from a saved template, get warned about similar tasks before you file a duplicate, and recover the description you typed if the dialog closes by accident.
Open Task (Peek + Full Page)
Open a task quickly in a side panel without losing your list, or open it full-page to focus.
Property Panel
Set status, priority, assignee, labels, estimate, project, cycle, milestone and dates from one panel.
Custom Fields
Fill workspace-defined custom fields (text, number, date, select and more) on the task.
Rich-text Description
Build the task description with the "/" command menu — headings, lists, code blocks, tables, dividers, images and callouts — then color, highlight and link the text you select.
Subtasks
Break a task into subtasks at unlimited depth and roll progress up to the parent.
Relations
Link tasks with blocks, blocked-by, related and duplicate relationships.
Task ↔ Pull Request Links
Tie a task to the code that delivers it: related pull requests are collected on the task, and you see whether each one is open, merged or closed without leaving it.
Attachments
Upload, preview and download files on the task; see thumbnails for image attachments.
Comments + @mention
Discuss right on the task; tag people with @ to send them a notification.
Emoji Reactions
React to comments with emoji for quick acknowledgment without typing a reply. As of this round reactions travel in realtime: a teammate holding the same task open sees the counter change without refreshing the page. The refresh is deliberately narrow — only the comment thread is refetched, not the task itself, because a reaction changes nothing about a task's status, assignee or place in a list. Your own reaction is recognised when it comes back this way and is not applied twice, which is why the badge does not flicker when you toggle it quickly. Reactions are delivered on the same route as the comments they hang off, so reactions on a project you cannot reach never arrive at all.
Time Tracking
Log time spent on the task via a timer or manual entry; it feeds the timesheet and invoicing.
Activity Feed
Follow the permanent history of who changed what and when on the task.
Subscribers
Follow a task; creator, assignee and mentioned people are auto-subscribed and get notifications.
Recurrence
For recurring work, have the next instance created automatically once the task is completed.
Snooze
Temporarily hide a task you cannot act on yet, keeping it out of your views until a date you choose.
Save as Template
Turn a frequently repeated task structure into a reusable template.
Merge Tasks
Merge duplicate tasks into one, keeping comments and links while removing duplication.
Delete, Undo and the 30-day Trash
Deleting is never final: the task leaves the list immediately but moves to trash; the "Undo" button in the toast (or Cmd/Ctrl+Z) brings it right back, and the server keeps the record for 30 days.
Favorite Star
Pin a task you return to often so you can reach it fast from the sidebar Favorites section.
Approval
Gate the task's move to Done behind an approval chain; approvers can quickly approve or reject.
SLA Badge + Process Chain
See the task's SLA countdown and status; if it is a date-offset process step, view its sibling steps and anchor.
Proofing / Portal Message / CSAT + Customer Requests
Collect pinned feedback on a design variant, manage the customer portal message thread, generate a CSAT survey link and see the "N customers want this" request link.

Planning

Plan the big picture with initiatives, roadmap, Gantt, goals and capacity.

5
Initiatives
Connects projects to strategic outcomes. Arrange initiatives as a nested tree and see done/total progress rolled up at every node.
Roadmap
Shows initiatives, projects and milestones side by side on a single timeline so you can see what lands when at a glance.
Gantt
Plan tasks with draggable bars: dependency arrows show sequence, sprint bands mark cycle boundaries, and you can zoom in for detail.
Goals / OKR
Define quarterly objectives and key results. Progress is computed live from your visible projects, tracked with a confidence score and check-in history.
Capacity
See planned, capacity and actual load per person per week as a heat map. Manage time-off and use season presets to quickly tune busy periods.

Team & Sprint

Teams, triage, cycles, sprint planning/report, retro and wiki.

10
Triage queue
A single inbox where incoming requests collect. Accept each row (status + project + assignee) into the flow, or reject it with a reason.
Intake origin badge
Every row in the Triage queue carries a badge for the channel the request arrived through: Form, Email, Slack, WhatsApp or Telegram. This is no longer a sentence buried in the task body but a structured field on the task itself — hover the badge and the sender reference (Slack channel, form submitter, messenger sender) appears as a tooltip. Tasks created inside the app show no badge at all.
Teams
A Linear-style organizational layer above projects. A team owns projects, carries its own roster, and sits in the left menu's "Your teams" section as a collapsible block: Home, Issues with a live open-task count, Cycles and Projects with a sub-list. Each team has a color and, optionally, a 2–6 character key (e.g. ENG) shown as a badge next to its name. Teams are NOT a visibility fence — who can see a project is still decided by project membership; the team layer exists for grouping, team-specific workflows and sprint rhythm. When a project is attached to a team, the team roster is copied into the project once, at that moment — it is not kept in sync afterwards; membership is managed on the project — so creating work inside a team just works; the General project can never join a team. Everyone sees teams; managing them (create, members, archive, reorder) is admin-only and company workspaces only.
Team-specific workflow
A team is not obliged to use the workspace's shared status set. Flip the "Custom workflow" switch in the team's settings and the workspace statuses are forked into a copy the team owns; from then on adding statuses, colors, defaults and deletions happen in the team's own set, leaving the workspace set untouched. Tasks in the team's projects flow through this set, and the columns on the team's Issues board are the team's own statuses. Turning the switch off is the way back: it asks for confirmation, deletes the team's own rows and moves its tasks back onto the workspace statuses. On mixed surfaces not pinned to one team (all tasks, for instance), while any team runs its own set, grouping by status automatically falls back to the five shared categories (Backlog, Not started, Started, Completed, Canceled) — that is what keeps one pipeline stage from scattering across N columns. The saved view keeps saying "status": on a team-locked page it still renders status columns, and the moment every team inherits again the mixed surface snaps back too.
Cycles / Sprints
Time-boxed sprints. A cycle activates automatically on its start date, unfinished work rolls over at the end, and each sprint has a goal.
Sprint cadence (automatic cycle generation)
Ends the chore of opening sprints one by one. Set the "Cycle cadence" card in workspace settings once and the system generates sprints itself from the cycle length, the weekday cycles start on, the cooldown between them and how many upcoming sprints to keep ready. Generated sprints are always appended after the last open cycle ends, so they can never overlap the ones you created by hand. With "Auto-add started tasks" on, a task that has no cycle joins the active sprint the moment it moves to In Progress.
Team sprints & team cadence
The sprint layer reaches down to teams: every cycle is either workspace-level or owned by one team, and the two scopes run independently. Sprint numbers count per scope (the team's sprint 1 can open while the workspace runs its sprint 12), and the single-active-sprint rule also applies per scope — a team sprint and the workspace sprint can run at the same time. Turn on "Team runs its own rhythm" in the "Sprint cadence" card of the team's settings and the team generates its own cycles from the length, start day, cooldown and upcoming-count fields; while off, the workspace cadence applies. The team's Cycles page lists that team's sprints grouped active/upcoming/completed, and a sprint created by hand with "Create cycle" is born team-owned. The team-layer rule for "Auto-add started tasks" is innermost-first: when a cycle-less task moves to In Progress and its project's team has a running sprint, the decision belongs entirely to that team — with team cadence and auto-add on, the task joins the team sprint; with them off it joins nothing; the workspace sprint is only ever the fallback when no team sprint is running.
Sprint Planning
Pulls tasks in bulk from the backlog pool into a target sprint. Filter, multi-select and assign in one call; a velocity commitment meter and capacity tracking show how much you've loaded.
Sprint Report
On close, delivers a Jira-class analysis: success/partial/fail verdict, 6 KPIs, burndown/burnup, Say/Do velocity, and completed/spilled/added/removed lists. Exportable as CSV/PDF.
Retrospective Board
A live, phased ceremony: Collect → Vote → Discuss → Action → Done. Authors are masked while collecting, voting uses dots, a server timer keeps time, and actions turn directly into tasks.

Wiki & Knowledge Base

The team knowledge base where analyses, decisions and runbooks live.

15
Wiki overview
A workspace-wide hierarchical knowledge base where analyses, decisions and runbooks live. Members (including guests) can read it; non-guest members can edit it.
Page tree & moving pages
Pages form a nested tree; reorder them by drag-and-drop or with move up/down from the row's "…" menu. The same menu's "choose parent" reparents a page under another branch, and moving a page into its own subtree is rejected.
Page icon & breadcrumb
Each page can carry an emoji icon that appears beside its title and in the tree, making pages easy to spot in long lists. The breadcrumb above the title walks you back up the hierarchy in one click.
Rich editor & blocks
A block editor: type "/" to insert a heading, table, list, to-do, code block or divider. Select text and a floating toolbar gives you bold, italic, strikethrough, inline code, links, text color and highlight.
Callouts
Colored highlight boxes in info, warning, tip and note flavors. They lift rules and risks out of the flow so readers cannot miss them, and they are written into the page markdown so they render as boxes on every load.
Images & file attachments
Paste or drag an image onto a page and it uploads and lands inline in the text. Everything else is listed in the "Files" panel at the bottom of the page, where you can download or delete it.
Cover image
Puts a full-width cover image at the top of a page, giving long documents an identity and making similarly named pages easier to tell apart. Remove it again in one click.
Table of contents
The table of contents in the right rail is built automatically from the page headings, showing the shape of a long document at a glance. Click an entry and the page scrolls to that heading.
Version history
Every content edit snapshots the page automatically, and rapid successive edits are merged into a single version so the history stays readable. You can view an older version and restore it — and because the restore is itself a version, it can be undone too.
Page templates
Starts a new page from a ready-made skeleton instead of a blank screen: RFC/Decision, Runbook, Meeting Notes and Analysis ship in the box. Your team can add its own layout to the list with "Save as template" on any page.
Publishing, favorites & help
Share a page through a public, read-only link that needs no login, and unpublish it whenever you want. Star the pages you use most to keep them in Favorites, and open the (?) panel at the top right for a reminder of the wiki's shortcuts.

Customer & Revenue

CRM, service desk, timesheets, invoices, profitability and client portal.

9
Customers / CRM
Keep your customers in one place and link incoming requests to tasks. This turns "5 customers want this" into concrete work and shows at a glance how many customers a task affects.
Automatic Customer Request from Intake
The "how many customers want this" counter stops being fed by hand: tick "Also create a customer request" on an intake channel and every incoming request opens a customer request linked to its Triage task. The customer is matched from the sender's email domain, and a domain with no record creates a new customer. Free providers such as Gmail/Hotmail and messenger channels (WhatsApp/Telegram/Slack) cannot be matched by domain — they fall to the "fallback customer" you pick. Without a fallback no request is opened for them, though the task still lands in Triage.
Service Desk
See who is on call now, coverage gaps for the next 7 days and the customer satisfaction (CSAT) pulse on one screen. When an SLA is breached, the item is escalated to the on-call person automatically.
Timesheet
View time entries completed within a date range, grouped by member, project and task. Export the result as CSV for invoicing or payroll.
Invoices
Generate invoice drafts per period and customer from billable time. Review the line items, lock to finalize and export as CSV.
Profitability
See each project's budget, actual cost and locked invoice amount side by side. Results roll up per customer, making it clear which work is profitable and which is not.
Client Portal (anonymous)
An external, token-based window for the customer. It shows only allowlisted projects, the status of their requests and a message thread; sensitive internal fields never leak out.
CSAT Survey (anonymous)
A single-use 1-5 star satisfaction survey generated from a task. The customer rates without signing in; the result feeds the service desk CSAT pulse.
Public Intake Form (anonymous)
A schema-based public form with conditional fields, protected against spam with a honeypot. It collects external requests and drops them into your workspace as tasks.

Analytics

Personal dashboard, custom dashboards and workspace insights.

5
My Dashboard
A personal summary screen for a single glance at your tasks: your completion ratio at the top (a percentage plus a "completed / total" count) alongside the number of open high-priority items, and below them two short lists titled Today and Upcoming. The screen is read-only: the numbers are computed from your task list, but you cannot tick off or edit a task from the blocks below — to act on the work, use the "View All" link beside a block to move to Today (/todo/today) or Upcoming (/todo/upcoming). The "Streak" value on the third card is not wired to real data yet; it is a fixed placeholder and should not be read as a measure of your habits.
Custom Dashboards + Builder
Build your own dashboards with widgets: number, bar, table and line. Keep a dashboard private to you or share it with the team.
Insights
Analytics for your workspace: throughput, velocity, lead and cycle time, and the status funnel. Read trends with SVG charts and a week picker.
SLA Health Card & "Most Requested"
Two more cards on the Insights screen. "SLA health" boils the targets resolved in the selected window down to a single percentage — on-time share in large type, with an on-time / late / breached split underneath. "Most requested" aggregates CRM requests per task and ranks the work the most customers are behind, which is where the "who is asking for this?" question gets answered in a roadmap discussion.
Nightly Precompute for Insights
On a workspace with a year of history, Insights no longer rescans every task on each load: a nightly job folds each day's flow facts (created/completed, velocity, lead+cycle sums, SLA resolutions) into one row per workspace and day, and the screen sums those rows. The numbers are identical; only the read gets cheap. The job writes a row even for days with no activity, because the read side trusts only a gap-free run of days — if the job misses a night, that range quietly falls back to the old live computation instead of reporting a wrong number.

Development

Test management, releases/changelog and DORA metrics.

4
Test Management
Keep a library of step-by-step test cases, execute them as runs and turn any failed step into a bug task in one click.
Test Run
Execute a test case end to end; mark each step as pass, fail or skip and record the outcome.
Releases + Changelog + Deployment
Group tasks under named release bundles (semver); auto-generate the changelog and record deployments.
DORA Metrics
Track the four DORA metrics and see the team's Elite/High/Medium/Low band.

AI

Smart triage, field-fill, natural-language filtering and autonomous agents.

4
AI Triage Suggestion
Get a smart routing suggestion for a task in triage; when you accept it, the suggestion is applied to the task.
AI Custom Field Fill
Propose custom field values from the task text; each proposal is validated on the server and applied one by one.
Natural-Language Filter
Describe the work you are after in plain words; the system turns the sentence into the view's own filter clauses and applies them to the list. Type "urgent tasks assigned to me due this week" and the date, assignee and priority conditions land as individual filter chips — no field-by-field filter building. The translation runs server-side against the workspace's own field catalog: unrecognised references, or ones belonging to another workspace, are dropped, leaving only clauses that can really be filtered on. The resulting chips are ordinary filter chips; you can edit them by hand, remove them or save them as a view.
AI Settings + Agents
Choose a provider (Anthropic / OpenAI-compatible), bring your own key, set a monthly token limit and track usage; the "Vusul AI" agent posts daily standup and sprint-end summaries.

Automation & Process

Rules, approvals, process templates, SLA and vertical packs.

6
Automation Rules
Wire triggers and conditions to actions; you can also draft a rule from natural language with "AI draft".
New Automation Triggers
The rule engine is no longer limited to a task's birth; it now hooks into later moments of its life. Five triggers were added this round: "Task completed" (open a follow-up or label it on close), "Comment created" (raise priority when a customer replies), "SLA breached" (assign to a manager when a target is missed), "PR merged" (advance the task when code lands) and "Received from an intake channel" (route an external request to the right project/person immediately). Together with the existing "Approval resolved" the list holds nine triggers; conditions and actions are unchanged.
Approval Policies
Define named sequential approval chains; lock a task's transition to "Done" until the chain is complete.
Process Templates (date-offset)
Build task chains relative to an anchor date (T-45…T-1); when the anchor changes, the whole chain reflows.
SLA Policies
Require tasks matching a condition to reach a metric within a given duration; flag and notify on breaches. Optionally run the clock only during business hours instead of 24/7.
Tourism Pack (vertical preset)
Apply a vertical configuration in one click: 3 custom fields, a T-45 tour-operations template, a rule and a re-confirmation board.

Integrations

GitHub/GitLab/Sentry/Slack/Teams, intake, webhooks, API and calendar.

17
Inbound Connectors (GitHub/GitLab/Sentry)
Links code and error events to tasks: when a PR/MR is opened the linked task moves columns, and a Sentry error is turned into a Triage task automatically. Development flow and the board stay in sync.
Channel Notifications (Slack/Teams — outbound)
Pushes workspace events to a Slack or Microsoft Teams channel as cards: task created, task deleted, new sprint, new milestone. Each card carries the task reference, title, priority, due date, assignee and an "Open in Vusul" button — Block Kit on Slack, an Adaptive Card on Teams — and the card language is chosen at install time, so a channel speaks one language regardless of who is reading. "Task updated" is deliberately absent: relaying every field change turns a channel unreadable within a day and people mute it, which kills the whole notification. On Teams the target is the URL minted by a Power Automate (Workflows) flow, not the retiring Office 365 connector. This path is one-way: what people write in the channel is not read back — see "Intake Channels" for that.
Morning Digest (Slack/Teams channel card)
Opens the team's day with one card: on the first check past 08:00 in the workspace's own timezone, a "🌅 Morning digest — <workspace>" card lands in the channel. It carries the active sprint's name, done/total tasks and days left; the overdue count; how many items wait in triage; up to five tasks completed yesterday (ref + title); and an "Open in Vusul" button — with an explicit "no active sprint" line and an explicit "nothing was completed yesterday" line when that is the truth. It is OFF BY DEFAULT on purpose: "digest.morning" is in no install's default event set, so a connection only gets it if someone ticks the box — nobody wakes up to a card they did not ask for. The window runs 08:00–14:00: a missed morning (the API was down, or the digest was switched on in the evening) is caught up until early afternoon, and past 14:00 the day is skipped rather than posting a "good morning" summary of a day that is already over. The timezone belongs to the workspace (Settings > Workspaces > (workspace) > General), not to the readers, and the card language is the one chosen at install time, not each reader's profile language. Once-a-day is guaranteed structurally: each digest is written once per workspace + local date, so another tick, another node or a restart cannot reopen the same day. When the workspace's AI is enabled a two-sentence 🤖 note is appended (one observation, one focus suggestion); if AI is off, over its monthly limit, or simply fails, only the note is dropped — the digest always goes out. The digest is for chat sinks only: the same event is never handed to public webhooks.
Intake Channels (Form/Email/Slack/Teams/WhatsApp/Telegram)
Collects external requests into a single Triage queue. Every message from a web form, email, Slack, Microsoft Teams, WhatsApp or Telegram becomes a Triage task; on messenger channels the sender id can be mapped to a member and is protected by a privacy mask. Slack offers two paths: channel messages (Events API) and the "/vusul <title>" slash command — the command keeps the channel clean, since the confirmation ("Added to Triage: ...") is visible only to whoever typed it. Teams has its own entry ("Opening Tasks from Teams") because its secret arrives in two steps and its confirmation is written back into the channel.
Opening Tasks from Teams (outgoing webhook — inbound direction)
Someone typing "@Vusul the invoice screen is crawling" in a Microsoft Teams channel opens a Triage task without leaving Teams: within seconds Vusul replies in the same thread with "✅ Added to Triage — REZ-482: …" and a link to the task. Technically this is a Teams outgoing webhook, not a bot — it is added at team level and needs no Azure bot registration, developer account or app package. It differs from Slack's Events path in three ways: (1) it only ever fires on an explicit mention, so the "every line in the channel became a task" accident is structurally impossible; (2) the confirmation is written into the channel, because Teams waits for a synchronous answer (~5s); (3) Teams mints the secret and only reveals it once it knows the callback URL, so the source is deliberately born secret-less and rejects every request until the secret is stored — an endpoint nobody can verify is a public task-creation form. Mention markup and Teams' HTML escaping are stripped, and a redelivered message never becomes a second task.
Chat Commands (Slack/Teams)
Whoever writes into a Slack or Teams intake channel can, once their account is linked, drive Vusul from the channel: "yardım" lists the commands, "kimlik" says who you are linked as, "durum REZ-12" reports a task's state; "ara", "görevlerim", "bugün", "geciken" and "triyaj" print lists; "kapat", "ata", "öncelik", "son tarih" and "yorum" edit a task from the channel; pending approvals are settled with "kabul"/"red"; and "bağlan" mints the account-linking code (see "Chat Identity Linking"). The domain commands run from the same place: "sprint" (or "cycle") reports the active sprint, "burndown" draws a text sparkline of the work left, "sprint raporu" gives the last closed sprint's figures, "projeler" and "proje <name>" print project cards, "iş yükü" (workload) counts open tasks per person — enriched with weekly capacity hours if you may manage delivery — "nöbetçi" (oncall) says who is on call and needs the service-desk module, while "müşteri", "müşteri aç" and "talepler" need the CRM module (both are Pro and above; without them the command answers "not included in your plan"). Two commands behave specially: a bare "bitti" reports the last 7 days' completions with weekly figures (while "bitti REZ-12" closes that task), and "özet" is not synchronous — it queues like a question to the assistant, and the answer lands as a card on Teams, in the "/vusul" window on Slack. Nearly every command has an English synonym (status, search, my tasks, today, overdue, close, assign, priority, due, comment, accept, decline, ask, link me…); the one exception is the bare "bitti" report, because a bare "done" is deliberately left as free text. The point that matters is the REPLY LANGUAGE: it comes from the writer's own Vusul profile language (Settings > Profile > Language; for an unmapped sender, the language of the admin who created the channel), so everyone in one channel is answered in their own. A ref-less "done"/"close"/"complete" is deliberately not a command — English sentences start with those words, and "Close the deal with ACME" must stay a task title. A command whose task reference cannot be read opens no wizard — it answers with its usage line ("I couldn't read the task reference. Example: `durum REZ-12`"). The wizard belongs to FREE TEXT, not to commands: once a non-command line has opened its Triage task, the bot asks priority → assignee → due date one at a time ("geç"/"skip" skips a step, "tamam"/"done" finishes, "iptal"/"cancel" quits; "yardım" interrupts without losing the session, which lives for 30 minutes and is renewed by every answer). "yeni görev <title>" always escapes command parsing and opens a task directly — closing an open wizard and starting the new task's own. On Slack the commands' front door is the "/vusul" slash command ("/vusul görevlerim", "/vusul sor <question>") and the reply is visible only to the writer; "@Vusul <command>" is processed too, but the Slack event path has no reply window, so the effect happens silently — and AI answers need no outgoing connection there, unlike Teams: they arrive in the "/vusul" window. The security line is sharp: commands only ever answer LINKED senders — an unmapped person's every line becomes a Triage task as before, so a stranger in the channel cannot read data through a command. Turning the source's "Commands" switch off keeps the command layer out entirely: every message opens a task.
Asking the Assistant from a Channel ("sor" and the question mark)
There are exactly two ways to ask the assistant in a channel, and both are DETERMINISTIC: the "sor <question>" command (English: "ask") or free text that ENDS WITH A QUESTION MARK. Any other free text opens a Triage task as before — leaving "is this a question or a job?" to the model would silently swallow half the channel. Vusul first answers synchronously with "🤔 Looking into it"; the real work runs on a queue: the model works for at most 6 turns with a tool catalog sealed to the workspace (search/read/create/update tasks, member and status lists, sprint progress, CRM records) and the answer lands in the channel as a CARD — over the outgoing Teams (Workflows) connection on Teams, into the private "/vusul" window on Slack. Destructive work (deleting a task, completing a sprint) is never run by the model: it is parked, the channel is told what will happen, and it waits for "@Vusul evet" ("onayla"); only the person who ASKED can confirm, the window is 10 minutes, "hayır"/"iptal" cancels, and one pending confirmation is kept per person — a new request supersedes the old one and a confirmed action runs once. Preconditions are checked in order, each with its own refusal: AI turned off for the workspace, no outgoing Teams connection to deliver into, the per-person daily budget of 20 questions (commands keep working), and the workspace's monthly AI limit, which answers with a friendly limit card. On Slack's event path ("@Vusul … ?") there is no reply window, so question-mark free text becomes a Triage task instead — conversations belong in "/vusul". Security: the tools are sealed to one workspace (a record in another answers the same "not found" as a missing one), every read and write runs with the asking LINKED member's own permissions and is attributed to them in the audit log, and both channel text and tool results are handed to the model as data, never instructions.
Reply Channel (workspaces with several Teams connections)
The assistant's asynchronous cards — the answer to a question asked in the channel — are posted through an outgoing Teams connection, and this setting says which one when a workspace has several. The picker lives in the intake row's setup panel and appears for Teams sources only: on Slack the asynchronous answer already goes to the "/vusul" window, so there is nothing to choose. Left empty ("Automatic (oldest connection)") the card goes to the workspace's OLDEST active Teams install — the documented default, not a silent preference. Removing the pinned connection clears the pin itself (the field empties with the row) and the picker returns to Automatic; a connection auto-disabled by sink health stays pinned but unusable. Either way the answer is not lost: that job falls back to the automatic path and leaves a log line, because a reply already promised with "🤔" must land somewhere. The setting is read at delivery time, not at enqueue, so changing it also redirects answers still waiting in the queue. Synchronous in-channel replies are unaffected — those are written into the Teams thread itself.
Chat Identity Linking (the "bağlan" flow)
Binds your channel username to your Vusul account without needing an admin — this mapping is what decides whose name commands ("görevlerim", "kapat"…) act under. Type "bağlan" (or "eşle") in the channel; it is the one command that does NOT require a mapping, because its whole job is creating that mapping. The reply carries a 6-digit code and a /settings/notifications?chatLink=… link; opened in a browser signed in to Vusul, it shows a confirmation card — channel user (source · workspace) — "is this you?". Confirming binds the channel identity to the account signed in AT THAT MOMENT; the code works once and expires after 15 minutes — too late, and you simply type "bağlan" again. Unsure who you are linked as? Type "kimlik" in the channel. The fallback path always stands: an admin can create the same mapping by hand in the intake row's "Sender mappings" panel — both paths write to the same table.
Enabling the Slack DM Channel (admin — bot token)
The admin step that lets notifications reach people as Slack direct messages. A channel post addresses the team; a DM addresses one person ("a task was assigned to you") — and an incoming-webhook URL cannot post to a person, so DMs need a real bot token (chat:write + im:write). The token is stored on the workspace and rides ON the existing Slack install: there is no second install, and with no Slack integration there is nothing to attach a token to. The moment it is stored, two things open up: a fourth "Slack DM" column joins the channel matrix on Settings > Notifications, and members can link their own Slack member id (see "Personal Slack DM Notifications"). Clearing the token turns the DM channel off and leaves the channel sink untouched.
Email Intake (inbound-parse)
Streams support email into the Triage queue. Vusul deliberately runs no SMTP server: the provider that already receives the mail (SendGrid Inbound Parse, Mailgun Routes, or a Postmark-shaped JSON relay) POSTs the already-parsed message to us, and we normalize sender, subject and body into one shape and open a task. Because each provider names its fields differently, a single alias table covers all three, preferring the body with the quoted reply chain and signature stripped. A payload carrying no content field does not quietly create an empty task — it is rejected with a 400, so a webhook wired to the wrong endpoint stays visible in the provider's delivery log.
Webhooks
Sends task events to external systems as HMAC-signed outbound HTTP notifications. Supports task.created, task.updated and task.deleted; the receiver verifies the signature to prevent spoofing.
API Keys (PAT)
Creates a personal access token for programmatic access, so scripts and automations can call the API on your behalf. For each token you decide three things separately: its scopes, the workspace it is bound to, and how long it stays valid. There are eight scopes — tasks:read, tasks:write, projects:read, workspaces:read, comments:read, comments:write, webhooks:manage, scim:manage — and if you tick none, the token has full access as you.
Public API v1: ?expand= and ?fields=
Two knobs on the v1 read endpoints: ?expand= embeds a related resource (comments, attachments, labels) and ?fields= narrows the response to just the keys you name. Fetching a task with its comments no longer needs two round trips, and a mobile client need not download the whole body. Both lists are strict whitelists: an unknown value is a 400, never a silent no-op — a typo that quietly returns the unshaped resource is exactly the bug integrations ship to production. An expansion is a read of another resource, so it costs that resource's scope: without comments:read on your token, expand=comments is refused. With neither parameter present the endpoints return their typed response untouched, so existing integrations are unaffected.
OAuth Applications & Client Secret Rotation
Lets an app you wrote or bought act on behalf of Vusul accounts. The difference from an API key: a key is for your own script, an OAuth app is for other people's accounts — the user grants the app consent, the app works only within the granted scopes, and nobody hands a password to a third party. Registration mints a client ID and a client secret; the secret is displayed once, at that moment, and can never be fetched again. If it leaks, or you rotate on a schedule, use "rotate secret": by default the old secret stays accepted for another 60 minutes so you can update integrations without downtime, while "invalidate the old secret immediately" opens no overlap window at all. While a window is open the app's row carries an amber warning, so the stretch where two secrets are valid at once never goes unnoticed.
Jira / CSV Import
Migrates existing work into Vusul. For Jira, a wizard walks you through connect → select projects → preview field mapping → run; for CSV, you upload a file. Jira credentials are not stored after the run.
Calendar Feed (ICS)
Gives a personal .ics subscription URL to show your assigned tasks in Google Calendar, Apple Calendar or Outlook. The link carries an anonymous, unguessable token and only publishes due-dated tasks assigned to you.

Enterprise & Security

SSO (OIDC+SAML), SCIM, audit log and custom roles.

6
SSO — OIDC + SAML
Enables single sign-on with a corporate identity provider. Linked email domains are defined; with JIT a user gets an account on first login. Enforced mode makes SSO mandatory (can be turned on only when the test connection is green; the workspace owner is exempt).
SAML Single Logout
Signing out of an SSO app is not enough on its own: the identity provider's session survives, so returning to the login screen lets you back in with no password prompt — a real exposure on a shared machine. Putting the IdP's single-logout (SLO) address into the SAML settings closes the loop: signing out here also ends the IdP session, and a logout started at the IdP ends every session here. Leave the field empty and logout stays local, exactly as before.
SCIM — User + Group Provisioning
Automatically syncs users and groups from an identity provider such as Okta or Microsoft Entra. When an employee is deactivated in the IdP, their access is removed in Vusul too; groups can be mapped to Vusul roles.
SCIM Group → Project Membership
Map a directory group to one or more projects: whoever joins that group in the IdP becomes a member of the project, and whoever leaves loses access. No separate "please also add them to these projects" round is needed for a new colleague — and because projects are a hard visibility boundary, this moves the source of access to a single place, the identity provider. Members you added by hand are left alone: a member who did not come from the group stays in the project even as the group changes.
Audit Log
Keeps a permanent log answering who did what and when. Role changes, invites, logins, SSO and SCIM events are recorded; you can filter by action type and export to CSV.
Custom Roles
Defines fine-grained roles beyond the standard ones. A base role (member or guest) is chosen, then each permission can be overridden with a Grant / Restrict / Base tri-state. Visibility permissions are locked to base for safety and cannot be loosened in a custom role.

Plan & Billing

Subscription tiers, plan gating and billing settings.

4
Subscription / Plan
Manages the workspace subscription tier. There are three tiers: Free, Pro, Enterprise. The screen shows the current tier, trial status, current usage, a tier picker and the billing history. Only the workspace owner can change tiers; a downgrade that would not fit current usage is rejected. When a payment provider is configured, moving to a paid tier means PAYING: the button sends you to the provider's hosted checkout and the plan changes only once the payment is confirmed. While no provider is configured, paid cards read "Coming soon".
Checkout, Invoices & Cancellation
The money side of a paid subscription. The provider is the Merchant of Record: it takes the card, issues the invoice and pays the tax — no card data ever reaches this app. When a payment is confirmed the plan opens automatically and a row appears in "Billing history" (the PDF link lives at the provider). A failed charge does not cut you off at once: a warning appears and, unless it's fixed, the workspace drops to Free after the configured grace period — NO DATA IS DELETED. When you cancel, access runs to the end of the paid period and the card is never charged again. A refund restates the matching row as "Refunded".
Plan Gating
Controls which features are on or off by plan tier. Free: 5 members, 3 projects and no modules; Pro: 8 modules unlocked; Enterprise: enterprise modules on top of Pro. A plan-locked module appears disabled with an "Upgrade" badge and opens the upgrade path when clicked.
Billing Settings
Holds the base inputs for cost and invoice calculations: workspace currency, default hourly rate and an optional per-member rate override. These are treated as salary-adjacent sensitive data and are visible only to holders of the ManageBilling permission.

Workspace Basics

Workspaces, members, roles, invites, projects, statuses and navigation.

13
Workspaces
Use a personal space to work solo or a company space to work with a team; switch between them from the top left. Creating teams inside a company workspace does not change your plan or your bill — the subscription is attached to the workspace.
Members & Invites
Add members by email invite or a shareable invite link; change a member's role or remove them. The last admin is protected.
Accepting an Invite (what the invitee sees)
The link in the invitation email and the shareable invite link both land in the same place: the accept screen. It spends the token from the link the moment it opens and shows one of three states — "Accepting…", "You've joined the workspace." or "This invitation is invalid, expired, or for a different email." On success "Go to app" drops you on your workspace list, where the new workspace is waiting; on failure the same button returns you to your task list. Accepting requires you to be signed in: if you are signed out you are sent to the sign-in screen first, but the return address does not carry the token — after signing in (or creating your account and verifying your email) you have to click the invitation link again. Accepting does not work at all on an unverified email address. An email invitation is bound to the address it was sent to, so it is rejected if you are signed in as someone else. A shared link, on the other hand, admits anyone with a verified email until its uses run out. Invitations live for 7 days; an expired, revoked or already-used invitation — and a workspace that has run out of member seats — are all turned away with that same single message, since the screen does not spell out which one it was. The role you join with (member or guest) is picked by whoever created the invitation; the accept screen never asks.
Roles (admin / member / guest)
Control who can do what with admin, member and guest roles; guests see a limited view while admins manage the workspace.
Domain-based Join
Add a verified domain (e.g. acme.com) so users with an email on that domain can join without an individual invite.
Projects (team projects)
Projects are the unit of task visibility; only a project's members can see it. Create, archive, add members, or start from a template. A sub-project inherits its team from its parent — team assignment cascades down the sub-tree, and a sub-project never gets a team of its own.
Workflow Statuses
Customize your workflow within 5 fixed categories (Backlog, Todo, In Progress, Done, Canceled) by adding custom statuses, coloring them, and setting a default.
Labels
Classify tasks with colored labels and organize related labels into groups.
Estimation Scale + Identifier
Pick an estimation scale (points, t-shirt sizes, linear or exponential) and set a 2-6 letter identifier prefix for task keys (e.g. DEMO-123).
Workspace Time Zone
The product's "today" is no longer the server's UTC midnight but the team's own clock. Pick a time zone for the workspace and it decides when cycles roll over, when daily automations run, and which instant counts as the start of a day for anything that looks at day boundaries. For a team in Istanbul the difference is concrete: under UTC the sprint rolled at 03:00 local, while with the right zone the day really starts at midnight. The time zone on your personal profile is a separate thing — it only formats dates on your screen and does not move the team's day boundary.
Getting Around Settings & Settings Search
Settings opens in a shell of its own: a permanent navigation rail on the left, one settings page on the right — the old screen that stacked twenty-eight sections into a single column is gone. The rail splits in two: ACCOUNT rows that concern only you at the top (Profile · Security · Notifications · Keyboard), then a workspace picker followed by that workspace's eight categories — General · People · Workflow · Projects · Integrations · AI · Enterprise · Billing — and last the Workspaces list, the only door to creating a workspace or joining one by verified domain. Switching workspaces in the picker rewrites the address with it, so you stay on the same category but never carry on editing the workspace you just left. The "Search settings" box at the top right — or ⌘K, Ctrl+K on a Windows keyboard — finds everything across all twelve pages from one place: as you type it lists matching pages first, then the individual settings grouped by the page that holds them; Enter takes you there and the section you land on is ringed for two seconds. Search is Turkish-aware (dotted/dotless i and accents do not break a match) and scans both languages' keywords at once, so typing "billing", "webhook" or "okta" works in a Turkish UI too. The visibility rule is one sentence, and it explains nearly every "my setting disappeared": a category or a section is not drawn at all if you lack the standing for it (admin of a company workspace) OR if the workspace module it belongs to is switched off — and it drops out of search too, because search invents no gate of its own, it reads the same rule. Switch the module back on under General > Modules and the section returns with its settings intact; switching one off never deletes data. Two exceptions are deliberate: the plan card is always visible (that is where a plan-locked module gets unlocked), and intake channels belong to no module. Type the URL of a page that is hidden from you and you get "These settings aren't open to you in this workspace" rather than a blank screen. On a narrow screen the rail gives way to a drawer behind the menu button in the top bar and the header doubles as the "you are here" label; the old /settings/workspaces/[id] address now redirects to General.
Project Board & Project Overview
Clicking a project in the left menu opens a full view locked to that project: list, board, calendar and timeline, with filtering, grouping and sorting all intact — but scoped to one project, so nothing from other projects leaks in. A delivery header sits on top: state and health badges, a progress bar with the done/total ratio, the lead and the dates, milestones, documents attached to the project and the stream of status updates written for the team. The General project is a plain folder and carries no such header. Open an old link you have no access to, or one belonging to another workspace, and instead of an empty board titled "…" you get a "Project not found" screen that points you at the workspace switcher.

Account & Security

Sign-in flows, profile, theme, 2FA, passkeys, sessions, inbox, notifications and shortcuts.

14
Sign-in, Sign-up & Account Recovery
Every way into the app — and back in when you are locked out — hangs off one chain. Normally you sign in with email and password; if two-factor is on, the sign-in hands over to a second screen where you enter your authenticator code, or one of the recovery codes you saved when your phone is not around. If the workspace is set up with enforced SSO you are never asked for a password at all: the browser is handed straight to the company identity provider. If you clicked a link while signed out, signing in drops you back on exactly that page; otherwise it takes you to your task list. Signing up asks for a name, an email, a password of at least 8 characters and acceptance of the terms, then lands you on the email-verification screen where you can resend the verification mail if it never arrived. Clicking the link in that mail signs you in on the spot — no second trip through the sign-in form; only accounts with two-factor on are sent to sign-in afterwards, for the second step. Forgot your password and you only type your email: the system answers with the same "sent" screen either way so it never reveals whether an account exists, and the link in the mail takes you to the screen where you set a new one.
Profile
Set your name, interface language (TR/EN) and time zone.
Light / Dark Theme
On first load the app follows your operating system's appearance setting: if your machine is in dark mode, Vusul opens dark without asking. If that is not what you want, the theme row in the user menu at the bottom left flips between light and dark; the theme you pick is remembered in that browser and the system preference is no longer consulted. The theme is purely a per-browser preference — it is not stored on your account, so you pick it again on another device. The same menu holds the row that switches the interface language between TR and EN; that one is saved to your profile and does follow you across devices.
Change Password
Verify your current password and set a new one; the change signs out all other sessions.
Two-Factor (2FA / TOTP)
Protect your account with a second step using an authenticator app (TOTP); set it up via QR and save the 10 recovery codes.
Passkey (WebAuthn)
Add a passkey for passwordless sign-in with fingerprint, Face ID or device lock; remove passkeys whenever you like.
Sign in with Apple
Apple joined the social sign-in group on the login and register screens; alongside Google and GitHub, "Continue with Apple" creates an account or signs you in without a password. If you choose to hide your email on the Apple side (a private relay address), the account is created with that address and mail goes there — signing in again with the same Apple account lands on the same user. The button appears only when the Apple provider is configured on the server, so an unconfigured provider never leaves a dead button behind.
Sessions
See the active devices signed in to your account; sign out individually or with "sign out all other sessions".
Delete Account (Danger Zone)
The red-bordered block at the bottom of the Security page is where you close your account, and it stops you twice against a mis-click: first you state the intent with "Delete my account", then you confirm by typing your password (or your authenticator code if you use 2FA). Confirming does not vaporize the account — deletion is scheduled 30 days out and your sessions on every device are signed out. Sign in again within those 30 days and the scheduled deletion cancels itself, with your account and data untouched; let the window pass and the record is purged for good. If you own a workspace, hand ownership to an admin from the danger zone in Settings > workspace settings before you go: the system will not do it for you, and the team would be left without an owner.
Inbox (Notification Center)
Everything that touches you collects here: Inbox sits at the top of the left menu with an unread badge, and opens a two-panel screen. The feed is on the left — a row lands when someone assigns you a task, mentions you or replies to your comment; when a task is nearly due or already overdue; when an SLA is breached or escalated to you as the on-call; when a sprint finishes, a retrospective starts, your approval is requested or an approval is decided; and when a message arrives from the customer portal. Each row carries a per-type icon, the actor's name and a self-refreshing relative time like "3m" or "2h". Click a row and the notification's task opens in full detail on the right — no need to navigate elsewhere to read it — while sprint and retro notifications instead offer a button straight to the sprint report or the retro board. Hover a row for buttons that toggle read/unread or snooze it out of the list for a while, and "Mark all as read" in the header clears a backlog in one move. Choosing which channel each type arrives on is the job of "Notification Preferences"; this is the place where they are read.
Notification Preferences
This is where you decide which notification reaches you through which path. The body of the page is a channel matrix: each row is a notification type (assigned to you, task completed, mentions, comment replies, due soon, overdue, SLA breach) and each column a channel — In-app, Email and Push. Three is not the fixed number: when the workspace has a Slack DM channel installed, a fourth "Slack DM" column joins the matrix, and without one that column is never drawn (the mapping itself is covered by "Personal Slack DM Notifications"). Above the matrix sits a per-device card that changes shape with the shell you are in: in a browser it is the push switch that keeps notifications coming even with the tab closed, and turning it on asks for browser permission; in the desktop app it is replaced by a "Desktop notifications" switch that routes through the operating system (see "Native Notifications in the Desktop Shell"); and on a browser without push support the card is not rendered at all rather than left as a dead switch. The distinction matters: matrix choices are stored on your account and hold on every device, while the switch above it concerns only the device you are on. Below sit quiet hours (emails are held during that window) and the daily digest time when the held ones are summarised.
Personal Slack DM Notifications
Get your notifications as Slack direct messages from the Vusul bot — the shortest path to staying informed without opening the app if you live in Slack all day. Paste your own Slack member ID and link it; a test DM is the only thing that proves you pasted the right one, since a well-formed but wrong ID is otherwise indistinguishable from a right one. The section shows up only when the workspace has a Slack DM channel installed; otherwise it hides itself rather than leaving a dead control.
Keyboard Shortcuts + Command Palette
Move fast with the Cmd+K command palette; rebind or reset keyboard shortcuts, with conflicting assignments blocked.

Platform & Offline

Working without a connection, live updates, and the shells the app runs in.

7
Offline Write Queue
The app does not stop when the connection drops: your change (creating a task, changing a status, writing a comment) goes into a local queue, appears applied on screen, and is sent in order once you are back online. The queue lives in the browser's persistent storage, so closing the tab — or the laptop — does not lose it; open the app the next day and the pending writes resume. The thin strip at the top tells you two things: how many changes are waiting while you are offline, and how many are being sent once you are back. It disappears on its own when the queue drains. If a change cannot be applied because the record changed while you were away, it is not swallowed silently: you get a warning and the screen refreshes to the server's current state.
Offline Cold Start
You can open the app from scratch with no network at all: the tasks, statuses, projects and boards you last saw live in the browser's persistent storage, so the screen is not empty and you are not bounced to a login form. The strip at the top states exactly what you are looking at: "You're offline — you're looking at your saved data". When the connection returns the strip becomes "Back online — restoring your session…"; the session is refreshed silently in the background, then everything on screen is refetched from the server (saved data can be days old, so the server wins) and the writes queued while you were offline are sent in order. The security side is deliberately narrow: only display-level identity (name, email, language, avatar) is kept on the device — the access token is never stored, and the token that renews your session lives in a cookie the page cannot read. Signing out, or a session that has genuinely ended, clears the saved profile too, so there is no offline start on that device afterwards. A cache older than a week, or one whose data shape changed, is discarded on its own.
Live Updates (realtime)
A change someone else makes lands on your screen without you doing anything. While you are signed in the app keeps a single live connection subscribed to the workspace you have open; when a task, status, cycle, milestone, comment or comment reaction, approval request, wiki page or attachment, test run or release changes, the affected list refreshes itself. Your own change is recognised when it comes back this way and is not applied twice — which is why a reaction badge you toggle quickly does not flicker back and forth. Notifications addressed to you arrive on a separate personal channel: the inbox badge climbs immediately and a toast appears (plus an OS notification in the desktop shell). If the connection drops it is retried in the background on a widening schedule and never gives up; when it returns, the events missed while it was down are closed out with a bulk refresh. That is why multi-person screens such as the retro board, the cycle board and the inbox carry no separate "refresh" button: the screen already keeps itself current.
Desktop App (developer preview)
A native desktop shell (Tauri) wrapping the same web app: no separate codebase, so every web release reaches desktop the day it ships. Window size and position are remembered, there is a real menu bar, and external links open in the system browser while SSO/OAuth hosts stay in-window so the session is established in the right place. The shell loads the real hosted origin rather than a static copy, which keeps session and cookie behaviour byte-for-byte identical to the browser and lets the offline queue work unchanged. Nothing is missing on the notification side: the engine painting the window (WebView2/WKWebView) has no Web Push, so no push subscription is created here — but there is a native path instead. On desktop the top card of Settings > Notifications reads "Desktop notifications", and notifications are handed to the operating system's notification centre over the live connection, with a "Send a test" button beside the switch to prove it. See the "Native Notifications in the Desktop Shell" entry below for the details. HEADS UP — this is a developer preview: no packaged installer has been published yet, and there is no signing/notarization and no auto-update. It is not a build to hand to end users; today it is run by building it from the repository.
Native Notifications in the Desktop Shell
The desktop shell has no Web Push — the engine that paints the window (WebView2 on Windows, WKWebView on macOS) implements no Push API at all, so a push subscription can never be created. That is why the card at the top of Settings > Notifications shows a "Desktop notifications" switch on desktop instead of "Web Push": while the app is running, incoming notifications are handed to the operating system's notification centre over the live connection the app already keeps open. The switch is per-device; the type/channel matrix below it (in-app / email / web push) stays an account setting, so you keep managing your phone's push rows from the same page. No OS notification is raised while the window is in front — the in-app toast is already visible; it only fires when the window is in the background. If the OS denies permission the switch does not stay on, and a warning underneath tells you to allow notifications for Vusul in system settings. The "Send a test" button next to it exists for one reason: an OS notification can fail silently (on Windows an unregistered app identity produces no error and no toast at all) — the test button is the only way to tell "nothing was sent" from "the OS is swallowing it". In a browser without push support the card is not rendered at all; showing a switch that could not work would be worse than showing none. Limit: notifications only arrive while the app is running, as there is no background service to wake a closed desktop app.
Mobile & Narrow-Screen Layout
Below 1024 pixels of screen width the shell rearranges itself: the left menu stops being a permanent column and moves into a header bar pinned to the top. The Vusul logo at the start of the bar takes you to your task list; the menu button at the far end opens the left menu as a sheet sliding in from the left, with the profile menu next to it. Content is not thrown away while the menu is open — the panel slides over it and closes when you tap outside — so the full width belongs to your list on a narrow screen. On two-panel screens (for example the inbox, with the list on the left and the selected notification's task on the right) the second panel is hidden and the list uses the whole width. This is not a separate "mobile app" but the same app fitting a narrow screen: everything, offline queueing and live updates included, works exactly as it does on the desktop.
Install as an App (add to home screen)
Vusul is a web app, but it can be installed on your phone or computer: the app publishes a web-app manifest, and a browser that sees it offers "Install app / Add to home screen" in its own menu. Installing does not download a separate program — the same app simply opens in a window of its own, with no address bar and no tab strip; it sits on your home screen or taskbar under the Vusul icon (a "maskable" variant on Android so the corners can be cropped, a 180×180 touch icon on iPhone) and opens straight onto your task list (/todo/all-tasks) instead of walking through a landing page every time. The app also registers a service worker: it caches the last page you saw plus idempotent read requests, so it still opens with no network — the full offline story is the one described in "Offline Cold Start" and "Offline Write Queue". In the installed version notifications go through Web Push: the "Web Push" card at the top of Settings > Notifications is the one you see here (on iPhone, web push only works in an app added to the home screen anyway). Do not confuse this with the desktop shell (Tauri): this install runs on your browser's own engine, with your browser profile and session, and it is the route available to everyone today; the Tauri shell is a native window with its own cookie jar, is still a developer preview, and delivers notifications through the OS notification centre rather than push. There is no "Install" button inside the app — installing always happens from the browser's own UI, and if your browser does not support it (desktop Firefox, for example) nothing breaks: the app keeps working in the tab exactly as before.