Bookings[email protected] San Antonio · Texas
Obsidian guide · Projects

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.

Updated October 2026 · Tested in Obsidian 1.14 · 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:

Projects/New-patient form.md
---
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.
  • status is 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:

Projects.base
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_left
  • health checks the status first, then the due date: past due is 🔴, seven days or less is 🟡, anything later is 🟢.
  • hours_used shows logged hours as a share of the estimate, such as 30%.
  • Sum under 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:

Projects.base (add under views:)
  - type: cards
    name: Board
    filters:
      and:
        - status != "Cancelled"
    groupBy:
      property: formula.column
      direction: ASC
    order:
      - file.name
      - client
      - due
      - formula.health

Groups 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:

Projects.base (add under views:)
  - type: table
    name: This client
    filters:
      and:
        - file.hasLink(this.file)
    order:
      - file.name
      - status
      - due
      - formula.health

Then 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:

Home.md
## 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 due date. 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.
More guides

Keep going.

Clients and follow-ups

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 recipes

Obsidian 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 IT

Small 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 AI

A 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
Students

Obsidian 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 planning

A 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 masters

Obsidian 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 agents

Real 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
Habits

A 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
Reading

A 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
Meetings

Meeting 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