calculateNewPositionsForTasks places a whole creation batch on top of a view with a single lowest-position query: evenly spaced below the current lowest, payload order preserved, no collisions by construction. When the spacing trips a full recalculation, the batch's own freshly inserted rows are snapshot-scoped and removed again afterwards so the queued top positions land while rows written earlier in the creation survive. It replaces the two previous implementations of the same idea: calculateNewPositionForTask is now a one-element wrapper and the saved-filter healing path calls it directly. The empty-view default falls back to payload-order spacing when task indexes repeat or are zero, since index-derived defaults collide in saved-filter views spanning projects.
Vikunja
The task manager you actually own.
If Vikunja is useful to you, please consider supporting the project. You can buy a coffee, sponsor on GitHub or buy a sticker pack. We're also offering a hosted version of Vikunja if you want a hassle-free solution for yourself or your team. If you or your company needs admin panel, audit logs or time tracking, check out Vikunja Pro.
Note
For the development of Vikunja, we're using LLM-Assisted coding tools in various parts of the codebase. Most contributions made @tink-bot are built that way.
Table of contents
Security Reports
If you find any security-related issues you don't want to disclose publicly, please use the contact information on our website.
Features
See the features page on our website for a more exhaustive list or try it on try.vikunja.io!
Docs
All docs can be found on the Vikunja home page.
Roadmap
See the roadmap (hosted on Vikunja!) for more!
Contributing
Please check out the contribution guidelines on the website.
License
Most of this repository is licensed under AGPL‑3.0‑or‑later.
The contents of desktop/ are licensed under
GPL‑3.0‑or‑later.
Unsplash Images
Background images from Unsplash are distributed under the Unsplash License. The license requires giving credit to the photographer and Unsplash. See Unsplash’s terms for more information.