Introducing KanBoard - Your Personal Project Management Tool 🚀✨

Madza - May 11 '22 - - Dev Community

Whether it is web development, writing articles, or achieving personal goals, proper planning has always been crucial. That allows us to split the main task into smaller bits, track progress and set realistic deadlines for each.

I saw DEV x Appwrite hackathon being announced in the middle of April and knew this was a great opportunity to build my own self-hosted project management tool. This was how KanBoard was born.

Demo

In this article, we will go through the installation guide, features, and tech stack of my submission.

Submission Category: Web2 Wizards

Project is available on GitHub

GitHub logo madzadev / kanboard

📃 KanBoard - Your personal project management tool

Installation

In order to set up your own instance of KanBoard, you must first install Docker, set up Appwrite, create necessary data collections, clone the KanBoard repo, and configure environmental variables.

We will go through everything in more detail below:

1️⃣ To install Docker, check the official installation guidelines here.

2️⃣ Next, you have to install the Appwrite using the commands below, depending on the operating system you use:

  • Mac / Linux or Unix compatible:
docker run -it --rm \
    --volume /var/run/docker.sock:/var/run/docker.sock \
    --volume "$(pwd)"/appwrite:/usr/src/code/appwrite:rw \
    --entrypoint="install" \
    appwrite/appwrite:latest
Enter fullscreen mode Exit fullscreen mode
  • Windows (command prompt)
docker run -it --rm ^
    --volume //var/run/docker.sock:/var/run/docker.sock ^
    --volume "%cd%"/appwrite:/usr/src/code/appwrite:rw ^
    --entrypoint="install" ^
    appwrite/appwrite:latest
Enter fullscreen mode Exit fullscreen mode
  • Windows (powershell)
docker run -it --rm ,
    --volume /var/run/docker.sock:/var/run/docker.sock ,
    --volume ${pwd}/appwrite:/usr/src/code/appwrite:rw ,
    --entrypoint="install" ,
    appwrite/appwrite:latest
Enter fullscreen mode Exit fullscreen mode

3️⃣ Next, open Docker and run the Appwrite app. At this point, you should be able to access the Appwrite console through localhost. Create an account, log in and create a new project.

Project

4️⃣ To init your SDK and interact with Appwrite services, you need to add a Web platform to your project. To do that choose the project you created and click the 'Add Platform' button.

5️⃣ Create four database collections: Posts, Columns, Boards, and Activities.

Colections

Now set the attributes and indexes for each collection as below:

🔻 Posts attributes and indexes

Posts attr

Posts index

🔻 Columns attributes and indexes

Col atr

Col index

🔻 Boards attributes

Boards attr

🔻 Activities attributes

Act attr

6️⃣ Go into the settings for each collection and set the permission to role:member for both read and write access.

Permissions

7️⃣ Navigate to the Users panel and add a new user you will use to log in to your app and access KanBoard.

8️⃣ Clone the repo to your machine by running git clone https://github.com/madzadev/kanboard.git then change the working directory into it by cd kanboard and install the project packages by npm install.

9️⃣ Clone the env files with the command cp .env.example .env.local. In the newly created .env.local file fill out the keys from your Appwrite console. The first two are available in the Settings of the KanBan project. The other four can be found in the Settings of each Collection.

1️⃣0️⃣ Run the command npm run dev to start the app.

Authentication

Once you have set everything up and your app is running, you should be presented with the login screen on localhost:3000.

Auth

The user is asked to provide the email address and the password. Those should match the records you provided when creating the user in the Appwrite console in the installation step.

Stats

Once logged in, the user is presented with the stats page.

Stats

Those include total cards, columns, and boards created across the whole app.

The user also sees the last activities performed on the app, like created, edited and deleted cards, columns and boards. Activities are sorted by the most recent ones on the top and each one is given the time ago attribute to see when the action was performed.

There are also upcoming and previous tasks. Again, both types of tasks are being sorted by the most recent ones on the top with the time attribute when the task has been/is planned to be completed.

Action history

For more detailed action history, there is also an Activities page.

History

The activities are sorted across the columns. The first column lists all the added actions, the second one is for all the edit actions, and the third one displays all the boards, columns, and cards that have been recently deleted.

Each column is sorted by the most recent activities on top and each card in it includes the timestamp describing when the action was performed.

Calendar

All of the user tasks can also be viewed in the calendar view.

Calendar

The user is able to navigate between different months to see the past and future tasks. The current day on the calendar is highlighted and the user can access it from any month via the Today button.

If there are multiple tasks for the same day, the tasks will be displayed below each other.

Add/delete boards and columns

To start using the app, the user must create at least one board and column.

Add boards and columns

A new board can be added at any time. You need to provide the title of the board and the description of what the board is about.

After the creation, the user will be taken to the newly created board and all the info provided in the creation modal will be displayed in the board header.

A new column can be added at any time for any board. You need to provide the title of the column. It will be shown at the top of the column, with the number of included cards.

Delete boards and columns

The column can be deleted if there are no cards in it. The board can be deleted if there are no columns in it.

In both cases the warning modal will come up, to make sure the user really meant to delete the board/column.

Add new cards

A new card can be created when there is at least one board and one column inside it.

Add card

To create a card user clicks on the Add a card button on the top of the column, fills in the necessary information in the modal, and saves the card.

After that the page will refresh and pull the new data from the server, displaying your new card added to the column.

View/update/delete cards

Any card can be opened by clicking on it. The card will be opened on the modal with all the data fetched inside it. This is the read-only mode for viewing the card.

Edit card

In order to edit the card, the user must click on the edit icon on the top right corner of the card and the fields will become editable with the option to save the changes afterward.

Delete card

In order to delete the card, the user must click on the delete button on the top right corner of the card. This will bring up the delete warning message to make sure the user accepts the delete action.

Input validation

For each input field in the app, the input validation is provided.

Input validation

If the user tries to submit the empty value that is required, the warning message will be shown.

Move cards around

The user is allowed to move cards both vertically and horizontally.

Move cards

Moving cards vertically allows the user to change the order of cards in a particular column, while horizontal drag allows the user to swap cards between the different columns.

The drag and drop functionality comes with modern-looking effects to improve the UX and make your workflow feel more natural.

Vertical/horizontal scroll

If the cards are outside the viewport the scroll feature is available.

Scroll feature

If the cards in the column are outside the view, the vertical scrollbar on the right side of the list will appear.

If the columns themselves appear outside of the view, the horizontal scrollbar is provided under the column wrapper.

Search cards by title

Once you have created a larger amount of cards, the search functionality might come in handy.

Search

The user is able to search the cards by the card titles. The results are displayed in real-time, as the user types in the search query.

Logout

Once you are done, the user can log out.

Logout

This will take the user back to the login screen.

Tech stack I used

NextJS - React application framework

Appwrite - open-source end-to-end backend server

react-beautiful-dnd - for drag and drop functionality

react-hook-form - to track input states and provide validation

modal-dialog - to provide modal dialogs for user interaction

fullcalendar - to display the user tasks on the monthly basis

recoil - a set of utilities for state management

url-slug, dayjs - helper libraries for slug creation and date formatting

Future plans

I might consider adding extra auth methods. Most of us use platforms like Twitter and GitHub, so an OAuth solution would be great, which is already supported by Account API.

If I will ever come across to expand the app to collaborate with someone, I would consider adding the member system for app, where there is an invite system and an option to set the roles for each member via Users API.

Currently, the user is able to store the text and dates. I might consider extending it to the file uploads as well since Appwrite comes with a useful Storage API.

Conclusion

First of all, I want to say thanks to Forem for creating and actively maintaining such an awesome platform, where we can learn, and share our findings. I discovered this hackathon cause of DEV!

I'm glad I discovered Appwrite! I learned a new approach to creating a backend system and storing data. The docs are well written, and the UI in the console is very straightforward.

Also, KanBoard is an open-source project with MIT licence. The pull requests are welcome.


Connect me on Twitter, LinkedIn and GitHub!

Visit my Portfolio for more projects like this.

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .