Vikunja
vikunja.ioWeb, Android LinuxVikunja is an open-source to-do application. It is suitable for a wide variety of projects, supporting List, Gantt, Table and Kanban views to visualize all tasks in different contexts. For collaboration, it has sharing support via private teams or public links. It can be self-hosted or used as a managed service for a small fee.
- Homepage:vikunja.io
- GitHub:github.com/go-vikunja/vikunja
- Web info:web-check.xyz/check/vikunja.io
Vikunja Source Code
Author
Description
The task manager you actually own.
Homepage
https://vikunja.ioRepository
- LicenseAGPL-3.0
- Created28 Nov 18
- Primary languageGo
- Size136,508 KB
- Stars5,633
- Forks731
- Watchers5,633
Top Contributors
@kolaente (8195)
@renovate[bot] (1416)
@dpschen (778)
@vikunja-bot (267)
@tink-bot (128)
@Elscrux (35)
@dependabot[bot] (29)
@Copilot (28)
@maggch97 (17)
@WofWca (16)
@claude (14)
@JohnStarich (13)
@mdrkrg (13)
@xela-zone (6)
@adrinux (6)
@profi248 (5)
@Tokra110 (4)
@davidangel (4)
@shilch (4)
@jtojnar (4)
@freaktechnik (4)
@andreymal (4)
@ncallaway (4)
@kigiela (4)
@TowyTowy (3)
@surfingbytes (3)
@Viehlieb (3)
@rhclayto (3)
@kergma-lw (3)
@NeoHuncho (3)
@mithileshgupta12 (3)
@LucaBernstein (3)
@eljef (3)
@13rac1 (3)
@nithinvarma411 (2)
@zapp88 (2)
@kallegrens (2)
@gabeklavans (2)
@bradmartin333 (2)
@azymondrian (2)
@vlasov-y (2)
@CrazyWolf13 (2)
@MGChecker (2)
@Quiwy (2)
@mnr73 (2)
@furai (2)
@KaibutsuX (2)
@javabrett (2)
@reggi (1)
@TheEdgeOfRage (1)
@ThiloSavary (1)
@deadLocks21 (1)
@Uenluom (1)
@v-yarotsky (1)
@vovochka404 (1)
@blancqua (1)
@XiangCany (1)
@TheZoker (1)
@blacksmith-sh[bot] (1)
@confor (1)
@cr1xu5 (1)
@subnut (1)
@sjwasko (1)
@Saxos-Simone (1)
@IAMSamuelRodda (1)
@remilapeyre (1)
@RyanHecht (1)
@ryanchou1994 (1)
@RoboMagus (1)
@szuro (1)
@rhysmcneill (1)
@Rein-R3 (1)
@Raymi306 (1)
@probecat (1)
@treysu (1)
@themylogin (1)
@the-darkvoid (1)
@taiwithers (1)
@stephen-hill (1)
@SteffeyDev (1)
@simonsmd (1)
@BenLocal (1)
@rudd6617 (1)
@rriski (1)
@primeapple (1)
@naleo (1)
@maximilize (1)
@leggettc18 (1)
@kompetenzbolzen (1)
@carl-unique (1)
@jontyms (1)
@jonastheis (1)
@jayden-chan (1)
@j-hugo (1)
@graves501 (1)
@erri120 (1)
@emilsteixner (1)
@edelgrace (1)
@earnestma (1)
@devadattas (1)
Recent Commits
kolaente(05 Oct 26)
fix(frontend): show 'just now' for timestamps within the last minute The shared now ref ticks every 60s, so freshly created items lay in its future and rendered as 'in a few seconds'.
Frederick [Bot](06 Oct 26)
chore(i18n): update translations via Crowdin
kolaente(04 Oct 26)
fix: use vite default build target This allows us to support older browsers, based on vite's baseline-widely-available compile target
Frederick [Bot](04 Oct 26)
chore(i18n): update translations via Crowdin
kolaente(03 Oct 26)
fix(db): percent-encode postgres credentials in the connection URL url.PathEscape leaves '@' and ':' unescaped. Since the switch to pgx 5.11, whose URI parser ends the userinfo at the first '@', a password containing '@' got split and its tail was resolved as the database hostname. Reported in https://community.vikunja.io/t/9386
Frederick [Bot](03 Oct 26)
chore(i18n): update translations via Crowdin
kolaente(02 Oct 26)
chore: v2.7.0 release preparations
kolaente(02 Oct 26)
[skip ci] Updated swagger docs
kolaente(02 Oct 26)
test(e2e): cover websocket re-authentication A second auth with the same session is accepted now; a token of another session is rejected.
kolaente(02 Oct 26)
test(e2e): expect the project wording in the remove share dialog
kolaente(02 Oct 26)
chore(client): regenerate the frontend API client The v2 link share descriptions changed.
kolaente(02 Oct 26)
fix(sharing): call the shared entity a project in the remove dialog The dialog and success toast used the List view's name.
kolaente(02 Oct 26)
feat(websocket): re-authenticate open sockets with a renewed token Sockets closed at their token's expiry even after the client renewed, forcing a reconnect and losing events in the gap. A second auth on an open socket must match its user and session and re-runs the session check before the expiry timer moves. The client sends the renewed token on the open socket after every refresh, schedules the proactive refresh for a session that existed before mount, and refreshes a token expiring within seconds before authenticating, since its server clock can lag by up to a second.
kolaente(02 Oct 26)
fix(projects): let a nearer grant lower an inherited permission The effective permission was the highest grant on the project or any ancestor, so sharing a child project read-only with someone who had write on the parent had no effect. New rules: - Any admin grant on the project or an ancestor, including ownership, gives admin. A parent admin can always get around a child restriction by unsharing or deleting the parent. - Otherwise the nearest grant wins, so a child grant can raise or lower an inherited read or write. Changelog: A user or team share on a child project now overrides read or write inherited from a parent project, in both directions. Admin on a parent project still always applies to its children.
kolaente(02 Oct 26)
fix(auth): send the refresh cookie with SameSite=Lax Over https the refresh cookie used SameSite=None. CORS allows localhost origins by default for the desktop app, so a page on any localhost port could refresh a session with the user's cookie and read the new token. The cookie is now always SameSite=Lax. SameSite=None existed for the desktop app's cookie refresh, which it replaced with OAuth over IPC in v2.3.0. Changelog: - Desktop v2.2.x has to log in again more often; upgrade to v2.3.0 or later. - Deployments with the frontend and API on different registrable domains lose cookie refresh, as before v2.2.0.
kolaente(02 Oct 26)
fix(websocket): refresh an expired token before reconnecting The server closes the socket when its token expires. Reconnecting with that token failed auth and stopped the socket for good. A transient refresh failure now retries with backoff instead of sending the stale token, and backoff only resets after a successful auth.
kolaente(02 Oct 26)
fix(user): revoke sessions when too many TOTP attempts lock the account The auto-lock after ten failed TOTP attempts left sessions and sockets alive until token expiry. Locking now dispatches an account-locked event whose listener deletes the user's sessions.
kolaente(02 Oct 26)
fix(websocket): check the session and close sockets on revocation The socket only checked the token's signature and expiry. A token of a deleted session or of a disabled user still authenticated, and an open socket kept receiving notifications after logout, session revocation, password change or account deletion. Auth now requires the token's session to exist for that user and the user to be active; the connection registers first and is checked once, so a concurrent revocation can't slip in between. Transient errors close with try-again-later instead of invalid_token. Each socket closes when its token expires, which bounds exposure even on nodes that miss a revocation event. Deleting sessions dispatches SessionsRevokedEvent on commit, every caller flushes it after committing, and the hub closes the matching sockets. Disabling or locking a user and deleting a user revoke their sessions, also from the CLI.
kolaente(02 Oct 26)
fix(sharing): list what is deleted when removing project access Removing a user or team from a project, removing a team member, leaving a team and deleting a team now say that task assignments, subscriptions and webhooks of whoever loses access are deleted too.
kolaente(02 Oct 26)
fix(sharing): delete a user's webhooks when they lose project access Webhooks kept delivering task and project data to their creator after the creator was removed from the project. When a user can no longer read a project, or any project under it, their webhooks there are deleted together with their task assignments and subscriptions. This runs in the request's transaction for every explicit removal: unsharing a user or team, removing a team member (including external team sync, limited to teams the user was in), deleting a team and reassigning a project's owner. Removing a user who is not a team member is a no-op. It replaces the async listener that only cleaned up after team member removal. Deleting a user deletes all webhooks they created. Access is resolved in one batch per user and task data is deleted via subquery, so large projects stay within bind limits. As a backstop for access lost indirectly, e.g. by moving a project to another parent, webhook delivery skips webhooks whose creator is not active or can no longer read the event's project. A downgrade to read keeps the webhook. Link shares are left alone by design.
kolaente(02 Oct 26)
fix(projects): let owners delete their own default project The owner check compared against the handler's stub, whose owner_id is always 0, so the exemption never applied through the API.
kolaente(02 Oct 26)
fix(projects): count a project as default only for its owner Any user pointing their default at a foreign project blocked its owner from archiving or deleting it. Deleting a project now clears every user's default that points at it, not only the owner's.
kolaente(02 Oct 26)
fix(user): only allow writable projects as the default project default_project_id accepted any id. Pointing it at a foreign project blocked the owner from archiving or deleting that project. It must now be 0 or a writable, non-archived project of the user; an unchanged value is not re-checked so a default the user lost access to doesn't block saving other settings.
kolaente(02 Oct 26)
fix(tasks): skip position recalculation for views without projects Defense in depth next to the fail-closed search: a view whose user can reach no project has nothing to position.
kolaente(02 Oct 26)
fix(tasks): return no tasks when a search has no project scope xorm drops nil conditions, so a search for a user without projects or favorites lost its WHERE clause and returned every task in the instance. Saved filters of such users recalculated positions over, and leaked, all tasks.
kolaente(02 Oct 26)
fix(sharing): require project admin to manage link shares The delete permission check read the share's tier from the URL-bound struct, which is always the zero value (read), so a write member could delete any link share, including admin ones. Creating, changing or deleting link shares now requires project admin, whatever the share's tier. Listing and reading by ID already did. Shares created by write members stay valid. Deleting a share that does not exist in the project in the path now returns 404. Changelog: Creating, changing or deleting link shares now requires project admin.
renovate[bot](01 Oct 26)
chore(deps): update github-actions
renovate[bot](30 Sept 26)
chore(deps): update dependency fast-uri@3 to v4.1.5 [security]
renovate[bot](30 Sept 26)
chore(deps): update dependency serialize-javascript to v7.1.2 [security]
dependabot[bot](30 Sept 26)
build(deps): bump dompurify from 3.4.15 to 3.4.16 in /frontend Bumps [dompurify](https://github.com/cure53/DOMPurify) from 3.4.15 to 3.4.16. - [Release notes](https://github.com/cure53/DOMPurify/releases) - [Commits](https://github.com/cure53/DOMPurify/compare/3.4.15...3.4.16) --- updated-dependencies: - dependency-name: dompurify dependency-version: 3.4.16 dependency-type: direct:production ... Signed-off-by: dependabot[bot] <[email protected]>
Vikunja Security
Security Advisories (71)
- mediumPatchedCVSS 6.5
GHSA-4hv6-xc92-j86gWebSocket authentication ignores server-side session state, so revoked sessions keep receiving live pushes
- mediumPatchedCVSS 5.4
GHSA-fprf-r6rv-xg99Saved filter creation with an empty filter string recalculates task positions across all tenants
- mediumPatchedCVSS 6.5
GHSA-hjx8-qv73-f7cmWebhooks and link shares survive every revocation path, so a removed collaborator keeps a live feed
- mediumUnpatchedCVSS 5.4
GHSA-pjr3-86v4-5p7wExplicit lower-permission share on a sub-project is silently overridden by an inherited parent permission (broken access control / privilege-management regression in v2.6.0)
- mediumPatched
GHSA-fmmf-xq98-g327Write-level project members can delete admin-tier link shares through an unloaded permission check
- highPatched
GHSA-m687-p538-r5hpPermissive Cross-domain Security Policy trusts every localhost origin which should not be trusted
- highPatched
GHSA-xxc3-xpmc-vmvrUnbounded nested task-filter recursion permits API process termination
- highPatched
GHSA-pqf9-h8g4-8gmhUnbounded CSV row cardinality permits API process termination
- highPatched
GHSA-wq92-8x3r-fm38Planka migration retains an unbounded aggregate of attacker-served attachments and can OOM the API
- mediumPatched
GHSA-4vh2-39rq-rq8jUnbounded image decode on avatar and project-background uploads enables decode/resize amplification
- mediumPatched
GHSA-6rvj-qwjf-3m4qEvery /api/v2 pre-auth endpoint is unthrottled on a stock install while its /api/v1 twin is rate limited
- mediumPatched
GHSA-m469-88xx-8rx2CalDAV and feeds BasicAuth endpoints have no rate limit, bypassing the anti-brute-force floor on account passwords
- lowPatched
GHSA-8wvg-r2j4-3737Assignee email addresses disclosed to read-only project members via the task assignees endpoint
- mediumPatched
GHSA-jp29-jrxc-92vfFavorited tasks remain readable after project access is revoked, including content written post-revocation
- mediumPatched
GHSA-g38j-7v97-x298CalDAV relation creation bypasses TaskRelation.CanCreate, allowing an unauthorized write into any task by known UID
- lowPatched
GHSA-w2ch-4xgr-22wwTask relation deletion does not check read access to the other task, allowing cross-project relation removal
- mediumPatched
GHSA-3hc7-r24j-rpwcCross-project task disclosure through subtask expansion
- highPatched
GHSA-w7jp-mf2v-8342Denial of service via decompression bomb in the data import
- mediumPatched
GHSA-39p5-2wrr-xh29Any user can enumerate every team and its members by attaching arbitrary teams to a throwaway project
- mediumPatched
GHSA-vfxw-3x8p-2vjrLink-share token can enumerate users through the v2 API
- mediumPatched
GHSA-88f6-4rjv-x774TOTP secret is readable after enrollment, no step-up auth
- mediumPatched
GHSA-9rg3-v78m-26q8API token scopes bypassed via task expand parameter (comments, reactions, time entry counts)
- lowPatched
GHSA-w39f-h553-h2mxCross-tenant task-position rows can be injected into arbitrary project views via the unvalidated project_view_id in the task position endpoint (v1 and v2)
- highPatched
GHSA-qfwc-vx6f-3g6gRead-only project members can obtain any link share's access hash via the single-share read endpoint (v1 and v2) and escalate to the share's permission level
- highPatchedCVSS 7.5
CVE-2026-76216Link-share principal-type confusion enables cross-account team removal, bot takeover, and roster disclosure
- highPatchedCVSS 8.1
GHSA-vvcv-vpph-h844Link-share principal ID collision allows cross-account API token issuance and management
- highPatched
GHSA-rj9j-8772-4h6cLink-share token reads any tenant's kanban buckets and enumerates usernames/IDs instance-wide (BOLA)
- highPatched
CVE-2026-62367OIDC email-fallback account linking ignores email_verified, enabling local-account takeover
- highPatchedCVSS 8.1
CVE-2026-62376Plaintext storage of password-reset/email-confirm tokens in database enables account takeover on DB read access
- mediumPatched
CVE-2026-54766Project duplication bypasses write-permission check on the target parent project
- mediumPatchedCVSS 5
CVE-2026-55067Authenticated cross-tenant kanban-bucket relocation via `project_view_id` mass-assignment
- highPatchedCVSS 8.1
CVE-2026-57458Scoped API token can mint unrestricted OAuth session credentials
- highPatchedCVSS 7.1
CVE-2026-55066Cross-tenant IDOR in kanban move-task endpoint via unauthorized body task_id
- highPatchedCVSS 8.1
CVE-2026-55065Improper Authorization and Authorization Bypass Through User-Controlled Key in code.vikunja.io/api
- mediumPatchedCVSS 4.3
CVE-2026-55064Incomplete fix for CVE-2026-35595: Write-only user can detach shared project from parent hierarchy via parent_project_id=0
- mediumPatchedCVSS 4.3
CVE-2026-40103Scoped API tokens with projects.background permission can delete project backgrounds
- highPatchedCVSS 7.4
CVE-2026-34727TOTP Two-Factor Authentication Bypass via OIDC Login Path
- mediumPatchedCVSS 4.1
CVE-2026-35601iCalendar Property Injection via CRLF in CalDAV Task Output
- mediumPatchedCVSS 5.4
CVE-2026-35600HTML Injection via Task Titles in Overdue Email Notifications
- mediumPatchedCVSS 6.5
CVE-2026-35599Algorithmic Complexity DoS in Repeating Task Handler
- mediumPatchedCVSS 5.4
CVE-2026-35602File Size Limit Bypass via Vikunja Import
- mediumPatchedCVSS 4.3
CVE-2026-35598Missing Authorization on CalDAV Task Read
- mediumPatchedCVSS 5.9
CVE-2026-35597TOTP Brute-Force Due to Non-Functional Account Lockout
- mediumPatchedCVSS 4.3
CVE-2026-35596Broken Access Control on Label Read via SQL Operator Precedence Bug
- highPatchedCVSS 8.3
CVE-2026-35595Privilege Escalation via Project Reparenting
- mediumPatchedCVSS 6.5
CVE-2026-35594Link Share JWT tokens remain valid for 72 hours after share deletion or permission downgrade
- mediumPatched
CVE-2026-33700Link Share Delete IDOR — Missing Project Ownership Check Allows Cross-Project Link Share Deletion
- highPatched
CVE-2026-33668Disabled/Locked User Accounts Can Still Authenticate via API Tokens, CalDAV, and OpenID Connect
- mediumPatchedCVSS 6.4
CVE-2026-33679SSRF via OpenID Connect Avatar Download Bypasses Webhook SSRF Protections
- mediumPatchedCVSS 6.4
CVE-2026-33675SSRF via Todoist/Trello Migration File Attachment URLs Allows Reading Internal Network Resources
- mediumPatchedCVSS 6.5
CVE-2026-33676Cross-Project Information Disclosure via Task Relations — Missing Authorization Check on Related Task Read
- mediumPatchedCVSS 6.5
CVE-2026-33677Webhook BasicAuth Credentials Exposed to Read-Only Project Collaborators via API
- highPatchedCVSS 8.1
CVE-2026-33678IDOR in Task Attachment ReadOne Allows Cross-Project File Access and Deletion
- highPatchedCVSS 7.5
CVE-2026-33680Link Share Hash Disclosure via ReadAll Endpoint Enables Permission Escalation
- criticalPatchedCVSS 9.1
GHSA-2pv8-4c52-mf8jUnauthenticated Instance-Wide Data Breach via Link Share Hash Disclosure Chained with Cross-Project Attachment IDOR
- highPatched
CVE-2026-33334Any frontend XSS escalates to Remote Code Execution due to nodeIntegration in Vikunja Desktop
- highPatched
CVE-2026-33335Arbitrary local application invocation via unvalidated shell.openExternal in Vikunja Desktop
- criticalPatched
CVE-2026-33336Remote Code Execution via same-window navigation in Vikunja Desktop
- mediumPatched
CVE-2026-33313IDOR in Task Comments Allows Reading Arbitrary Comments
- mediumPatched
CVE-2026-33312Read-only users can delete project background images via broken object-level authorization
- mediumPatched
CVE-2026-333152FA Bypass via Caldav Basic Auth
- highPatchedCVSS 8.1
CVE-2026-33316Improper Access Control Enables Bypass of Administrator-Imposed Account Disablement
- mediumPatchedCVSS 5.7
CVE-2026-33473TOTP Reuse During Validity Window
- highPatched
CVE-2026-33474DoS via Image Preview Generation
- mediumPatchedCVSS 5.3
CVE-2026-29794Rate-Limit Bypass for Unauthenticated Users via Spoofed Headers
- criticalPatchedCVSS 9.8
CVE-2026-28268Account Takeover via Password Reset Token Reuse
- highPatchedCVSS 7.2
CVE-2026-27819Path Traversal in CLI Restore
- criticalPatchedCVSS 9.1
CVE-2026-27575Weak Password Policy Combined with Persistent Sessions After Password Change
- highPatchedCVSS 7.3
CVE-2026-27616Stored Cross-Site Scripting (XSS) via Unsanitized SVG Attachment Upload Leading to Token Exposure
- mediumPatchedCVSS 6.1
CVE-2026-27116Reflected HTML Injection via filter Parameter in Projects Module
- highPatched
CVE-2026-25935XSS Via Task Preview
Vikunja Website
Website
Vikunja: The task manager you actually own
Vikunja is open-source task management you can self-host. Lists, Kanban, Gantt, and more — on your server or ours. Made and hosted in the EU.
Redirects
Does not redirect
Security Checks
All 65 security checks passed
Server Details
- IP Address172.67.172.167
- LocationSan Francisco,California,United States of America,NA
- ISPCloudFlare Inc.
- ASNAS13335
Associated Countries
US
DE
Safety Score
Website marked as safe
100%
Trackers
No known trackers found
Blacklist Check
vikunja.io was found on 0 blacklists
- AntiSocial Blacklist
- Artists Against 419
- Badbitcoin
- Bambenek Consulting
- CERT Polska
- CoinBlockerLists
- CRDF
- CryptoScamDB
- EtherAddressLookup
- EtherScamDB
- Fake Website Buster
- MetaMask EthPhishing
- NABP Not Recommended Sites
- OpenPhish
- PetScams
- PhishFeed
- PhishFort
- Phishing.Database
- PhishStats
- PhishTank
- Phishunt
- RPiList Not Serious
- Scam.Directory
- SecureReload Phishing List
- Spam404
- StopGunScams
- Suspicious Hosting IP
- ThreatFox
- ThreatLog
- TweetFeed
- URLhaus
- ViriBack C2 Tracker
Website Preview
Vikunja Docker
Container Info
Vikunja
The to-do app to organize your life.| Before use create custom template and Edit: VIKUNJA_SERVICE_FRONTENDURL , VIKUNJA_API_URL & VIKUNJA_SERVICE_JWTSECRET
Run Command
docker run -d \
-e PUID=${PUID} \
-e PGID=${PGID} \
-e PORT=${PORT} \
Compose File
version: 3.8
services:
vikunja:
environment:
PUID: 1000
PGID: 1000
PORT: Environment Variables
- Var NameDefault
- PUID1000
- PGID1000
- PORTnull
Vikunja Reviews
More Task Management
A Getting Things Done + Pomodoro productivity system for desktop and mobile. Local-first, no account required, can sync via WebDAV/Dropbox/local file or self-hosted deployment. With a CLI, REST API and MCP for scripting, has optional BYOK AI.
Privacy-respecting, open-source task manager and time tracker. All data is stored locally on your device - no account required, no cloud dependency, and zero telemetry. Supports Jira, GitLab, GitHub, Gitea, OpenProject and CalDAV integration. Features include time tracking, Pomodoro timer, break reminders, and idle detection.
About the Data: Vikunja
Change History
- Moved from Productivity › Cloud Productivity Suites #805
Edit Vikunja Data
You can edit Vikunja's entry in this section of awesome-privacy.yml by submitting a PR to our GitHub repo.
Note that some of the information shown above has been aggregated from external
sources, a list of these can be found data documentation.
Origin Data
Modify Data
API
You can access Vikunja's data programmatically via our API. Simply make a GET request to:
https://api.awesome-privacy.xyz/v1/services/vikunjaThe REST API is free, no-auth and CORS-enabled. To learn more, view the API Docs or read the API Usage Guide.
Share Vikunja
Help your friends compare Task Management, and pick privacy-respecting software and services.
Share Vikunja and Awesome Privacy with your network!