README file from
GithubBureau
Run the admin side of a freelance practice from your own notes: calendar, tasks, reminders, time tracking, invoicing, finances, content and contacts — all read from the plain tags and dates you're already writing.
No new format to adopt, no separate database, no account, no network calls. A note tagged task with a date: shows up on the board and the calendar. Start a timer and it writes its own note. Generate an invoice and it reads back the hours you tracked, then chases the payment for you. Any tab you don't want, switch off in settings.
| Tab | What it does |
|---|---|
| Calendar | Month, week and day views over every dated note. Drag to reschedule, drag an edge to resize, double-click a slot to create. Repeating events with per-occurrence edit, skip and delete. |
| Tasks | Kanban board and list view grouped by status:, with priorities, checklist progress, drag between columns and bulk actions on a selection. |
| Reminders | Everything dated and due, grouped by urgency, with repeats, snooze and advance desktop notifications. |
| Finance | Subscriptions, expenses, income and invoices, each foldable, filterable and totalled per currency. |
| Time | A live timer in the status bar, a day-by-day log, and a report filterable by client and date range. Unbilled hours priced against each client's rate. |
| Posts | A gallery for blog and social drafts, from idea through to published, with cover images pulled from the note itself. |
| Contacts | Everyone you work with, by type, company and role. |
| Daily note | A one-line code block that embeds a live summary: running timer, today, overdue, due this week. |
Every edit writes back exactly the fields that one action changes, on that one note. Deletes go to Obsidian's own trash, never anywhere permanent.
Built and maintained by a one-person planning consultancy. I use it every working day, which is mostly why it keeps getting better.
Why
Most calendar and task plugins ask you to manage events or tasks inside the plugin itself, or to adopt a particular format. Bureau is the opposite: it assumes your notes are already the source of truth, and just gives you views over them, with light editing where it's genuinely useful. It's kept deliberately small and open-sourced so anyone can install it cleanly and check exactly what it does.
What it reads
Any markdown note with:
tags:including one ofmeeting,reminder,task,event,invoice,time,postdate:as a Date & time property (YYYY-MM-DDalso still parses, for compatibility) — a task note without a date still appears on the task board, just without one on its cardend:(same Date & time shape), optional, on a Meeting/Reminder/Task/Event/Invoice — gives it a duration, shown as a sized block on the Week/Day calendar grid instead of a single pillrecur:(daily/weekly/monthly/yearly/biennial), optional, on a Meeting/Reminder/Task/Event — makes it a repeating series, projected forward on the calendar from its one real note (see Repeating events below)priority:(low/medium/high), optional, on a Task — set from the shared editor when creating or editing, or by clicking the priority dot on its cardamount:andcurrency:, on an Invoice — written automatically when Bureau generates the invoice; the Finance tab's Invoiced total reads these rather than parsing the figure back out of the invoice bodycost:(a number, per period) on a Reminder — combined withrecur:this is a Subscription; on its own, withoutrecur:, it's a one-off Expense. Optional on a plain Reminder, but required once Subscription, Expense or Income is picked from the type dropdown — the shared editor won't let you save without one, since none of those three mean anything without a figure attached. Shows up in the Finance tab, not just the calendar.currency:(an ISO 4217 code, e.g.USD), optional, on a Reminder — alongsidecost:, picks which currency that Subscription/Expense/Income figure is in, from the full list of world currencies. Omitted means GBP, so every note created before this field existed keeps working unchanged. Displayed as a bare£/€/¥for those three currencies, or asCODE amount(e.g.USD 25.00) for everything else, since a bare$alone is ambiguous across the many currencies that share it.invoiceReminder: true, optional, on a repeating Reminder — shows it with the same pill colour as an Invoice, as a nudge to go generate one that day; it doesn't create an invoice itselfincome: true, optional, on a Reminder — flips it from an outgoing cost to incoming money in the Finance tab. Combine withrecur:for a recurring income source (a monthly payout, say); leaverecur:unset for a one-off entry recording money already received. Uses the samecurrency:field ascost:, GBP by default.remind:(9am/1d/1w/1m), optional, on a Meeting/Reminder/Task/Event — an advance desktop notification (9am on the item's own date, or 1 day/week/month ahead of it), set per item via the shared editor's "Remind" field. Fires regardless of the "Notify when something starts" setting -- it's opted into per item, not gated by that toggle.- Any note tagged
postwith apublished:date — shown on the calendar as its own category, pinned to that date. Bureau can create a new Post idea note (see What it writes below) but never edits or deletes an existing one -- clicking one just opens it, and the content workflow itself stays entirely outside the plugin. A Post without apublished:date yet (an Idea or an in-progress draft) has nothing to plot, unless it also carries ascheduled:target date -- that earns a dashed, faded pin on that date instead (same look as a projected recurring occurrence), and a desktop notification on the day itself asking whether it's gone out. Fill inpublished:by hand once it has, and the provisional pin is simply replaced by a real one. - For the client dropdown in the Start Timer prompt (and the Meeting/invoice client fields): any note tagged
client— its filename is what shows up as an option. Noclient-tagged notes yet means an empty dropdown, not an error; you can still type a client name freely.
Optionally, a status: field is shown alongside the note's type in the calendar's agenda panel, and drives the task board's three columns.
Notes without one of those tags are ignored — Bureau doesn't try to guess which of your other notes might be calendar- or task-worthy.
What it writes
Each action below writes exactly the field(s) named, and nothing else in the note — its body, other frontmatter, its folder — is ever changed:
- Drag an event (in the grid or the agenda) onto a different day — sets its
date:field. Desktop mouse drag only; the underlying HTML5 drag-and-drop API isn't reliable on mobile touch, so on mobile use the note itself, or the editor below, to change its date. - Click an item in the calendar grid, or the pencil next to an agenda/list item — opens one editor for title, type (Meeting/Event/Reminder/Subscription/Expense/Invoice reminder/Income/Task), date, start/end time, an "All day" checkbox, repeat rule, an advance reminder lead time, status and priority (for a Task) and (for a Meeting) client, all in one place, without opening the note itself. Cost only shows once Subscription, Expense, Invoice reminder or Income is picked, or when editing something that already has one set -- and is required, not just shown, for Subscription/Expense/Income specifically. Changing the title renames the file; changing the type updates its tag, status, client and folder together. Converting to or from a real Invoice isn't offered — editing an existing Invoice's own title or schedule still works, its type just shows as a locked label.
- The "+" button in the agenda panel, task board, reminders view or posts gallery — opens the same editor to create a new item, dated to the selected day (or today). The task board's own "+" is locked to Task (with status and priority fields alongside the usual date/repeat/remind), and the reminders view's own "+" is locked to Reminder, since everything created from either is inherently one type; Post is only offered from the Calendar/Dashboard/command-palette "+" (see below), and the posts gallery's own "+" is locked to Post. Finance's own "+" opens the same editor but narrowed to Subscription/Expense/Income only — see Finance below. Double-clicking an empty day (Month view) or half-hour slot (Week/Day view) opens the full editor too, pre-dated and pre-timed to where you clicked. Invoices aren't offered from any of these — they need the full invoicing workflow (below), which a quick form can't fill in responsibly.
- Picking "Post" in the "+ New item" dropdown, or the posts gallery's own "+ Post" — writes a minimal
<title> - Post Idea.mdnote in your Posts folder (status: [Idea], emptyplatform:/published:/cancelled:) and sets itsscheduled:field to the date chosen in the dialog; the note's owndate:is the day it was created, not the scheduled one. Post is create-only: once a Post note exists, editing it means opening the note itself, same as any other Post (see What it reads above) -- it isn't offered as a type when editing an existing item. - Drag a duration block's top or bottom edge (Week/Day view) — adjusts its start or end time, snapped to the nearest half hour, similar to dragging an edge in Google Calendar.
- ‹ › on the task board, or dragging a card to another column — sets a task's
status:field. Drag-and-drop is desktop mouse only, same as the calendar; ‹ › covers the same move on mobile. - Right-click an item, in any view — deletes it (moved to Obsidian's trash, never permanent). Shift+click one or more items first to select several, then right-click any selected item, or use the "Delete" button that appears in the selection bar. On a repeating item this menu also offers Skip this occurrence (rolls its own due date forward one period without deleting the series), and — on a not-yet-materialised future occurrence — Edit this and following occurrences / Delete this and following occurrences, which cap the original series and, for edit, start a new one from that date. On the task board specifically, right-clicking with 2 or more tasks selected also offers Move to and Set/Clear priority, applied to every selected task in one action.
- Renew on a Subscription row in the Finance tab — the same "roll the due date forward one period" action as Skip this occurrence, exposed there since a subscription's next due date is the whole point of the row.
- Starting/stopping a timer — from the Time view's Start/Stop timer button, or the status bar item at any time from anywhere in the wiki — creates a new time entry against a client and description, or writes
endand computesdurationon the running one. Starting a new timer while one is already running stops the old one first — only one runs at a time.durationis rounded up per the "Round time entries" setting (off by default). - Add entry (Time view, and the Daily Note dashboard's mini timer) — logs an already-finished session that was forgotten at the time, without touching the running timer: a small dialog for description, client, date and start/end time, written as a completed entry in one go.
- Generate invoice (command palette, or from a client's billing details) — walks through a currency picker (any ISO 4217 currency, GBP by default), then line items (pulled from tracked time, a saved package, or typed by hand), then writes a complete, sequentially-numbered invoice note in your Invoices folder and a "Chase Payment" reminder dated to its due date. Each time entry behind a tracked-time line is marked
billed: truewith a link to the invoice, so the invoice stays checkable against the time it was built from; the "Delete time entries once invoiced" setting restores the old behaviour of trashing them instead. This is the only way Bureau creates an Invoice — the quick editors above never do.
Repeating events
A repeating Meeting, Event, Reminder or Task has exactly one real note — its recur: field and date: together define the series, and the calendar projects future occurrences from it without creating a note per occurrence. Opening a not-yet-real occurrence offers Edit this occurrence (materialises just that one date into its own note) or Edit this and following occurrences (caps the original series and starts a fresh one from that date); deleting offers the equivalent Skip this occurrence and Delete this and following occurrences, without ever touching the notes of any other occurrence.
Finance
The Finance tab opens with an at-a-glance row of stat tiles (Income/Expenses/Net to date, Recurring net/month, Invoiced/Paid so far -- green for money in, red for money out), then four foldable sections. Subscriptions, Expenses and Income (the Reminder-based one) are the same underlying note shape with different fields set; only Invoiced is built from a different note type. Each section has its own filter box, a sort dropdown (newest/oldest, amount high/low, title A-Z/Z-A), and shows 15 rows at a time with a Load more button, so a list that grows large stays usable -- click a section's header to fold it away entirely.
- Subscriptions — a Reminder with both
recur:andcost:set, and noincome:flag: money going out on a repeat basis (software, a membership). Shows a monthly-equivalent running total and a Renew button per row. - Expenses — a Reminder with
cost:set, norecur:, and noincome:flag: a one-off cost, with a running total. - Income — a Reminder with
cost:andincome: trueset. Withrecur:also set, it's a recurring source (a monthly payout); without it, a one-off entry for money already received. Any currency, via the samecurrency:field as Subscriptions and Expenses. The Paid toggle below doesn't apply here; there's no invoice behind these to be paid. - Invoiced — every note in your Invoices folder (subfolders included), newest first, summed per currency (figures in different currencies are never merged into one total). The headline total is everything ever invoiced, not just paid; a circle button on each row toggles its own
paid:flag, and a subtitle line under the header shows how much of it has actually come in -- visible even while the section is folded. Rows open the invoice note itself; creating or amending an invoice's own content always goes through Generate invoice, never this view -- Paid is the one thing this view itself writes.
Figures in a currency other than GBP are never merged into the tiles' totals (that would need an exchange rate Bureau doesn't have) -- they show as a compact line underneath instead.
Subscriptions, Expenses and Income are created and edited through the same "+ New item" dropdown the calendar uses, narrowed here to just those three -- Meeting/Event/Reminder/Invoice reminder/Task/Post aren't offered from Finance's own "+", since anything created from this tab is inherently one of the three by definition. Cost is required once one of them is picked; the dialog won't let you save without it. A Subscription note template is available under Templates for typing one in by hand, though the "+" button is quicker.
Time tracking
The Time tab has three modes: Log (a rolling 30-day list, day-grouped and task-grouped, with a daily-goal/streak line if you've set one), Report (any month, or a custom date range, filtered by client) and Unbilled (every client with tracked time not yet invoiced, valued at their rate where one's set, with an Invoice button straight into the invoice generator).
Report shows six stat tiles at a glance: Today, This week and This month (fixed windows, independent of what you're browsing), the browsed period's own total, Billable hours (entries with a client attached, since only those can ever become an invoice line) and Unbilled total (the same figure as the Unbilled tab, a running fact rather than something scoped to the period). The client dropdown and From/To date fields above the tiles narrow all of it down to a specific client or range; setting either date overrides the Prev/Next month nav until you clear it again.
Posts
The Posts gallery is a card view over every note tagged post, for tracking blog and social content through to publication without a separate tool. A card shows a cover image (the first image embedded in the note itself, if it has one), its status, platform and either a "Published" or "Scheduled" date -- each of those is optional and toggleable from the gallery's own ⋮ menu, so you can show just what's useful. + Post writes a new Post idea note exactly as the Calendar's own "+ New item" dropdown does (see What it writes above). A platform filter is in the same ⋮ menu once more than one platform is in use. Right-click a card for Edit/Select/Delete, same as any other tab -- Edit here changes just its status, platform, scheduled/published date, or marks it cancelled; the note's title and written content stay yours to edit in the note itself. Shift+click to select several, then right-click for a bulk Delete -- deleting moves a note to Obsidian's own trash, reversible like any other Bureau delete.
Contacts
The Contacts list is a row-per-note view over every note tagged contact, wherever it lives -- surfacing a directory that predates Bureau rather than inventing a new one, so if your vault already has contact_type, company and role fields on these notes, they'll show up as-is. Each row shows the contact's name, type (Client/Prospect/Peer/Corroborator/Supplier/Referral Source/Other), company and role -- each optional and toggleable from the ⋮ menu, same as every other view's property visibility, with a type filter alongside it once more than one type is in use. + creates a new contact with all four fields up front. Right-click for Edit/Select/Delete -- unlike Posts, a contact's own name is safe to rename here, since there's no filename convention riding on it. Email, phone and any relationship notes stay in the note's own body; Bureau only ever reads/writes the four frontmatter fields above.
Daily Note summary
A fenced ```companion-dashboard``` code block, placed anywhere in a note (typically a Daily Note template), renders a live timer, today's agenda, overdue items and items due soon — no separate tab, just an embed that updates itself as the underlying notes change. Every section (Today/Overdue/Due this week/Recent time entries) starts folded, so opening the note shows a compact summary; click a section's heading to expand it. The Time tracker heading has its own + button that quick-creates a Task/Reminder/Event/Meeting via the same editor the calendar uses; a "What are you working on?" field, client dropdown, a second + (list icon) for logging a finished session you forgot to time — opening a small dialog for description, client, date and start/end time — and a Start button track time inline without opening the Time tab, and recent past entries fold out below with a continue button per row.
Usage
- Install and enable Bureau (see below).
- Open the calendar (compass icon, or command palette: Open calendar). A Month/Week/Day dropdown switches views; the arrows and Today move by whatever unit is showing. In Month view, click a day to see its agenda — drag the thin handle between the calendar and the agenda to resize it, or use the panel icon to collapse it entirely. Week and Day views trade the agenda for an hourly grid with a red current-time line instead (set Calendar timezone in settings to see times in a zone other than the device's own) -- it already shows each day's items in full, so the agenda panel isn't offered alongside it.
- Open the task board (checklist icon, or Open task board), reminders (bell icon, or Open reminders), Finance (wallet icon, or Open finance), the time tracker (timer icon, or Open time tracker), Posts (newspaper icon, or Open posts), or Contacts (people icon, or Open contacts).
- New item (command palette) opens the shared editor from anywhere, without opening a view first — handy on mobile.
- Settings → Community plugins → Bureau, grouped under General (confirming before delete, Notify when something starts -- an optional desktop notification when a timed item's start arrives; advance reminders are set per item instead, via the "Remind" field in the New/Edit item editor, and cover 9am the same day or 1 day/1 week/1 month before), Tabs (switch any tab except the calendar off entirely, if you don't want it), Finance sections (hide Subscriptions/Expenses/Income/Invoiced independently of the tab as a whole), Time tracking (a daily goal, rounding, which day the week starts on), Calendar (a timezone override) and Invoicing (your own business and payment details used when generating an invoice).
On a phone-sized screen, a header with too many controls to fit one line collapses the less-used ones (a mode toggle, a sort dropdown) into a ⋮ button rather than wrapping onto a second line -- the primary action (the "+" itself, Start/Stop timer) always stays a normal, tappable button. That same ⋮ button, on every view and every screen size, also holds "Show ..." options for whatever's optional on that view's cards or rows -- a task's date or priority, a calendar item's client or cost, and so on -- so you can hide what you don't need without it being gone for good.
Installation
From within Obsidian: Settings → Community plugins → Browse → search "Bureau" → Install → Enable.
Manually: download main.js, manifest.json and styles.css from the latest release and place them in <your vault>/.obsidian/plugins/wiki-companion/, then enable the plugin under Settings → Community plugins.
Editing several items at once
Shift+click to select several items in any tab, right-click one of them, and choose Edit N selected. The form offers the fields that make sense for that tab, and applies your changes to every selected note in one go.
Only the fields you tick are written. Nothing is pre-filled, so a bulk edit can never quietly overwrite a property your items legitimately differ on. Tick a field and leave it empty to clear it across the selection.
A few fields are deliberately not offered in bulk: an item's title (it has to be unique), its type (that moves the note to a different folder), a cost, and a time entry's start and end times. Those are the values each record exists to hold, and setting them identically across a batch is far more likely to be an accident than an intention.
A bulk date change keeps each item's own time of day, so a morning meeting stays a morning meeting.
Grouping and view options
Every tab's ⋮ menu holds that tab's own view options, in the same order throughout: layout, then grouping, then sort, then filters, then which details to show on each card or row.
Group by is available on Posts (status, platform or month), Contacts (type or company) and Reminders (month, or the Due/Upcoming/No date urgency grouping it uses by default). Grouping never hides anything: every item goes in exactly one group, and anything with no value for that field gets its own group at the end. Your chosen sort still applies inside each group.
Posts can be shown as a gallery or as a list, the same way the task board offers Board or List. Same posts either way.
All of this is remembered per tab, so a view you set up stays that way.
Where your notes go
Bureau creates ordinary markdown notes and puts each kind in its own folder. Any folder that doesn't exist yet is created the first time something is written to it, so you never have to set the structure up by hand.
The defaults are:
| Note | Folder |
|---|---|
| Tasks | Admin/Tasks |
| Reminders (and Subscriptions, Expenses, Income) | Admin/Reminders |
| Events | Admin/Events |
| Meetings | Admin/Meetings |
| Time entries | Admin/Time |
| Posts | Content/Posts |
| Contacts | Admin/Contacts |
| Invoices | Admin/Invoices |
| Service packages | Admin/Packages |
| Clients | Clients |
Every one of them can be changed under Settings → Bureau → Folders. Changing one only affects where new notes go; nothing already written is moved.
Moving a note afterwards is safe. Bureau finds your items by their tags, not by their location, so a task dragged somewhere else in your vault still shows up on the board. The three exceptions are invoices, service packages and clients, which are identified by folder rather than by tag, so those three settings should match wherever you actually keep them. Those three also look inside subfolders, so filing invoices by year or by client works fine.
Bases (optional)
Bureau's own views (calendar, task board, reminders, Finance, time log, posts gallery) work as soon as you enable the plugin — they read tags and frontmatter directly, and need no setup beyond that.
If you also use Obsidian's core Bases plugin, you may want native table views over the same tagged notes (sortable columns, filtering by client, and so on) alongside Bureau's views. Bureau doesn't ship any .base files — they're a separate, optional layer, and Bases' own format may change over time — but a simple one is quick to build yourself: Create new Base, then filter on tags.contains("task") (or "reminder", "meeting", "event", "invoice", "time", "post") and add whichever columns you want (date, status, client, duration, and so on).
Roadmap
Bureau is being developed incrementally. The calendar (Month/Week/Day, drag-to-reschedule, drag-to-resize, double-click-to-create, repeating events with per-occurrence edit/skip/delete), task board (with multi-select bulk status/priority actions), reminders, Finance (Subscriptions/Expenses/Income/Invoiced), time tracker (Log/Report/Unbilled), a Posts gallery, a Contacts list and a Daily Note summary embed are all built, with editing and delete throughout, and every tab (bar the calendar) switchable off in settings. On phone-sized screens, layouts that would otherwise sit side by side (the calendar's grid + agenda, the task board's Kanban columns) stack vertically, list rows/buttons get more room rather than being squeezed onto one line, and a header with too many controls collapses the less-used ones into a ⋮ menu. I use this daily and expect to keep extending it for a long time to come.
License
MIT — see LICENSE.