Giter VIP home page Giter VIP logo

tasks.md's Introduction

logo Tasks.md

A self-hosted, Markdown file based task management board.

Demo

โญ Features

  • Create cards, lanes and tags in a modern and responsive interface;
  • Write cards as Markdown files;
  • Easy to install with a single Docker image;
  • Light and dark themes synced with operating system settings;
  • Heavily customizable with 3 default color themes (Adwaita, Nord and Catppuccin);
  • Support for subpath based reverse-proxy with an environment variable for base path;
  • Can be installed as PWA.

๐Ÿ‹ Installation

Docker

Paste this command:

docker run -d \
  --name tasks.md \
  -e PUID=1000 \
  -e PGID=1000 \
  -e TITLE="" \
  -e BASE_PATH="" \
  -e LOCAL_IMAGES_CLEANUP_INTERVAL=1440 \
  -p 8080:8080 \
  -v /path/to/tasks/:/tasks/ \
  -v /path/to/config/:/config/ \
  --restart unless-stopped \
  baldissaramatheus/tasks.md

Remove the environment variables you don't want to keep (all of them are optional, PUID and PGID are recommended), replace /path/to/something with directories that exist in your filesystem and then execute it. The environment variables are the following:

  • PUID and PGID: User ID and group ID that owns the files and directories. On linux distros you can find your user's UID and GID running id in the terminal, but it's usually 1000 for both variables. If no value is assigned for those variables, docker will create all the files and directories as root. You can read more about it here.
  • TITLE: A given name that shows below the header and in the browser tab;
  • BASE_PATH: Base path in the url. Use this variable if you are going to run the app under a subpath based reverse-proxy;
  • LOCAL_IMAGES_CLEANUP_INTERVAL: After a given interval the app will remove all local images that aren't present in any task. This variable control the duration in minutes of this interval. The default value is 1440 (exactly 24h). Set it as 0 to disable it.

docker-compose

version: "3"
services:
  tasks.md:
    image: baldissaramatheus/tasks.md
    container_name: tasks.md
    environment:
      - PUID=1000
      - PGID=1000
    volumes:
      - /path/to/tasks:/tasks
      - /path/to/config:/config
    restart: unless-stopped
    ports:
      - 8080:8080

Use the Docker section above as reference for setting up variables and volumes.

Source code

Open a terminal instance in the frontend directory and another one in the backend directory, then in both of them run npm install and npm start.

๐ŸŽจ Customize

All CSS files are available in the stylesheets directory under the config volume, any custom style is recommended to be added to custom.css file. It already comes with 3 color themes: Adwaita, Nord and Catppuccin. To use them, change the first line of /stylesheets/custom.css to the path of the color theme you want, then hard-reload the browser (Ctr+F5). You can find the built-in themes under /stylesheets/color-themes.

๐Ÿ“ Files structure

The way directories and files are organized in Tasks.md is quite simple. Every lane you add within the app is a directory in your filesystem and every task is file.

So if your tasks look like this:

Screenshot of the app. There are 3 lanes, Backlog, Sprint and Done. Within Done there is one file named "Something something"

Your files should look like this:

Screenshot of a file explorer showing 3 folders: Backlog, Sprint and Done Screenshot of file explorer within a folder called "Done", containing one file named "Something something"

More details (and it how it looks within Obsidian) can be found here.

๐Ÿ’ป Technology stack

With the goal of having a good mix of performance and maintainability, the application was built with SolidJS and Koa. It also uses Stacks-Editor for text editing and serve-static to serve the css files as-is.

๐Ÿ”จ Contribute

Bugfixes and new features requests

Feel free to create issues for encountered bugs or to request new features, just make sure to include a proper label. Also give a thumbs up to the issues you feel that are relevant to be implemented for the next releases.

Development

If you want to contribute to its development, select one of the existing issues, develop your solution and submit a pull request, it will eventually be reviewed and may be merged with the existing code. If you're not confident about your solution, discuss your ideas in a related issue or publish a draft pull request.

tasks.md's People

Contributors

azzamsa avatar baldissaramatheus avatar boomam avatar danielpantle avatar getoutofmybakery avatar mms-gianni avatar stumpylog avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

tasks.md's Issues

Raspberry Pi 4 Support (docker)

WARNING: The requested image's platform (linux/amd64) does not match the detected host platform (linux/arm64/v8) and no specific platform was requested

docker logs --follow tasks.md

exec /bin/sh: exec format error

Lane sorting for scrum/kanban

I want to use it as Kanban-/Scrumboard but lanes are sorted alphabetically and not logically.

I haven't a good idea of how to implement this yet. Maybe a separate (plain or json) configuration file for meta informations for lanes. Docusaurus includes it into the "md" file as a header https://docusaurus.io/docs/create-doc

image

[Enhancement] Add favicon

I love this app and use it frequently, but looks a bit bland in my bookmark menu without a favicon. Any chance one is planned on being added in a future release? Fwiw the pen emoji would be a-ok.

Lanes (or tasks) get resorted in new sessions

Issue

Lanes do not maintain their order across "sessions". Given there is no login I assume there is some session/cache related data that maintains the order of the page on refreshes. However open the tasks in a new browser, private tab, etc and you have the lanes sorted by what looks to be Alphabetically.

Initial sorting
image

Private Tab or different browser
image

This is also true for tasks in a lane even if filtering manually

image

New 'Session'
image

Seems that for a project there needs to be some form of persistence of organization. Maybe some kind of local file in the project folder that is read for ordering and potentially future settings, maybe a .json file? I generally have lanes like your example, Todo, Doing, Completed and in different sessions (laptop vs desktop, etc) It will be Completed, Doing, Todo.

Steps to Reproduce

Create lanes or tasks and organize non alphabetically, load the tasks page in a private tab, new browser or machine and it will be sorted alphabetically.

Other

Thanks again for this project. A couple little quirks and features and I think that this would be a valuable service.

The task file format

It would be an interesting insight to find the file structure the app uses. If its file based then I may think of a way to sync it with Obsidian or any other markdown app.

Maybe just adding an example file with a few tasks would help to see the basic structure?

Remove !important declaration to css files

The way !important declaration is being used to multiple css selectors prevents users to fully customize the aplication styling, making them to style directly into index.css, which is discouraged because it can change every release. This change may be achieved by using css layers.

Tasks.md 2.0.0

The app needs a few changes that, in order to be implemented, the docker file needs to be modified. So in order to not break the app in the current state for docker users, I'm planning to release a 2.0 version. Also among those changes that is a new menu to manage tags, hurting a bit of the app's simplicity.

So this is the list of changes that I plan to implement for the new release:

  • Change docker volume /api to /config
  • Since sort file is not mapped to a volume, every new update in the docker container restarts its state. To fix that, the sort file should be moved to the new /config volume. I'm also considering turning it into a yaml file;
  • In .md files, turn tags into a an actual list (in the current version they are separed by comma);
  • Add support for tags with different colors (described in #4), that could be changed somewhere in the UI or through a yaml file.

Checkbox functionality

It would be great if you could enable checkboxes in the notes section of the tasks.
As you probably know the markdown syntax is this:
- [ ]

It would look like this:

  • Subtask 1
  • Subtask 2
  • Subtask 3

Drag and drop not working on mobile devices

Description
Right now it's not possible to drag and drop cards or lanes on mobile devices, when trying to grab a card or lane it won't do anything.

Version
1.0.6

Steps to Reproduce
Open the application on any touch device, hold your finger over a card or lane until your device does a quickly vibration, try to move it around

Delete all cards from specific lane

Description
When a lane has too many cards, it takes a lot of effort to delete all cards, since you have to do it for every single one of them. It would be good to have an option in the lane options to delete all cards within it.

Version
1.5.0

All tasks missing

It seems that a couple of days ago, Tasks was updated to 2.0 and now all of the sudden all of my tasks are missing but still present in the Docker container.

I noticed a new file structure from issue #48 and what is now present on the readme.
https://github.com/BaldissaraMatheus/Tasks.md?tab=readme-ov-file#docker-compose

My docker compose file:

version: "3.3"
services:
  tasks.md:
    container_name: tasks.md
    environment:
      - PUID=1000
      - PGID=1000
      - TITLE=Tasks
    ports:
      - 8080:8080
    volumes:
      - ~/tasks/files:/tasks
      - ~/tasks/config:/config/
    restart: unless-stopped
    image: baldissaramatheus/tasks.md
networks: {}

I can see these files still present on my local Machine.

:~/tasks/files$ ls
 Backlog   Blocked   Doing   Done  'Up Next'  'Wont Do'

But seem to not be present on the Docker Container itself.

/tasks # ls
/tasks #

Am I doing something wrong?
Since the files are still present locally, should I just recreate my tasks under the new 2.x?

FWIW, I do not see a directory under ~/tasks/config yet but that might be because I haven't created anything since I saw it had nothing there anymore.

Idea: Link to open a specific note on fullscreen

Greetings!

Trying out the project and, so far, looks really good. it ticks almost (if not all) the boxes for what I was looking for (still testing / migrating a stuff).
One idea I had is : being able to generate/copy a link to a particular note, for example : localhost:8080/my-note-id-1 (could be the uuid you have atm).
Seems a usefull thing to have, for scenarios where one person could want to bookmark a very important note, or even create an event in the calendar with the link for the note/board.

failed to Lchown "/api/node_modules/statuses/HISTORY.md"

Hi,

Getting a strange error. I run other docker images on the same server with no issue, and have tried tweaking the environmental variables but no dice.

docker: failed to register layer: Error processing tar file(exit status 1): failed to Lchown "/api/node_modules/statuses/HISTORY.md" for UID 1516583083, GID 0 (try increasing the number of subordinate IDs in /etc/subuid and /etc/subgid): lchown /api/node_modules/statuses/HISTORY.md: invalid argument.
See 'docker run --help'.

Using:

docker run -d \
  --name tasks.md \
  -p 7070:8080 \
  -v /opt/tasks/cards/:/api/files/ \
  --restart unless-stopped \
  baldissaramatheus/tasks.md

Thanks!

Add option to rename card when it's expanded

Description
Right now it's only possible to rename cards in the dashboard. It would be nice if it was also possible to rename it directly in the card title when it's expanded

Version
1.5.0

cards not saving when certain characters are in the title

I have noticed that once you use certain characters in the title of a card (like # \ ), it accepts the new name, and it is renamed in the file system. But all further modifications like editing content, renaming, moving lanes or deletion are not saved. It requires manual intervention to rename/remove those files to clean them up.

Perhaps a check and error message on the existence of those characters (and other characters disallowed in most filesystems) when renaming a card is a simple solution.

Thank you for your work. This tool makes my (work)life a lot easier.

Problems when swiping cards in google chrome-derived browsers in mobile version

It would be possible to open a little more the margins where the cards are located or add a selector to be able to slide and select between them. In the derivative versions of google chrome, Brave, Kiwi Browser, ... It is very complicated to slide the cards to select one and on the other hand in the browsers derived from firefox for android it works perfectly.

Not found issue

After starting the container via docker compose and accessing it via url all I get is a "not found" message on the site. Logs are empty and dont indicate what the issue could be.

[Idea] Using subpaths for new boards

First of all, congratulations on your work. I had a closer look into it.

Opening the task board with a random path string loads the board but it does not work.

Example: http://localhost:8080/randomString

This is strange but not a big issue. But this led me to this idea: it would be nice to have a new and clean board on any subpath to manage multiple boards for teams and/or projects

http://localhost:8080/team1
http://localhost:8080/team2
http://localhost:8080/projectX
http://localhost:8080/projectY

PS: I was not able the set labels for this issue.
PPS: Why did you use nginx to run the application and not node itself?

Tasks saved in md keeps getting updated to rich text and that messes up the md file

I think this is potentially a very critical bug, as any task saved in markdown format is lost permanently.

To recreate the issue -

  • Create a new lane and add new task.

  • Switch to the markdown format

  • Add a bunch of text in markdown

  • Result-1 - The correct markdown file is saved

  • Re-open the task in browser window.

  • Defaults back to rich text mode, and this messes up the whole markdown text in the task details/description.

  • Once you switch back into markdown, you are left with formatting issues, which is not markdown anymore.

  • ISSUE: Only way to fix the text now is manually.

If possible, I recommend that the textbox always defaults to markdown, instead of richtext (given this is tasks.md afterall :) )

Sample

First attempt at creating a new task - Initial File

# Project Name

## Planning

* [ ] Add Ideas
* [ ] Groom backlog
* [ ] Track progress

When re-opening the same task

# Project Name

## Planning

* \[ \] Add Ideas
* \[ \] Groom backlog
* \[ \] Track progress

Once a task is re-opened in the browser, the md file is also auto-saved in the messed up format.

Publish a public demo

Description
It would be really useful to have a public demo for the app, so people can try it before putting any effort on installing it in their machines

Card Viewing

Suggestion

Currently cards when clicked on will automatically open to editor mode. This requires formatting like links and other markdown styles generally useless unless you select the preview icon.

One idea would be to cards will automatically open in "preview"/read only mode with a simple icon to change to edit mode. That way any additional views will be reader formatting and remove the various shortcuts for a clean look (similar to writing this right now in Github)

On Click example:

image

After entering edit
image

If there is no content it could be smart enough to enter edit mode automatically.

Only have access to .md files

I have added my markdown notes directory (.md) to Task.md. In this directory there are configuration files from other note applications and Task.md reads these files as if they were cards.

Could you do that by means of a configuration file to limit that only the files of the extension that I decide (.md, .txt,...) are those that are seen as cards?

Currently this leads to errors, because if I have 600 .md files and there are 50 .jpg files, 20 .json files, Task.md will tell me that there are 670 cards when in fact there are only 600.

Zoom out on mobile chrome

Right now there's a strange behavior where it's possible to zoom out the app, which makes some padding and background to appear

Card content in card

Currently, clicking on new card only gives an editable field for the title, and not the body. It would be nice to have

  • A 2-3 line editable body below the title (without an editor header if that is too cluttered)
  • When saved with a body, show the first couple of lines in the same space

This is somewhat similar to what Gitlab lanes do to quickly allow creating issues.

Great looking and simple, keep it up!

Navigation bar getting smaller when multiple Cards are in Lane

When having a lane a certain Problem occurs
after 10 Cards in any particular Lane, the top Navigation bar (the one used creating new lanes and searching) is getting slowly smaller with every card.

This also creates a scroll bar on the aformentioned NavBar

docker-compose AssertionError mount path

Used: https://github.com/BaldissaraMatheus/Tasks.md/blob/main/examples/docker-compose.yaml

node:assert:124
  throw new AssertionError(obj);
  ^
AssertionError [ERR_ASSERTION]: mount path must begin with "/"
    at mount (/api/node_modules/koa-mount/index.js:33:10)
    at Object.<anonymous> (/api/server.js:159:9)
    at Module._compile (node:internal/modules/cjs/loader:1254:14)
    at Module._extensions..js (node:internal/modules/cjs/loader:1308:10)
    at Module.load (node:internal/modules/cjs/loader:1117:32)
    at Module._load (node:internal/modules/cjs/loader:958:12)
    at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12)
    at node:internal/main/run_main_module:23:47 {
  generatedMessage: false,
  code: 'ERR_ASSERTION',
  actual: '"',
  expected: '/',
  operator: '=='
}
Node.js v18.14.2

This error message is indicating that there is a problem with the mount path used in the koa-mount module. The error message is indicating that the mount path provided to the mount function must begin with a forward slash (/), but the actual value provided does not meet this requirement.

BASE_PATH and TITLE env vars are not working

Description
Both env variables are not working, as they have no changes in the final image.

Version
1.3.0

Steps to Reproduce
Build the image passing any values to BASE_PATH variable and try opening the appliaction with the used base path, it will show the default application with an empty board and all the api requests will fail

Show some visual indication that a card is filled

Description
Right now the only way to know if a card as any description is opening it. So it would be nice to have some indication (maybe a chip?) just by looking at it in the board.

Version
1.1.0

Desktop Apps

This is great! Thank you.

Why not turn it into a Desktop app via Electron or a similar solution? Since it stores everything as plain text files a desktop app would be great because people could just download it and use it standalone (easier than docker + browser) and sync files between machines using some cloud service or Synching.

Search filter descriptions or Tags

Feature Request

I believe it would be a great enhancement to be able to not only search by the tasks title, but also the description. When you think of extensive descriptions, to be able to filter tasks for 'keywords' would be nice. I understand that tags could be used to help call out certain details of a tasks or at least be able to find all my "administrative" tasks or similar, however looks like tags don't even get looked at in search. At the very least Tag search filtering would be beneficial if not the whole description.

Thanks.

Delete confirmation prompt

Feature Request

It would be nice to have some kind of confirmation for deleting a task or lane. Currently a misclick could wipe out any number of tasks if a lane is deleted or a task itself.

Another idea could be some kind of trash can, maybe the flat file gets renamed so its parsed as deleted. Either push it to the bottom of the lane so its always active tasks and then deleted ones or something like that. If not just making sure a delete isn't so easily destructive.

Having some kind of status parsing design could be nice if there was ever a desire to mark a task complete rather than moving it to a lane, like a more traditional Todo, task app. Just a thought.

Appreciate the project and as soon as I saw it shared on /r/selfhosted I thought this was the simple project I was waiting for, just a couple quality of life improvements I could see which would make it perfect, for me of course :)

Thanks for this.

Set editor mode to Markdown as default

Since Markdown is the main aspect of the app, it would make sense for the editor to be in markdown mode as default, as many users are probably used to its syntax. It could also save the previously used mode in the local storage so they don't have to switch every time they open a new task.

This change was initially suggested in #70

Maximize markdown editor

The mobile version works perfectly, but on pc when you open the editor, there is a window in the center showing below the board of cards. Could you add next to the icon to close the Markdown editor another icon to maximize the editor window and cover the whole window?

Preview in Dark Mode not readable

Issue

When previewing the description of a task in dark mode it will be all white and unreadable

Preview NOT selected
image

Preview selected
image

Steps to Reproduce

Setting theme to dark mode, start writing a description and switch to preview mode.

Other

Thanks for this project.

Version 1.3

Seeing a "Not Found" page.

Hi,

Using docker-compose.yml:
version: '3.3'
services:
tasks.md:
container_name: tasks.md
image: baldissaramatheus/tasks.md
ports:
- 8383:8080
volumes:
- ./cards:/api/files
- ./styles:/usr/share/nginx/html/stylesheets
environment:
- TZ=America/Toronto
- PGID=1000
- PUID=1000
- TITLE="My tasks board"
- BASE_PATH=/tasks
restart: unless-stopped

Start-up only shows this:
Creating network "tasksmd_default" with the default driver
Creating tasks.md ... done
Attaching to tasks.md
tasks.md |

When I connect to http://host:8383 I see only "Not Found". It used to work, but I think it stopped about a day or so ago. Is there something else I can try?

Be able to change tag colors

Description
Right now all the tags have the same background color, it would be nice if each tag had a different color so they could be easily identified

Version
1.1.0

Sort by date

Could you add the option to sort by date of creation or edition? That would allow to place in the first cards were those that have been edited more recently.

It does not show any markdown files, if there is a subdirectory inside a column directory.

Each directory we create corresponds to a column, but if we create a subdirectory inside a directory that belongs to a column, it doesn't show any files.

Example:
If we have

  • /tasks/Input/markdown_1.md
  • /tasks/Input/note_2.md

In the input column it will show note_1 and note_2.

On the other hand if we create:

  • /tasks/input/note_1.md
  • /tasks/Input/note_2.md
  • /tasks/input/new_folder/

It will not show any files in the column.

I think ideally it should show all .md files within the path /tasks/input/ or in that case, all files in the path /tasks/input/ and subdirectories. Ideally, I think it would show the ones in the /tasks/input/ path and discard the ones in other subdirectories. Currently if there are subdirectories, it doesn't show any .md files.

Custom theme is not working

Hi, ๐Ÿ‘‹

I've tried changing this line to use a different custom theme and even tried random string, but nothing changes. Not even an error message. I also restarted the container after each change.

@import url(./color-themes/nord.css);

Am I missing something?

Thanks for Task.md ๐Ÿœ

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.