Awesome Open Source
Awesome Open Source


Join the chat at Build Status

An intuitive outliner for personal knowledge and task management.

Update 2021: I recommend moving to Logseq, because it has a better performance with many notes, and the concept of having a network instead of a tree is easier to organize.



It's freedom

This program is free and open source. Therefore, you can trust it. Your data stays on your computer.

It's science

Half a year of research flowed into the development. I developed this application in my bachelor thesis in the year 2015, graded A+ and written at the University of Oldenburg. Have a look at it: German PDF file.

It's mighty

The author has used many time management programs over the last four years. When the number of tasks grew, a neat system like Getting Things Done became essential. Therefore the development of TreeNote was influenced by powerful tools like Omnifocus (Mac only) and Org mode (too complex). However, TreeNote is as intuitive to use as the light tools Wunderlist and Evernote.

When starting TreeNote for the first time, you will see a detailed manual which guides you through the features. The user interface and the manual are supplied in German and English.

You find a complete list of features in the wiki.

Project status & Warning (December 2018)

Me and couple of friends are using TreeNote on a daily basis since years. It is a central and valuable piece for our self-management. TreeNote is well tested and bug-free, apart from this one:

When you have searched or filtered the tree you must not edit the tree's structure. If you do, TreeNote may crash and your tree may become corrupted (you cannot open it anymore). Editing of a single entry (text, color, date) is okay.

It is a good thing to enable daily backups in the settings.

I would like to do a complete rewrite of TreeNote in Scala. It shall be more robust, faster and collaboratively editable (while of course running offline and privacy-friendly). Therefore I won't develop TreeNote any further.

Alternatives to TreeNote are the collaborative online outliners Dynalist, Workflowy and They have desktop apps, too.



  • Linux: TreeNote requieres an installation of the programming language Python 3 and the GUI framework PyQt5, before it can be run from source. It is installed as follows:
    • Arch Linux: Search in the AUR for 'treenote' with e.g. Pamac or enter yaourt -S treenote-git in a Terminal.
    • Debian and Ubuntu: Enter sudo apt-get install python3-pip, then sudo pip3 install sip pyqt5 treenote in a Terminal.
    • Fedora: Enter sudo yum install python3-pip, then sudo pip3 install pyqt5 treenote in a Terminal.
    • Other Linux distros: Enter sudo pip3 install pyqt5 treenote in a Terminal.
  • Windows: Download and extract the archive, then doubleclick the treenote.exe file inside.
  • Mac OS X: Download

For upgrading a version on Linux, run sudo pip3 install pyqt5 treenote --upgrade.

Roadmap (not to be done by me)

  • Collaborative editing through connection to my master thesis outliner webapp
  • Auto-update for Windows and Mac, packages for more Linux distros
  • Drag'n'Drop
  • Insert images
  • Insert mails, open them in the email client again
  • When the user deletes an item: Move it to an archive instead of permanently deleting it


Apart from the listed huge changes new versions often contain small improvements and bugfixes, look in the detailed Git log if you are interested.

Git Version (February, 2018)

  • Added a red label which appears and annoys you, if you have reminders (entries with a start date in the past).

Version 1.7.8 (February 16, 2017)

  • New PyQt version finally fixes graphical glitches and crashes when using W and S (move item up or down)

Version 1.7.7 (February 7, 2017)

  • Test for write permission when selecting a filename for saving

Version 1.7.6 (February 5, 2017)

  • I adjusted the code for the Linux packages, so this version can't read .treenote files from older versions. Export your tree with the old version and import it again with the new version.
  • Fixed a PyQt bug causing W and S (move item up or down) not to work anymore

Version 1.7 (January 3, 2017)

  • It was necessary to remove the automatic update check. A future release will contain automatic update installation. Please register for my newsletter until then.
  • New feature: Link to files
  • The manual is complete now
  • The user interface and the manual is available in English and German now
  • Bug fixes

Version 1.6 (October 6, 2016)

  • New filter date<1d gives all items whose date is at most tomorrow
  • Bookmarks with children get highlighted (every 3 hours)
  • Pasted plain text trees get recognized, whatever indention they have (spaces, tabs)
  • Many more bug fixes

Version 1.5 (September 11, 2016)

  • Specify backup folder
  • Focus in plan tab focuses in tree tab
  • The menu has accelerator keys now
  • Fixed 'Backups don't work on windows'
  • Fixed 'Expanded state is not saved when expanding a row with the mouse'

Version 1.4 (August 30, 2016)

  • This version can't read .treenote files from older versions, so export your tree with the old version and import it again with the new version.
  • Bookmarks: Save optionally current root item
  • Copy, paste, cut
  • Print function
  • Added a path bar
  • Internal links
  • File selected rows
  • Planning view
  • Increase estimate shortcut
  • Set estimate in minutes with shortcuts like 10 30 60 120
  • Shortcuts like '5d' to set start date to in 5 days
  • Fix: Autocomplete with all tags of the tree when focused, not just with current focused tag subset
  • Fix: When coloring multiple rows, the selection was not kept
  • Fix: Vertical move out of the view now scrolls to the selection
  • Fix: New line inside a row at the bottom edge shall scroll the tree upwards, otherwise the just entered new line is not in the visible part of the view

Version 1.3 (July 13, 2016)

  • Fullscreen mode
  • User interface: Collapse filter widgets
  • List tags of visible items only
  • Huge performance improvements
  • Import from the mac todo application 'The Hit List'

Version 1.2 (June 20, 2016)

  • You can set indentation size in the settings
  • Clearer opened / closed icons
  • Fixed error in update dialog
  • No extra column for the checkboxes
  • Export all databases which have changes to the folder 'backups' each .... minutes
  • Removed CouchDB dependency and with that the feature to add several databases. You now have a single local JSON tree only and can't edit databases collaberatively anymore. However, editing is blazingly fast now and without bugs or crashes. I liked the feature of collaberatively editing and want to implement it sometime with a better database backend.

Version 1.1 (Feb 14, 2016)

  • Automatic update check
  • Copy a selection of the tree to the clipboard in plain text
  • Paste a plain text list or tree from the clipboard into the tree
  • Export the database to a plain text file
  • Long texts inside an entry are automatically wrapped. While editing an entry, press alt + enter for a line break.
  • Change font*size and padding (in the menu)
  • Hide the sidebars (with a button)
  • Go up / Open parent row (in the menu)
  • Fixed styling bugs on windows
  • Many small improvements and bugfixes (more details in the Git log)

Version 1.0 (June 23, 2015)

  • Initial release after a half year of intensive development during my bachelor thesis


TreeNote is written in the most beautiful programming language available: Python. It pays off to learn it. So start with one of these great books.


TreeNote uses the GUI library PyQt, which is a Python wrapper for the popular Qt library. Qt has a really good documentation. If you want to know what a particular class is able to to, just google it, e.g. ‘qtreeview 5’ (the 5 is for Qt version 5) and it will give you

If you don’t know how to do something:

The QTreeView interacts with the underlying data structure through the class TreeModel, a subclass of the QAbstractItemModel. The overwritten methods can be divided into two categories:

  1. When the views needs data to build or change itself, it calls the following methods:

    • Each QModelIndex contains a pointer to a Tree_item. It can be retrieved with getItem(index).
    • index(row, parent_index) and parent(index) return a specific QModelIndex
    • rowCount(index) returns not just the row count of the Tree_item to the given index, but calls Tree_item : init_childs to get the children from the database and insert them as new Tree_item objects into the local data instance.
  2. When the user does an action, methods like insertRows(), removeRows(), move_left() and setData() are called. They edit the underlying data model.


Filtering is done with the QSortFilterProxyModel very easily. It is inserted between the regular model and the view and passes through only the desired items, for example the ones which match to a search string.


  1. Create / update the translation files in resources/locales/ from the current code by executing pylupdate5
  2. Doubleclick these .ts files to translate them with Qt Linguist
  3. Compile the .ts files by executing lrelease resources/locales/*.ts. This creates .qm files which are used by application.
  4. Check the translation by running TreeNote with export LANGUAGE=de_DE then python3

Deployment (creating executable files)

Set up the deployment environment

  • Linux and Windows: Install PyInstaller by entering pip3 install pyinstaller in cmd.exe / terminal
  • Mac OS X: PyInstaller does not work with the pip version of PyQt yet, so we have to do the following:
    • Download the latest dev version of PyInstaller, e.g. with git clone

    • Install Xcode from the AppStore

    • Install Qt

    • Download the SIP source package. Unarchive it and run:

        >     python3
        >     make
        >     sudo make install
    • Download the PyQt source package. Unarchive it and run (takes several minutes):

        >     python3 --qmake=/Users/YourUsername/Qt/5.7/clang_64/bin/qmake 
        >     make
        >     sudo make install        


  1. Increase the 1.x version number in For bugfixes increase 1.11.x only.
  2. Create binaries with PyInstaller:
    • Create binaries
      • Windows
        • Execute in cmd.exe: pyinstaller --path=C:\Users\YourUsername\AppData\Local\Programs\Python\Python35\Lib\site-packages\PyQt5\Qt\bin --noconsole --icon=treenote\resources\images\treenote.ico (the --path option is needed until this bug is fixed)
        • Copy the resources folder into the new treenote folder
      • Mac OS X
        • Execute in Terminal: python3 /path/to/ --noconsole --icon=treenote/resources/images/treenote.icns
        • Right-click on and choose “Show Package Contents”. Copy the resources folder to ''
    • Zip the new TreeNote folder / the and name it e.g.
    • Test the release by running the binary
  3. Create a GitHub release, add a changelog and upload the .zip files
  4. Update the download links and the changelog on the download site
  5. Create a pip release:
  6. For major versions: Write a mail to interested people

Creating an Python package

  • Create a package with python bdist_wheel
  • Install the new package with pip3 install dist/TreeNote-1.7.0-py3-none-any.whl for testing
  • Upload it with twine upload dist/*
  • Full guide

Creating an Arch Linux package

makepkg --printsrcinfo > .SRCINFO


Install and run

  1. Install the dependencies


    • Enter in Terminal:
      sudo apt-get install git python3-pip
      sudo apt-get purge appmenu-qt5
      sudo pip3 install pyqt5


    • Enter in Terminal:
      sudo yum install git python3-pip
      sudo pip3 install pyqt5


    • Install Git
    • Install Python 3. During installation check the checkbox 'Add to path'.
    • Install Python modules by entering pip install pyqt5 in cmd.exe

    OS X

    • Install Python 3.
    • Install Python modules by entering pip3 install pyqt5 in Terminal

  2. Clone the Git repo by opening a command line and entering git clone

  3. Navigate into the code folder with cd TreeNote/treenote

  4. Run with python3

  • To update the code to the latest changes, run git pull inside the TreeNote folder
  • For developing, I recommend the IDE PyCharm.
    • Set 120 code width
    • You may want to disable warnings (then you can recognize in the scrollbar the lines you edit)
  • To share your code changes, I recommend the Git GUI GitKraken

Style conventions

  • Only methods overriding Qt methods inherit Qts camelCase naming scheme, everything else is Pythons snake_case naming scheme. Even slots.

  • Use docstrings:

    def function(a, b):
        """Do something and return a list."""
    class SampleClass(object):
        """Summary of class here.
        Longer class information.
        Longer class information.
  • The layout of a class should be like this:

    • docstring
    • __magic__ methods
    • other methods
    • overrides of Qt methods

Android app

This app was created by me and a fellow student at university. It is working nice, but I don't like its progamming language (Java is so cumbersome compared to Python). Therefore I will not develop it any further. If you want to pick it up, I can explain you some code, but in general it should be written cleanly.

Demo-Video (in german)

Download the .apk file. If you have a Google Play Developer Account, feel free to publish the app.

Synchronisation with a JSON file in your OwnCloud is possible. However, Desktop TreeNote is not able to synchronize with a JSON file.

The code and images are in this repo.

Contributors and participation

Get A Weekly Email With Trending Projects For These Topics
No Spam. Unsubscribe easily at any time.
Python (1,140,957
Linux (16,539
Windows (9,721
Macos (8,852
Qt (2,801
Pyqt (260
Related Projects