Draw is an annotation tool primarily for linux (with more platforms coming).
It allows you to draw and annotate ontop of your desktop easily through configurable keybinds (such as hold to draw, toggle, etc).
Similar to annotation tools from remote desktop solutions (but aiming to be more feature-full) and dedicated software such as epicpen. Aims to make it easier to reach for than excalidraw, mermaid or similar tools for explaining things.
Currently supports in some or full capacity:
- Image and partial SVG rendering.
- Common drawing tools (such as rectangle, lines, arrows, text).
- Interface for swapping tools, and changing their options.
- Customisable text rendering.
- Wayland fractional scaling.
What is currently in the works (locally or in some branch):
- PDF support
- An integrated typst tool (depends on PDF support, since the SVG output produces tessellated text, which is slow to render and imperfect).
- Configurable keybinds.
- Split into a daemon and client (for spawning onto multiple displays in the same context).
- IPC interface to allow for easy interaction with the canvas from other applications (i.e. the client in the client-daemon architecture mentioned above).
- UI elements for saving/loading a canvas snapshot to/from a file.
What is not in the works yet (but is planned for the future):
- Subpixel font rendering: Text is sufficiently crisp already for me, and subpixel rendering would need to be opt-in (so users with low-DPI and non linear RGB pixel layouts aren't negatively affected).
- Better text editing experience: Simple text editing will be sufficient for a mvp, the features below can be added after.
- Treesitter highlighting within codeblocks for typst integration.
- Show typst error messages.
- Improve the editor experience by adding more keybinds (and possibly opt-in vim-like modal editing).
- Utilising DMABUF on linux to further improve performance (because why not :))
- Adding transitive tools (such as a fading pen tool), with lots of options for keybinds.
Once most of the above are complete:
- Add support for loading files from common tools such as mermaid diagrams, excalidraw files, etc.
- Add support for custom styles for tools (like how excalidraw provides sloppiness settings to make a sketched look).
Some general todos:
-
Improve the typst tool by parsing from a PDF instead of a svg to get actual text nodes instead of the paths provided by the svg generated by typst.
-
Document all of the crates.
-
Render to a single texture and apply anti-aliasing to it, so that complex primitives (such as svgs) look better.
-
Add gap between texture allocations in atlas to avoid bleeding.
-
Subpixel rendering opt-in for gui
-
Implement a modal editor using the [
modit] crate. -
Make graphics crate hold primitives for drawing without implementations (so the library becomes renderer agnostic), the implementations for renderer's will then go into the
renderercrate, which will allow for consumers to implement their own rendering backend, and allow us to provide multiple rendering backends (wgpu, tinyskia, etc). -
Improve the GUI library to either include some subscription model (to fit ELM-style), or allow for an async executor to handle events.
-
Use dmabuf to pass the buffer directly to the compositor. Should be easier with wgpu v26.x.x due to supporting enabling vulkan extensions. Would look into using drm-rs and gbm to create the buffer
-
Add color to typst code blocks using treesitter.