Infinite canvas drawing/whiteboarding app for Windows, Linux and macOS. Made with Godot.

Lorien

Build Passing License

Lorien is an infinite canvas drawing/note-taking app that is focused on performance, small savefiles and simplicity. It's not based on bitmap images like Krita, Gimp or Photoshop; it rather saves brush strokes as a collection of points and renders them at runtime (kind of like SVG). It's primarily desinged to be used as a digital notebook and as brainstorming tool. While it can totally be used to make small sketches and diagrams, it is not meant to replace traditional art programs that operate on bitmap images. It is entirely written in the Godot Game Engine. For an overview on how to use Lorien have a look here.

Lorien demo

This is very much a WIP and still a bit rough around the edges . The savefile format might also change in the future. Contributions (be it bug reports, code, art or translations) are very welcome.

Features as of v0.5.0-dev:

  • Infinite canvas
  • Infinite undo/redo
  • (Almost) Infinite zoom
  • Infinite grid
  • Distraction free mode (toggles the UI on/off)
  • Extremely small savefiles (File format specs)
  • Work on multiple documents simultaneously
  • Tools: Freehand brush, eraser, line tool, selection tool
  • Move and delete selected brush strokes
  • Basic Export: visible canvas as PNG
  • Built-in and custom color palettes
  • Designed to be used with a drawing tablet (Wacom, etc.). It also supports pressure sensitivity
  • A little Surprise Mechanic™ when pressing F12
  • Runs on Windows, Linux & macOS
  • Localizations: English, German, Italian, Korean, Russian, Spanish

Download

You can download the latest stable releases on Github.

If you want to check out the bleeding edge main branch without building the project yourself you can also check out the CI builds. But make sure to backup your files and be prepared for bugs if you do that.

More information

Credits

Owner
Marcus Brummer
Web, mobile and game developer.
Marcus Brummer
Comments
  • Supereraser

    Supereraser

    In some whiteboard apps, like on whiteboardfox.com, the eraser is very 'dangerous' and the moment it touches an object the whole object just vanishes. It would be helpful to have a tool like this, either replacing the current eraser or implemented as a separate tool. For the time being, simply using the selection tool and pressing 'delete' is a good option.

  • Selection Tool, Move Tool, Export as PNG Implementation

    Selection Tool, Move Tool, Export as PNG Implementation

    Hi, First of all, thank you very much for making this very useful tool. I always had the idea in mind to make a very simple drawing app to draw, design and project stuff or just take notes while stuyding/working, but never had the time or chance to do so. I saw this tool and I really liked the beautiful and clean UI you are making, and most of the features already implemented to make something like this work on almost any platform. I'd like to contribute with these features I managed to implement:

    • Selection Tool
    • Move Tool
    • Export as PNG

    These features were implemented very quickly trying to follow your project flow and architecture, and focusing on simplicity. Of course I don't to push anything: this is just my proposal for features I find useful in tools like this one and that I'm currently already using by myself, so I'll keep on using it anyway on my branch.

    Since the implementations are pretty much clear from the commits, I'll directly show some examples about the results. If you think that the way I implemented these could work, let me know how I can improve the code in order to follow your style better.

    image

    Selection tool TMOnZnFdxG This new tool (with M as the shortcut button) will let you select strokes inside a selection area, drawn pressing and holding the LEFT BUTTON of your mouse.

    87Nv2rY1o3 The selection not only works with a single selection, but holding SHIFT while pressing LEFT BUTTON will allow to select different strokes with separate selection areas.

    6m5OsbhFAO Of course, the selection area will work in all directions, and will not be influenced by the camera offset or span.

    WsqlTO1ihf The label showing the amount of strokes selected is updated only when needed.

    Move Tool jmwfkbHGU1 An additional tool, "Move Tool" (with shortcut button V), has been added to the tool bar, and this will let you move around previously selected strokes.

    eBcfg0iTPv In the same way as the Selection Tool, the Move Tool will be indipendent from camera's zoom and offset.

    Export as PNG 00bzBpJ8lt It is now possible to export the whole canvas as a .png file.

    2552021_225249

    SOME NOTES

    • About Tools: I added a CursorClass that will be inherited by all Cursors inside the Viewport. This is not strictly necessary, but seems solid to have one just like Tools have one.
    • About Selection Tool: the algorithm to select a brush stroke is very simple and cheap for now, the right compromise between performances and functionality if you ask me. It justs check if the first and last points of the stroke are inside the selection Area. Of course, it is not the best way to do this, but is very fast and it works fine for me. Eventually you already know a better way to do this, maybe more performant or more logic. 6Oh5eyUoYO
    • About Move Tool: strokes are moved by the actual position of the Line2D, and not by moving each single point of the stroke. Is it ok for you? Would this create any issue with saving projects? It is the fastest way, since iterating for each point and moving it could be a problem.
    • About Exporting: The FileDialog used to implement this feature is unrelated from the Saving/Loading one, since it will follow different rules and filters. Since currently having a transparent background is not possible (I'm not able to change the alfa value, as shown in the gif), a background will be always present. However, Viewports have a transparent_bg property which can be enabled in order to have a transparent bg if the content of the viewport is saved as a file. If only making the background transparent was possible from Lorine settings (or just the Color Picker), we could have pngs with transparent background.
    • Undo and Redo have not been implemented yet by me. Mostly because I don't know the effort to implement them, and if it was worth it without even knowing if any of these features would be accepted.

    Thank you very much for taking your time reading this, let me know what you think about it, and eventually how these can be improved.

  • Keybindings dialog

    Keybindings dialog

    Waiting for merge of: https://github.com/mbrlabs/Lorien/pull/168

    https://user-images.githubusercontent.com/542105/175877964-9c17bc2a-0850-410d-8468-9e64cb0b957b.mp4

    Key rebinding dialog is ready and functional for use with keystrokes.

    Here a shortlist of the most important changes:

    • Added a new dialog for keybindings
    • Added a ACTION_* translation strings to the i18n for actions
      • These could maybe be used to remove some duplication in the i18n files themselves in the future (lots of "Line tool" repetitions in that file)
    • Added a bunch of more extends Reference to various classes, because certain files actually yield transient results now, making it necessary to enable them for garbage collection.

    TODO

    Actually discovered while writing this PR text...

    • [x] Collect all added messages and convert them to i18n-strings.

    Future work

    • Persisting keybindings. That feature is hinging on #159 . I will create a PR with that one merged to integrate them all.
  • UI scaling for high resolution screens

    UI scaling for high resolution screens

    Some users on Reddit reported that on high resolution screens the UI is very small (the UI is designed around 1920x1080 right now). I think the best way to handle this is to autodetect the resolution and set the ui scale appropriately. But i would also add an option to manually set the scale in the settings.

  • Keybindings persistence

    Keybindings persistence

    Requires #169 and #159 to be merged first.

    https://user-images.githubusercontent.com/542105/176624429-7285d72c-5e66-4af7-9298-e34102bfcd68.mp4

    Changes:

    • I refactored PR #159 of @HuntClauss a bit. Simplified it and gave it some "forwards compatibility" that might otherwise be annoying to user (see code comment).
    • Added store_shortcuts() function to Settings which is called to persist keybindings
  • Idea: better color picker

    Idea: better color picker

    Feature/enhancement description: Currently, our color picker is great, but not good for quickly changing commonly used colors: image

    Inkscape has an amazing color picker and I think Lorien could really benefit from implementing something like this: image

    While it's not necessary to do it exactly like that, the colors themselves and the idea of putting commonly used colors somewhere easy to access is a really great thing to have.

  • Remember last session/canvas

    Remember last session/canvas

    Hey! First off, love the tool. I had switched to linux as my daily driver and I've been missing an app like this that looks nice and feels good to use. Coming from Windows, there is a program called Milton which is similar in a few ways. That said... Feature/enhancement description: I think it would be useful for Lorien to remember the last session(s) the user had open. This removes the need for a "save" nag screen and, in my opinion, helps the simplicity and non-intrusiveness aspect of Lorien.

    I can think of two ways to implement this off the top of my head:

    1. Have a default session/file that is saved in the user:// directory. This could be most useful for people like me who like to sketch on a single canvas and don't use different files much.
    2. Save every unsaved session into user:// or the custom directory set in the settings on quit, perhaps with a setting to turn it on or off. This would eliminate the "save on quit" dialog entirely, potentially at the cost of higher load if the user has a number of canvases open.

    I was going to fork this and implement it in the near future anyway and wondered if this is something you'd like to have in the base repo. Let me know what you think!

  • Player can stand on erase paths

    Player can stand on erase paths

    Lorien version:

    Latest commit on player branch

    OS/device including version:

    Operating System: Arch Linux KDE Plasma Version: 5.22.4 KDE Frameworks Version: 5.84.0 Qt Version: 5.15.2 Kernel Version: 5.13.8-arch1-1 (64-bit) Graphics Platform: X11 Processors: 8 × Intel® Core™ i5-8265U CPU @ 1.60GHz Memory: 15.5 GiB of RAM Graphics Processor: Mesa Intel® UHD Graphics 620

    Issue description:

    When the player is spawned, they have collision with both draw and erase paths, which looks unnatural.

    https://user-images.githubusercontent.com/8162008/128640511-671b0e0a-6dec-4535-a2bf-1e1aa070c524.mp4

    Steps to reproduce: Draw with the eraser. Spawn player and move them to where you have drawn with the eraser.

  • Lorien Crash when scaling window

    Lorien Crash when scaling window

    Lorien version: Lorien v0.3.0-dev

    Tested on Code from Commit: 09cea891b17858190b4ea3167ceede59d7c781c9

    OS/device including version: Windows 10 x64 | v10.0.19042 Build 19042

    Issue description: Lorien Crashes When scaling window as small as possible Screenshot (93)

    ERROR: get: FATAL: Index p_index = 1 is out of bounds (size() = 1). At: ./core/cowdata.h:156

    Steps to reproduce: Scale the window as small as it can go. It will hang for a few seconds then crash

  • primitive config with custom shortcuts

    primitive config with custom shortcuts

    This is just a simple/primitive implementation of custom shortcuts. For now, editing shortcuts can be made only via settings.cfg file.

    There is problem with some combination of shortucts (like Control+[key] and Control+Shift+[key]), because godot don't check other shortcuts if overlap. I found this about possible solution.

    (I know almost nothing about godot so I am really sorry if I did something wrong.)

  • Performance-optimized Circle Tool

    Performance-optimized Circle Tool

    The template I used to write the CircleTool.gd class was the RecangleTool.gd class. Because of this, the code is written in a similar way. I hope it helps (;

    Features:

    • Well-looking, though not expansive circles (empty, outlines only)
    • UI tool toggle control (created in the same manner as other tools')
    • Number of points on the circle is configurable through CircleTool.gd class
    • While the circle remains in motion (user hasn't released LMB yet), the circle is drawn using a far limited number of points, in order to increase performance (which also gives quite a good looking effect of a "polygonized-circle")
    • Once settled, the final number of points is set and saved

    One last thing to do, to make the tool release-ready, is to create a shortcut (C) for the tool

    Future plans:

    • If I am requested to, I'd more than happily try to implement these features:
      • Changing color of selected strokes to the chosen one
      • UI for the Circle tool, giving additional the user additional control over the number of circle's points in motion and settled states
      • Making an eraser tool, that actually erases points ((:

    Regards! Hiderr

  • The brush size is not equal to other tools size

    The brush size is not equal to other tools size

    Lorien version: Lorien 0.5.0 Linux

    OS/device including version: OS: Linux Ubuntu 18.04.6 GPU: NVIDIA GeForce 920MX GPU Driver: NVIDIA Driver metapackage from nvidia-driver-470 (proprietary, tested) installed from the "Software & Updates" of Ubuntu

    Issue description: Hello, i'm using Linux Ubuntu 18.04.6 and i downloaded Lorien 0.5.0 from github excuse me ,first of all, scale ui is not appropriate in auto mode that fix after changes to custom and 1. but The brush size is not equal to other tools size, that's meaning with equal size The brush size is Thicker than other tools size.

    and when i insert a Rectangle the vertex from which the Rectangle is drawn, seem's hasn't anti-aliasing.

    please pay attention to this video.

    Steps to reproduce:

    1. Set brush size for Drawing
    2. Draw with the brush tool
    3. Draw with other tools when the brush size hasn't changed
  • SelectionTool: fix missing cursor on initial usage

    SelectionTool: fix missing cursor on initial usage

    Fixes missing on-canvas cursor when switching to SelectionTool for the first time.

    Fixes bug introduced by: bc83fbe6691c (Reset state of tool being switched (#155))

  • Arrows and dashed lines

    Arrows and dashed lines

    I've been watching through a mathematics course where the professor makes use of Xournal++ to do his live lectures. eg https://www.youtube.com/watch?v=Z1OP5SKNhsw&t=1484s

    The most used features not in Lorien are a tool to drag out a straight line with an arrowhead at the end, and a mode to give you dashed lines.

    With these it would be possible to do the entire lecture series.

    image

  • Pressure (thickness) of lines and rectangles too thin and not configurable

    Pressure (thickness) of lines and rectangles too thin and not configurable

    There's a const PRESSURE := 0.5 hardcoded in the RectangleTool and CircleTool, and this value itself is hardcoded as an immediate value (as 0.5) in the LineTool

    This gives a default thickness for lines that is far too low in my opinion when you're mixing lines and painted drawings just to do straighter lines.

  • --no-save option

    --no-save option

    Feature/enhancement description: I think a simple feature that can be quite useful would be a --no-save option. To start Lorien, scribble something and then close it again, without getting asked if i want to save it.

    Maybe this could be implemented together with the option of autosaves as described in #174.

  • Moved strokes stay in their original positions after exporting

    Moved strokes stay in their original positions after exporting

    Lorien version: Tried both on 0.5.0 and b5aee8c

    OS/device including version: Both Windows 10 (0.5.0 and b5aee8c) and Linux (just 0.5.0, haven't checked b5aee8c)

    Issue description: Using the selection tool on strokes to move them does not move them relative to other strokes upon svg export, they move only in the application. I am not sure if this is intended behavior or a bug, it does not really seem like sensible behavior to me. If there is any information I missed, I will try to provide it.

    Steps to reproduce:

    1. Draw 2 strokes.
    2. Note their relative positions
    3. Move one of them with the selection tool.
    4. Export as svg.
    5. Notice that the move tool had no effect on the exported project, the moved stroke is still in its initial position relative to the other one.
The Go App Boot Framework

The Go App Boot Framework good is a http framework that makes developers write go applications much easier. Download and Install go get -u github.com/

Jan 11, 2022
ncurses matrix/log app written in go to visualize chess problems.

dorrella/matrix-curses Matrix using ncurses and gbin/goncurses. Visual matrix based puzzles Install need libncurses-dev. Probably hard to run on windo

Jan 12, 2022
small go-based app for note taking

Description A small note taking web-app which I am building for myself just for fun and learning purposes. My goal is too use as much of the standard

Oct 8, 2022
The open source, end-to-end computer vision platform. Label, build, train, tune, deploy and automate in a unified platform that runs on any cloud and on-premises.
The open source, end-to-end computer vision platform. Label, build, train, tune, deploy and automate in a unified platform that runs on any cloud and on-premises.

End-to-end computer vision platform Label, build, train, tune, deploy and automate in a unified platform that runs on any cloud and on-premises. onepa

Dec 12, 2022
Go types, funcs, and utilities for working with cards, decks, and evaluating poker hands (Holdem, Omaha, Stud, more)

cardrank.io/cardrank Package cardrank.io/cardrank provides a library of types, funcs, and utilities for working with playing cards, decks, and evaluat

Dec 25, 2022
Genetic Algorithm and Particle Swarm Optimization

evoli Genetic Algorithm and Particle Swarm Optimization written in Go Example Problem Given f(x,y) = cos(x^2 * y^2) * 1/(x^2 * y^2 + 1) Find (x,y) suc

Dec 22, 2022
k-modes and k-prototypes clustering algorithms implementation in Go

go-cluster GO implementation of clustering algorithms: k-modes and k-prototypes. K-modes algorithm is very similar to well-known clustering algorithm

Nov 29, 2022
Probability distributions and associated methods in Go

godist godist provides some Go implementations of useful continuous and discrete probability distributions, as well as some handy methods for working

Sep 27, 2022
On-line Machine Learning in Go (and so much more)

goml Golang Machine Learning, On The Wire goml is a machine learning library written entirely in Golang which lets the average developer include machi

Jan 5, 2023
Bayesian text classifier with flexible tokenizers and storage backends for Go

Shield is a bayesian text classifier with flexible tokenizer and backend store support Currently implemented: Redis backend English tokenizer Example

Nov 25, 2022
Training materials and labs for a "Getting Started" level course on COBOL

COBOL Programming Course This project is a set of training materials and labs for COBOL on z/OS. The following books are available within this reposit

Dec 30, 2022
A curated list of Awesome Go performance libraries and tools

Awesome Go performance Collection of the Awesome™ Go libraries, tools, project around performance. Contents Algorithm Assembly Benchmarks Compiling Co

Jan 3, 2023
Deploy, manage, and scale machine learning models in production
Deploy, manage, and scale machine learning models in production

Deploy, manage, and scale machine learning models in production. Cortex is a cloud native model serving platform for machine learning engineering teams.

Dec 30, 2022
The Go kernel for Jupyter notebooks and nteract.
The Go kernel for Jupyter notebooks and nteract.

gophernotes - Use Go in Jupyter notebooks and nteract gophernotes is a Go kernel for Jupyter notebooks and nteract. It lets you use Go interactively i

Dec 30, 2022
Library for multi-armed bandit selection strategies, including efficient deterministic implementations of Thompson sampling and epsilon-greedy.
Library for multi-armed bandit selection strategies, including efficient deterministic implementations of Thompson sampling and epsilon-greedy.

Mab Multi-Armed Bandits Go Library Description Installation Usage Creating a bandit and selecting arms Numerical integration with numint Documentation

Jan 2, 2023
A program that generates a folder structure with challenges and projects for mastering a programming language.

Challenge Generator A program that generates a folder structure with challenges and projects for mastering a programming language. Explore the docs »

Aug 31, 2022
Gota: DataFrames and data wrangling in Go (Golang)

Gota: DataFrames, Series and Data Wrangling for Go This is an implementation of DataFrames, Series and data wrangling methods for the Go programming l

Jan 5, 2023
An open source embedding vector similarity search engine powered by Faiss, NMSLIB and Annoy
An open source embedding vector similarity search engine powered by Faiss, NMSLIB and Annoy

Click to take a quick look at our demos! Image search Chatbots Chemical structure search Milvus is an open-source vector database built to power AI ap

Jan 7, 2023
Open-source software engineering competency and career plans.

Software Engineering Competency Matrix This repository contains an "Open Competency Matrix" for Software Engineers. It includes a standard data struct

Oct 4, 2022