Track projects in Obsidian.
One note per project, a table with a health column that flags anything overdue or due this week, a board in your column order, and client pages that list their own projects. No plugins.
What you’ll build
Enough project tracking for a freelancer or a small team, without another app:
- One note per project with its status, client, dates, budget and hours.
- A Projects base: active projects with days left, a health flag (🔴 overdue, 🟡 due soon, 🟢 on track), hours used and the total budget.
- A board with Planned, Active, Waiting and Done columns, in that order.
- Client pages that list their own projects.
It’s how projects work in our Business OS vault. You need Obsidian 1.9 or later with the Bases core plugin on. Everything below was tested in Obsidian 1.14 with no community plugins.
Step 1: One note per project
Make a folder called Projects and one note per project:
---
type: project
status: Active
client: "[[Acme Dental]]"
start: 2026-10-01
due: 2026-10-30
budget: 2400
hours_est: 20
hours_logged: 6
---
## Goal
A new-patient form that works on phones.
## Next step
Send Dana the first draft.statusis one of Planned, Active, Waiting, Done or Cancelled.- Dates use the 2026-10-30 format, so they sort and count down.
- Write the next step in the note. If you can’t name one, the project is stuck.
Save a copy with empty values as Templates/Project.md.
Step 2: The Projects base
Make a file called Projects.base and paste this in:
filters:
and:
- type == "project"
- '!file.inFolder("Templates")'
formulas:
days_left: if(due, (date(due) - today()).days.round(0), "")
health: if(status == "Done", "✅ Done", if(!due, "", if(date(due) < today(), "🔴 Overdue", if((date(due) - today()).days.round(0) <= 7, "🟡 Due soon", "🟢 On track"))))
hours_used: if(hours_est, if(hours_logged, (hours_logged / hours_est * 100).round(0).toString() + "%", "0%"), "")
column: if(status == "Planned", "1 Planned", if(status == "Active", "2 Active", if(status == "Waiting", "3 Waiting", "4 Done")))
properties:
file.name:
displayName: Project
note.budget:
displayName: Budget $
formula.days_left:
displayName: Days left
formula.health:
displayName: Health
formula.hours_used:
displayName: Hours used
views:
- type: table
name: Active
filters:
and:
- status == "Active"
order:
- file.name
- client
- due
- formula.days_left
- formula.health
- formula.hours_used
- budget
sort:
- property: due
direction: ASC
summaries:
budget: Sum
- type: table
name: Waiting on someone
filters:
and:
- status == "Waiting"
order:
- file.name
- client
- due
- formula.days_lefthealthchecks the status first, then the due date: past due is 🔴, seven days or less is 🟡, anything later is 🟢.hours_usedshows logged hours as a share of the estimate, such as 30%.Sumunder budget totals what’s active.- Waiting on someone is its own list, so stalled work doesn’t hide among the active projects.
Step 3: A board, in your column order
Add a board under views: in the same file:
- type: cards
name: Board
filters:
and:
- status != "Cancelled"
groupBy:
property: formula.column
direction: ASC
order:
- file.name
- client
- due
- formula.healthGroups sort alphabetically, which would put Active before Planned. The column formula from step 2 numbers them (1 Planned, 2 Active, 3 Waiting, 4 Done), and the board groups by that. Change a project’s status and it moves to the right column.
Step 4: Client pages that list their projects
Add one more view:
- type: table
name: This client
filters:
and:
- file.hasLink(this.file)
order:
- file.name
- status
- due
- formula.healthThen put ![[Projects.base#This client]] in each client’s note. It lists the projects that link to that client, with their health.
Step 5: A weekly look
Put the two lists that need you on your Home page:
## Active projects
![[Projects.base#Active]]
## Waiting on someone
![[Projects.base#Waiting on someone]]Once a week, read the board left to right: start one planned project, update hours, chase anything waiting, and set the next step on each active one.
Mistakes that cost us time
- A project with no
duedate. It never turns 🔴, so it can slip forever. Give everything a date, even a rough one. - Hours logged as text. “6 hrs” can’t be divided. Use a number.
- Too many active projects. If everything is Active, nothing is. Move some to Planned.
- The template showing up as a project. The
!file.inFolder("Templates")filter fixes it.
Keep going.
How to Build a Simple CRM in Obsidian (No Plugins)
Track clients, follow-ups and invoices with one note per client and a single Base. Copy-paste code, no plugins.
Read the guide Bases recipesObsidian Bases Examples: 10 Copy-Paste Recipes
Ten tested recipes: due this week, days since, late invoices with totals, weighted pipeline, renewals, per-note embeds and the gotchas.
Read the guide Small office ITSmall Office IT Documentation in Obsidian: What to Record
What a small office should write down about its IT, what never to store, and a simple setup in Obsidian.
Read the guide Building with AIA Spec Template for AI Coding Tools (Claude Code, Cursor)
A one-page spec template for Claude Code, Cursor and other AI coding tools, a plan-first prompt, and where Obsidian fits.
Read the guide StudentsObsidian for Students: Track Assignments, Exams and Grades
Assignments with due dates, an overdue list and exam countdowns, plus class pages that list their own work. Copy-paste code, no plugins.
Read the guide Daily planningA Calm Daily Planner in Obsidian: Tasks by Energy and Time
A brain-dump inbox, tasks sorted by energy and minutes, up to three focus tasks, and bills two weeks ahead, on one Today page.
Read the guide Game mastersObsidian for Game Masters: Run a Tabletop RPG Campaign
Session prep in 30 minutes, secrets and clues until they’re revealed, NPCs listed on their places, and faction clocks. Any system.
Read the guide Real estate agentsReal Estate CRM in Obsidian: Follow-ups and Contract Deadlines
Follow-ups due, past clients to check on, and every contract deadline in the next seven days, in a private vault. No plugins.
Read the guide HabitsA Habit Tracker in Obsidian with Bases (No Plugins)
Habit checkboxes in your daily note, and one Base that counts each habit over 7 and 30 days. No streaks to break, no plugins.
Read the guide ReadingA Book Tracker in Obsidian: Reading List, Shelf and Yearly Totals
One note per book: reading now, up next, finished this year with pages and ratings, a shelf board, and author pages. No plugins.
Read the guide MeetingsMeeting Notes in Obsidian: Agenda, Decisions and Action Items
A meeting template with agenda, decisions and next steps, a list of follow-ups still to send, and every open action item on one page.
Read the guide