thsmi/sieve: Sieve Script EditorTool for specifying mail filtering rules in an IMAP server

Material Shell - A new desktop experienceA tiling shell extension for Gnome

p-e-w/argos: Create GNOME Shell extensions in secondsCreate your own app indicator menus with shell scripts.

The new version of @phpstorm can create multiple files at the same time. This will make it possible to create all the files needed for a repository in one operation.

How to write a Kupfer plug-in

Kupfer is quite useful without extra plug-ins. However, when a service you use is not provided, it becomes quite hard (or impossible) to work with it without a plug-in. To write a plug-in for Kupfer does not need to be difficult as there is a lot of functionality provided for first time plug-in writers.

What to add

There are three types of classes that you can add to Kupfer: Sources, Actions, and Leafs. You extend the functionality of Kupfer by adding one or more classes of these types.

A Source is a collection of items. Examples are "Firefox Bookmarks", "Directories", "Files", "Windows", "Albums", or "Songs". The items inside a Source are called Leafs.

A Leaf is an item in Kupfer. You can search or create a Leaf by typing some text. Examples are text, URL, host, file, directory, or a music album. After you select a Leaf, you can search for an Action.

Some actions are Leafs. These are called RunnableLeafs. A RunnableLeaf is something that doesn't need a Leaf subject. An example of this is "Restart".

An Action is a type that processes the Leaf. Examples are "Open File", "Go to URL", "Delete File", and "Open".

When you create a plug-in you create one or more of these types. You don't need all three. It's possible (and expected) to reuse the Source, Leaf, and Action types. You can add a Source that adds items of type UrlLeaf. An example is a bookmark source.

You can add an Action that works with existing Leafs. An example of a core action that does this is the AppendTo action, that appends text to a file.

Kupfer contains a few default action utilities. Examples are show_url or launch_commandline. In your plug-in, you format the url and call utils.show_url(url) to automatically open a URL in a browser.

When your plugin uses settings, it's possible to add a few lines to the plugin to get input fields on the plugin configuration. This configuration is automatically loaded when the plugin is activated. You don't need to provide this yourself.

Where to start

User-defined plugins can be added to ~/.local/share/Kupfer/plugins/. When you quit and restart Kupfer, Plugins are reloaded. You need to enable the plugin in the plugin settings.

A good way to start with a plugin is to add a layer around a website. Some websites have a way to pre-fill a form with values. Fastmail has the compose URL `` which takes the query parameters `to`, `subject`, and `body`. When you add these parameters to the URL the form will be pre-filled with this information.

We could write a plugin like this. You create an action that opens this URL with the contacts that you found. Kupfer already has a ContactLeaf with an email address. There is an example of an Action in `` that gathers contacts. In the case of Fastmail, you can call `utils.show_url` with the right url to open the window where you can finish the email.

Another way is to add a layer around a command-line program. An example is the command `brotab`, which allows us to activate or close tabs. The source would call `brotab list` and provide the tabs as Leafs. Two actions that we would add or Activate and Close Tab, which would call `brotab activate <tab_id>` and `brotab close <tab_id>`.

The third way to start is by calling into a library. It is useful to use a library because Kupfer itself doesn't need that much code. An example could be a Pinboard plugin. There is a library for Pinboard that can return the bookmarks. The plugin would add a Source for these bookmarks and return UrlLeafs. The user can use URLs with the actions that are available in Kupfer by default.


Writing a plugin for Kupfer does not have to be hard. There are examples already for different types of functionality. You can use websites, command-line tools, and libraries to make information available or perform an action. You can place the plugin in a specific directory in your home folder to make it available in Kupfer. You can add settings with a few lines of code.

SVG path editorPath editor with the path information directly visible

Responsive Viewer – Get this Extension for 🦊 Firefox (en-US)Extension with which you can see multiple responsive views of the same page at the same time.

Why you should use multiple calendars

In most calendar applications, it's possible to create multiple calendars. Perhaps you only use the default calendar and would like to know why it would be useful to have multiple calendars. In this article, I will give my take on why you should use more than one calendar.

Types of calendars

I have a calendar for when the garbage container should put on the side of the street. The dates are available in advance for the year. I add these dates to a specific calendar for these events.

Another calendar I have is a calendar called Environment. This calendar contains events that I need to know about, but don't have to act on directly.

Show or hide the calendar

When you have a calendar for a specific type of event, it's easier to show or hide the calendar. The garbage calendar events don't have much influence on me planning my day. So it's useful that I can hide this calendar. If my default calendar also contains these events, it would be impossible to hide them.

Default settings for notifications

The garbage calendar has specific default settings for notifications. The evening before the collection at 8 pm, I get notified that I need to take the garbage out.

The other example is for events where you don't want notifications. The Environment calendar should not notify me. The default setting makes it easier to create events.

Default settings for free and busy

When you create a new calendar, determine if you need the events on the calendar to be free or busy. When you have an Environment calendar, you should put the events to free by default. But perhaps the calendar from an event scheduling app should be set to busy.

Default settings for public and private

When you have a calendar with public events and sometimes want to keep some events private, you could create a second calendar for events that are private by default. These events can show up as busy moments in your schedule but would not be visible to other people.

Sharing with other people

When you invite people to events, you share it with them. When you want to share more events, you can also share the whole calendar. It may be useful in a long-lived group, and you have repeating events and don't need to know who will attend.

An example of this is when you are part of a team. We have multiple events in a week that we have on the calendar. Without the shared calendar, someone would need to invite you to these events. A better way is to create a calendar and add the team events to that calendar. Every team member can take a look at the events and know exactly when to be there.

Sharing with apps

The problem with apps is that you do not always know what kinds of events these apps create on your calendar. Because of that, it can be better to create a new calendar and let the app create events in that calendar. Examples of apps that update your calendar are Todoist and RescueTime.

For importing many events

To create many events, you can create a recurring event. Recurring events can't help you when these events don't repeat. When you want to number the meetings or have different titles, you also won't be able to do it.

A solution would be to create a file and import it. However, when we import a file, this can give the wrong result. With the import, we add many events to the calendar at once. When these events are not right, it can be almost impossible to remove those events from the calendar in most calendar apps. The problem becomes worse when we mixed events with your other events.

To solve this, you first create a new calendar and then import these events to that calendar. When the result is different from what you expect, you can remove the whole calendar and try again.


With multiple calendars, you have more control over your events. You can set the default settings and share, import and remove these calendars more easily. Multiple calendars are a great to use for increasing your productivity.

Comby.liveLive version of Comby to try in the browser.

Comby · Structural code search and replace for ~every language.Tools for making automatic changes to your code.

Decision Table Patterns • Hillel WayneDecision Table Patterns

Polypane, the perfect browser for web developers and designersThis seems like a useful tool for responsive web development.

Implementing 'focus and reply' for Fastmail with JMAPHow to implement your own client on top of JMAP.

JMAP Crash Course | TopicboxOverview and explanation of the JMAP api.

Conventional CommitsExample of how you can structure your commit messages.

Peter Stuifzand replied to a post on

Feedbin supports this use case!

Texpand app docsDocs for Android text expansion app.

Tools for better thinking | UntoolsTools for helping solving problems, make decisions and think in a systemic way.

Array Manager | Magento 2 Developer DocumentationProcess deeply nested associative array in Magento 2.

component/textarea-caret-position: xy coordinates of a textarea or input's caretCaret position on screen for placing menus and other autocomplete popups near the cursor.

new.cssClass-less CSS framework

jlaswell/compote: bite-sized dependency management for PHPgo implementation of part of composer

Private Packages | | Private PHP Package Repository ManagerProxy and private package repository for php composer packages

Test stream for YouTube LiveYouTube teststream with gstreamer

A file watching service | WatchmanWatches your files for changes.

Whimsical: The Visual WorkspaceCreate mind maps, flowcharts wireframe and board with sticky notes.

evilsocket/opensnitch: OpenSnitch is a GNU/Linux port of the Little Snitch application firewallShows connections to the internet, with the ability to block them.

Space: The integrated team environmentCould be a nice environment for teams. It has some stuff already included for code reviews and source control. But I think we'll need the boards before we can use it for real.

Load more