welcome to the
last
kanban board
m3k-kanban is a kanban board designed to work offline. Everything you create within m3k-kanban is stored on your device.
β¦ unless you setup everarch on one of your devices. Then m3k-kanban will live synchronize your boards. The probably easiest way to do so is to install Podman on your server and run the podman-compose configuration from the everarch github standalone-glacier-websocket directory.
And now two last thingsβ¦ clicking β in the header will usually bring you back to the start and if you see a π₯ burning click itβ¦ it will install the latest version of m3k-kanban.
| key | action |
|---|---|
| ?, h | Show this help screen. |
| Enter, f | Open the board or card. |
| ESC, q | Leaves the current state until you are back at the boards overview. |
| / | Opens a filter for the visible elements. |
| e | Edits a card's title. |
| +, c | Creates something new like a board, list or card. |
| i | Inserts a new card before the current one. |
| d, y | Deletes a card. |
| m | Toggles selection of card. |
| β¬ , β¬, β¬, β‘ | The cursor keys let you move the focus in certain places. |
The storage status icon in the top navigation indicates the current situation between this client and the stogage server.
| icon | name | description |
|---|
You can customize m3k-kanban with plugins. Plugins are added via the settings. The plugin API tells you how to write your own plugin.
If you have questions regarding m3k-kanban that are not answered in here you can ask your question in the m3k-kanban matrix chat room or send me an e-mail to markus.peroebner@gmail.com.
The boards, lists and cards you create here can be stored on a server. See the help for more details.
m3k-kanban can be extended with further features by adding plugins. Plugins you add are shared by all users. You can either add pre-existing plugins from the following list, or write them yourself. You just have to stick to the m3k-kanban plugin API.
Here you can add your own plugins. You should only add plugins you trust. Plugins can steal and modify your data including your password if they want to.
Plugins may add visual elements or behavior to m3k-kanban. Each plugin is one JavaScript file that must be conform to the plugin constraints described in this page. Plugins which conform to the constrains should also work with future m3k-kanban versions.
A simple plugin which just registers itself may look like this:
(function(){
let { tap } = rxjs.operators;
let { registerPlugin, handleErrors } = m3kKanbanPlugins;
registerPlugin('NOP')
.pipe(
tap(kanbanApi => {
console.log('NOP retrievied m3k-kanban API', kanbanApi);
}),
handleErrors('NOP'),
)
.subscribe();
}());
The plugin script registers itself to m3k-kanban and retrieves the kanbanApi as a result.
Talking about constraints you should know the following:
rxjs.
m3kKanbanPlugins. Accessing the
DOM or other global variables is not supported⦠but
still you can do it. It just might break now or in the
future.
registerPlugin function returns an
RxJS Observable which provides the m3k-kanban API. The
plugin must only use the kanban API while the
subscription to the Observable
from registerPlugin is kept. The first
argument to registerPlugin is a human
readable name of the plugin which should be
unique. The optional second argument
to registerPlugin is a plugin options
object. The plugin options object may contain a
template property with an absolute URL pointing to a
HTML document containing HTML template elements for
the plugin. All templates in the document must have an
id attribute which starts with the prefix 'plugin-'
followed by the plugin's name. The suffix of the id
can be chosen by the plugin.
handleErrors RxJS operator
from m3kKanbanPlugins. It will catch
errors provided via the RxJS error stream and route
the application to the crashed view.
document.currentScript.getAttribute('data-plugin-url').
The m3k-kanban API provided
via registerPlugin provides the following
methods and properties.
getBoards()
getBoards() returns an Observable which
emits an array of boards. Only boards the current user
can see are emitted. Each board has the properties id,
createdBy, title, color. title and color are Observables
which emit their respective value.
getBoard(boardId)
getBoard(boardId) returns an Observable
which emits the board with the given ID. Emits undefined
if no board exists with that ID. The emitted board has
the properties id, createdBy, title, color, lists and
sharedWith. title, color, lists and sharedWith are
Observables which emit their respective value.
lists emits an array of list. Each list has the properties id, title, cards and lastFocusedCardId. title, cards and lastFocusedCardId are Observables which emit their respective value.
Each emitted card has the properties id, title and description. title and description are Observables which emit their respective values.
sharedWith emits an array of user name strings.
getList(listId)
getList(listId) returns an Observable which
emits the list with the given ID. Emits undefined if no
list exists with that ID. The emitted list has the
properties id, title, cards and
lastFocusedCardId. title, cards and lastFocusedCardId
are Observables which emit their respective value.
Each emitted card has the properties id, title and description. title and description are Observables which emit their respective values.
getBoardIdForList(listId)
getBoardIdForList(listId) returns an
Observable which emits the board ID where the list with
the given ID is located in. Emits undefined if the list
ID is not found in any board.
getCard(cardId)
getCard(cardId) returns an Observable which
emits the card with the given ID. Emits null if no such
card exists. The emitter card has the properties id,
title and description. title and description are
Observables which emit their respective value.
registerSettingsUi(controllerConstructor)
registerSettingsUi(β¦) allows adding UI
fragments which are placed into m3k-kanban's
settings. The controllerConstructor is expected to be a
function which can be invoked using the new keyword and
will produce an object which is compatible to the
controller interface described below. The
controllerConstructur retrieves the kanban API as first
argument.
registerCardSorterForList(sorterBuilder)
registerCardSorterForList(sorterBuilder)
allows adding custom sort operations for cards in
lists. The sort operation only affects the visual sort
order of the cards. The card's ordinal is not affected
by this sort operation. sorterBuilder must be a function
taking one list ID argument. sorterBuilder must return
an Observable which emits sorter functions or null if no
sorting should be applied. A sorter function is provided
with one card IDs array argument. The sorter function
must return an Observable which emits sorted arrays of
card IDs. registerCardSorterForList returns an
Observable which must be subscribed while the sorter
should be active. Only one registered sorter is applied
to a list. The order in which multiple competing sorters
are evaluated is undefined.
registerCardFlagsBuilder(flagsBuilder)
registerCardFlagsBuilder(flagsBuilder)
allows adding custom flags to cards. See for example the
β
in the following card:
The flagsBuilder argument must be a function which expects one cardId argument. The flagsBuilder function must return an Observable which emits an array of flag objects. Each flag object must have the properties icon and title.
{
icon: 'β
',
title: 'one of my favourite cards',
}
The flags also appear in the card details. registerCardFlagsBuilder returns an Observable which must be subscribed while the flagsBuilder should be active.
justNormalizeId(id)
m3k-kanban uses strings as IDs. These ID strings fall
into two categories. IDs for artifacts just stored on
the client and IDs for artifacts persisted on the
server. So the ID for an artifact like a board, list or
card may change over time. m3k-kanban replaces the IDs
in the artifacts stored on the client. So you should see
the most recent ID when retrieving data via the API. If
you store IDs yourself, for example via the settings API
described below, you can pass any ID
to justNormalizeId(β¦) and will emit the
current ID of the pointed to artifact.
Controllers in m3k-kanban manage parts of UI in m3k-kanban. They bind data sources to HTML elements and can react to events from these HTML elements. A controller must declare a mandatory set of properties.
The controler's element property must be an HTML node which is the visual representation of the controller's UI.
The controler's active property must be an Observable. It is subscribed as long as the controler's element may be visible on the screen.
Your plugin script may be updated at a not yet defined point in time.
Yikes⦠seems like I can't handle it⦠maybe you could try once more a little bit more gently?
I'm not sure what exactly went wrong but maybe you have an idea:
Please copy the whole text on this page into an e-mail and send it to markus.peroebner@gmail.com π. Maybe he will fix it?
First let me thank you for using m3k-kanban on multiple devices. That's the way it's meant to be. On the other hand it's the reason why you ran into this situation. It seems like you have already installed a newer m3k-kanban version on another device. Good news is that a reload should fix the issue.