A self-hosted Kanban board in a single PHP file. Boards are folders, cards are Markdown, and there is no database, no build step and no third-party JavaScript.
MIT licensed · one file · around 300 KB · PHP 8
Version 2 replaces Vue and Tailwind with hand-written CSS and JavaScript, a custom icon set, and Beckon's own Markdown engine. Everything the page needs ships inside index.php. Nothing is fetched from a CDN, so the board works on an airplane and inside a locked-down network.
: in the editor or a comment. React to comments with a picker.beckon-cli.php creates, lists, imports and exports cards for scripts.
Every title, description, comment and label is indexed the moment it changes. This one searches a handful of demo cards. Try release or import.
Beckon is small on purpose. Each feature earns its place by making the plain files more useful.
Every card is a .md file. Split-pane editing with live preview, task lists that roll up into progress on the board, tables, code and images.
A board is a folder. Back it up by copying it, sync it with Dropbox or Nextcloud, or keep it in git. You can read every card with a text editor.
Upload index.php to any host with PHP and open it. No composer, no npm, no build. Updates install themselves from GitHub in one click.
Full-text search across all boards, backed by SQLite FTS5. Filter by board, jump straight to a card, keyboard all the way.
Every change to a description is kept. Scrub back through old versions with a slider and restore any of them.
Reorder cards and lists. Drop or paste images into the editor and they upload beside the board. Set any upload as a card cover.
Show a card full screen for a meeting, or export it as a standalone HTML file with the images embedded.
Bring over lists, cards, labels, checklists, comments, members and attachments. Private boards work too with a pasted cURL command.
Draft a post as a card, then send it to any WordPress site. Images are uploaded first and the cover becomes the featured image.
Design tokens drive both looks. Beckon follows your operating system by default, and a right-click on the toggle lets you pin light, dark or system. This page works the same way.


Any server with PHP 8 works. Here is the whole install.
$ mkdir beckon && cd beckon $ curl -OL https://github.com/austinginder/beckon/releases/latest/download/index.php # any web server works; the PHP built-in one is fine for a laptop $ php -S localhost:8000
cove add beckon --plain, then clone the repo into the site folder and open https://beckon.localhost.The rebuild release. Beckon 2.0 drops every third-party library and ships an interface written for it alone, adds search across boards, live reload, WordPress publishing and a command line, and stays one file.
index.php, with a custom SVG icon set and a custom Markdown engine. Beckon makes no requests to any CDN.: autocomplete in the editor and comments, and a reaction picker, both backed by an embedded emoji table.?board=<slug> opens a board directly./ or Cmd+K.beckon-cli.php for creating, listing, importing and exporting cards. See cli.md.boards/.updates/ and can be restored from the boards screen, release notes show before installing, and the web endpoint no longer accepts a target version so nobody can downgrade a board from the browser. Update checks are cached for a week and only happen while someone has a board open. php beckon-cli.php update runs the same updater from a shell (--check, --yes, --rollback), lints the download first, and updates the CLI itself..php (or .phtml, .htaccess and so on) can't be dropped into a board and executed. Avatars accept images only. Imported Trello attachments of any other type are kept but saved as inert .bin files, and only http and https links are fetched. On Apache, boards/.htaccess adds a second layer.javascript: links are stripped before anything is shown, including links that SVG animation would write in after the fact.layout.json. They move to users.json on the first save instead of disappearing..msg, .eml, .vcf and .ics keep their extension.php -S answers one request at a time unless PHP_CLI_SERVER_WORKERS says otherwise, and the live reload stream held that one request, so every other tab and API call stalled while a board was open. On a single-worker server Beckon now says so once and the board runs without live reload; the readme's quick start sets four workers. On every server the stream sends a keep-alive comment every 15 seconds so a closed tab frees its worker promptly.index.php.bak next to the app, where a web server serves it as plain text. The first update check after upgrading moves it into boards/.updates/ under the name the Restore link understands.