How I keep daily notes in Obsidian: a diary, tasks, habits and syncing with Google Calendar
49 min read
Before, every morning I drowned in tasks and thoughts: what to do right now, who to reply to, what priority my tasks had and what was I even thinking about a couple of days ago? Now I open one note — and immediately see all my projects, tasks, habits and thoughts. In this article I’ll go through my whole daily-notes system in detail, step by step and in the simplest language — so that you can assemble it for yourself literally in an evening.
Why keep a diary in Obsidian at all
🤔 What Obsidian is (if you're hearing about it for the first time)
Obsidian is a free note-taking program that stores everything on your computer as ordinary text files.
Its main difference from a notepad or Word is that notes can be linked to each other with links, like pages on the internet. The result is a personal “knowledge base” that grows with you.
And Obsidian can also be extended with plugins — small add-ons that add new capabilities. The whole system in this article is built precisely on them.
⬇️ How to download and install Obsidian (from scratch)
It’s free and takes a couple of minutes.
1. Download the program. Go to the official site obsidian.md and click the big Download button. The site will detect your system (Windows, macOS or Linux) itself. For the phone, search for “Obsidian” in the App Store or Google Play.
2. Install it. Run the downloaded file and go through the usual installation, like with any program.
3. Create a Vault. On the first launch, Obsidian will ask you to create a Vault — that’s just a folder on your computer where all the notes will be stored. Click “Create new vault”, come up with a name and choose a location on the disk.
4. Done. You can create your first note. And all the plugins from this article are installed inside the program — we’ll get to that in step 1.
⚠️ Download Obsidian only from the official site obsidian.md — that way you get the latest and safe version.
💚 Why Obsidian, and not notes on the phone
In short — three reasons:
Everything’s yours and forever. Notes are stored on your device as ordinary text files. The service won’t shut down — your data won’t disappear. You can open them even with a simple “Notepad.”
Connections between notes. Ideas don’t lie as separate sheets, but connect with links into a single network of knowledge — over time this turns into your “second brain.”
Flexibility. Plugins let you tailor the program to yourself: from a simple diary to a complex task system, like in this article.
A paper notebook is wonderful. But it has one downside: what you wrote yesterday stays “yesterday.”
Tasks don’t carry over by themselves, habits don’t add up into a chart, and thoughts get lost between the pages.
In Obsidian it’s all different. The daily note becomes the centre of your day:
🔁
Tasks carry over by themselves and come from projects
📅
Calendar syncing with Google Calendar
✅
Habits buttons and progress charts
💭
Thoughts a free field for ideas and reflections
Waking up in the morning, I immediately remember what I was busy with yesterday. Uncompleted tasks are automatically carried over to today. Simple routines — habits, meditation — I mark with one button, and they add up into clear dynamics. And I take new tasks straight from my projects, which are linked to my goals.
This simple system keeps me focused: I do what’s really needed, rather than procrastinating. Let’s build it together.
A full description of my system and the PARA structure is in the previous materials on the site.
To keep tasks, thoughts and habits in Obsidian, we’ll need a few plugins and one built-in setting.
🧩 What a plugin is and where to get it
A plugin is an add-on that adds a new function to Obsidian. Something like a browser extension.
Obsidian itself can do a little: write and link notes. But buttons, charts, syncing with the calendar — all of that appears precisely thanks to plugins.
All the plugins are free and installed in a couple of clicks right inside the program: Settings → Community plugins → Browse → search by name → Install → Enable.
Community plugins
We open Settings → Community plugins → Browse and install one by one:
Plugin
What it’s for
Dataview
Gathers data from notes (e.g. thoughts by day, charts)
Meta Bind
Turns note properties into buttons and fields right in the text
Homepage
Makes a home page that opens on launch
Templater
Runs scripts when a note is created (carrying over tasks)
Buttons
Creates buttons that launch commands in one click
QuickAdd
The “brain” of the buttons: runs macros and scripts
After installing Dataview, go into its settings and enable all the checkboxes (especially Enable JavaScript Queries and Enable Inline JavaScript Queries) — without this the calendar widget won't work.
Enabling the built-in “Daily notes”
Obsidian can keep a diary right “out of the box.” We go to Settings → Core plugins and enable Daily notes. Then we configure them for ourselves.
📅 What "Daily notes" are
This is a built-in Obsidian feature: one note for each calendar day.
You press the “today” button — and the program itself creates (or opens) a note with today’s date in the title, for example 20-06-2026.
The convenience is that each day gets its own permanent “place.” You always know where to look for the entries for a specific date, and the notes automatically line up into a diary-chronology.
Three key settings:
The note-title format. For me it’s just the day, month and year:
DD-MM-YYYY
This matters: all my code (the widget, carrying over tasks) looks for notes precisely in the DD-MM-YYYY format. If you want to add the day of the week to the title — add the letters (e.g. dddd), but then fix the format in the code too. Which letter is responsible for what is handy to look up on format.cm (the Moment.js documentation).
The folder for new notes. For me the daily notes are in 2. Areas/Дневники/Ежедневные заметки. I keep everything by the PARA structure, and keeping a diary is an “area of life” (Area), so its place is in the Areas folder.
🗂️ What PARA is (a folder system)
PARA is a simple way to sort all your notes into four folders, so nothing gets lost:
• Projects — what you’re working on right now and that has a concrete result.
• Areas — what you maintain constantly: health, finances, and including keeping a diary.
• Resources — materials and knowledge on interesting topics “for the future.”
• Archive — what’s no longer relevant, but you’d be sorry to delete.
A diary is something you keep constantly, so it lives in the Areas folder.
The template. This is the structure by which each new note will be created. My template is in 0. Files/4. Templates/Шаблон ежедневных заметок. “Templates” means templates.
This is what the structure of my daily note looks like:
Properties → week/calendar widget → plans for the day → carrying over tasks → habits → food → thoughts.
It’s not always possible to fill in everything. But the very striving makes me more disciplined.
For those who don't want to figure it out for ages
Try my ready-made Obsidian template and start systematising your information today
Let’s open the template and go through it from top to bottom. The first thing we see is the note’s properties (they’re also called YAML or frontmatter).
What’s their point? Properties are the “official” data of a note, which other plugins read easily. For example, the habits chart takes its information precisely from the properties, not from the ordinary text. This rule is worth remembering: what’s important for charts and automation — store in the properties.
Properties are written at the very top of the note between two lines of three dashes:
Habits (Спорт, Чтение, Прогулка) — the “checkbox” type. false means “not yet done.”
Food (Завтрак, Обед, Ужин, Перекусы, Итого_ккал) — the “text” type, here we write down what we ate, and a calorie counter.
Adding your own property is simple: in properties mode click "+ Add property", type the name and choose the type (text, number, checkbox, date). After a couple of days of filling it in, you'll already see the dynamics on a chart.
Step 3. Syncing with Google Calendar and tasks
Right under the properties in the template comes a big block of code. Don’t be scared — it was written by an AI, and I just pasted it. This code draws a beautiful widget: it shows the day of the week, the progress for the week, and in “Tasks” mode — syncs with your Google Calendar and Google Tasks. Right from Obsidian you see the events and tasks for the day, you can mark them as done and add new ones.
For this to work, the code in the template alone isn’t enough. You need to give Obsidian access to your Google account. This is done via the free Google Apps Script service. Let’s go through it step by step — slowly and in detail.
☁️ What Google Apps Script is and why it's needed
Google Apps Script is a free service from Google where you can run small programs that work with your own Google services (Calendar, Tasks, Mail).
Why is it here? Obsidian can’t directly look into your Google Calendar. So we create a small “intermediary”: a program that lives on Google’s servers, sees your calendar and gives the data via a special link.
Obsidian accesses this link — and gets the list of events and tasks. No programming is required from you: you just need to paste the ready code and go through the setup step by step below.
Delete all the text in the editor and paste the code I give below.
3
Connect the Google Tasks API service: on the left in the "Services" menu (the "+" icon) find Tasks API and click "Add". Without this step the code won't see your tasks.
Step 3 is skipped most often. The code uses Tasks.Tasklists.list(), and that's an "advanced service." If you don't add Tasks API, the script will crash with an error.
Here’s the code you need to paste into the editor (it’s responsible for reading events/tasks and for creating/closing tasks):
Google won’t let the code touch your calendar until you personally allow it. Let’s do this once manually:
1
In the function dropdown at the top, choose testAuth and click "Run" (▶).
2
An "Authorisation required" window will appear → click "Review permissions" and choose your Google account.
3
A scary screen "Google hasn't verified this app" will appear. This is normal — the app is your own. Click at the bottom "Advanced" → "Go to … (unsafe)".
4
Click "Allow". Done — access is granted. In the Logs you'll see your task lists.
The "Google hasn't verified the app" screen appears for everyone's personal scripts. You aren't passing data to anyone outside — the code works only in your account.
3.3. Deployment and which link to copy
Now let’s make a real web address from the code, which Obsidian will access:
1
At the top right click "Deploy" → "New deployment".
2
Click the type-selection gear and choose "Web app".
3
Fill in: • Execute as: "Me" (your account) • Who has access: "Anyone"
4
Click "Deploy". Copy the "Web app URL" — that's the very link that ends in /exec.
Copy precisely the link that ends in /exec. A link with /dev won't work in Obsidian.
Now we paste the widget code into the daily-note template. This is a ```dataviewjs block that draws a card with the week and the calendar. The most important thing — in the first line replace the link in quotes with yours from step 3.3:
This is what it looks like at the start of the widget code (you only replace the line with GAS_URL, don’t touch the rest):
```dataviewjs
const GAS_URL = "https://script.google.com/macros/s/AKfyc…………/exec";
const obsidian = require("obsidian");
const fileName = dv.current().file.name;
const m = fileName.match(/^(\d{2})-(\d{2})-(\d{4})$/);
if (!m) {
dv.paragraph("⚠️ The note title must be in the DD-MM-YYYY format");
} else {
// … then comes the long widget code: week, progress,
// the "Tasks" button, loading events and tasks from the calendar …
}
```
The full widget code (click to expand)
This is the same block that’s in my template. Copy it whole — from the line starting with the word dataviewjs, and to the closing backticks — into the daily-note template. Replace only GAS_URL in the first line with your link from step 3.3.
Done! Now in the note you see the tasks for today, overdue tasks are highlighted in red, tasks can be marked as done and new ones added. It’s especially convenient on the phone: opened the widget — and quickly jotted down your tasks.
Checking that it works. Open your link in the browser, adding ?debug=1 at the end. If you see JSON with a list of your tasks — the server is working correctly.
For those who don't want to figure it out for ages
Try my ready-made Obsidian template and start systematising your information today
Each such label is one button that I press during the day:
Button
What it launches
🃏 Spaced repetition
Recall the material I’m learning
💪 Workouts
Today’s exercises (change automatically by muscle group)
🙏 Morning
My morning ritual — meditation and concentration
📋 Task
Open the projects and take a task from there (the main button!)
😌 Face
A personal skincare routine
⚡ What QuickAdd is (what's hiding behind the buttons)
QuickAdd is a plugin that launches pre-configured actions with one command.
In the button’s code, the line action QuickAdd: … means: “press the button — do this action from QuickAdd.” And the action can be anything — open a specific note, create a new one by template, or run a whole script.
Simply put: the button is the “face”, and QuickAdd is the “brain” that decides what happens on the press.
These functions were added gradually. At first the note had only the morning ritual. Then I added spaced repetition, workouts and the rest — as needed, so as not to overload the brain. I advise you too to start with one or two buttons.
Step 5. How the buttons (Buttons) work — in simple words
The most frequent misunderstanding of beginners: “why is `button-sport` written in the note, but a beautiful button appears?” Let’s figure it out.
The logic is divided into two parts: where the button is described and where it’s shown.
1. The "MOC - Buttons" note Here lie the full descriptions of all the buttons (code + the ^button-… label). This is the "warehouse" of buttons.
→
2. The daily note Here there's only the short label `button-sport` — and the plugin substitutes the button from the "warehouse."
Why so complicated? So as not to copy the long button code into every note. Described it once — insert it with a short label as many times as you like.
What a button description looks like
All my buttons are stored in one note MOC - Buttons (or just “Buttons”). Here’s an example of one button’s description:
```button
name 💪 Workouts
type command
action QuickAdd: Open workouts
color black
class btn-inline
```
^button-sport
Let’s go through it line by line:
nameWhat's written on the button (can be with emoji).
type commandThe "command" type — the button launches an Obsidian command.
actionExactly which command to launch (here — a choice from QuickAdd).
color / classThe appearance. btn-inline — a compact inline button.
^button-sport⭐ The main thing: the label (block id). This is the button's "address."
What ^button-... and the label in the text are
The line ^button-sport right under the code block is a block id (a block anchor) in Obsidian. It gives the button a unique address.
After this, in any note it’s enough to write the label as inline code (in single backticks):
`button-sport`
The Buttons plugin sees this label, finds the needed description by the address ^button-sport and draws a working button in its place. You can put several labels in a row in one line — you’ll get a row of buttons.
The rule is simple:
^button-name (with the “caret”) — this is where the button is described.
`button-name` (in quotes) — this is where the button is shown.
The name after button- must match.
How to create your own button from scratch
1
In the "MOC - Buttons" note, copy any ready ```button … ``` block.
2
Change the name (the label) and the action (which command to launch).
3
Below, set a unique label, for example ^button-water.
4
In the needed note write `button-water` — and the button will appear.
Step 6. The main “Task” button: connecting the diary and projects
The ”📋 Task” button is one of the main ones. Its label is button-work-on-project, and it launches the project-to-daily script via QuickAdd.
First, about where the tasks come from. All my projects are in the MOC - Projects note (the 1. Projects folder by the PARA structure). This is a kanban board on the Kanban plugin: just task cards that are dragged from status to status.
💡 Ideas
→
🔄 In progress
→
✅ Done
The “Task” button does two smart things:
Pulls tasks from the projects into the diary. A window with your kanban board opens, you tick the needed cards and click “Add” — they appear in the “My plans for the day” section.
Moves tasks across the board on completion. When you mark a task as done (- [x]) right in the diary, it automatically moves to the next column of the kanban (e.g. from “In progress” to “Done”) and is removed from the note.
There's also a "turbo mode": if you turn on the "🏁 To the last" toggle (or add the 🏁 icon to the task), on completion it'll go straight to the very last column of the board.
What to replace in the script for yourself
The script is in my 0. Files/4. Templates/Scripts/project-to-daily_01.js. If you take it for yourself, at the very top there are two lines that need to be configured for your system:
const MOC_PATH = "1. Projects/MOC - Projects.md"; // ← the path to YOUR kanban boardconst LAST_COLUMN_MARKER = "🏁"; // ← the "straight to the last column" icon
MOC_PATH — specify the path to your main kanban board with projects (what it’s called and which folder it’s in).
LAST_COLUMN_MARKER — the marker icon for “turbo mode.” You can leave 🏁 or put any of your own.
Another important point: the script looks for where to insert tasks by the heading # Мои планы на день (My plans for the day). This heading must be in your daily note — otherwise tasks will be added at the end.
The full code of the project-to-daily script (click to expand)
It’s connected via QuickAdd as a User Script in a macro, and the macro is called by the “Task” button.
Step 7. Automatically carrying over uncompleted tasks
In the template, besides the buttons, there’s one more piece of code — it carries over uncompleted tasks from the previous day to today. It works on the Templater plugin: when a new note is created, the code fires once and turns into an ordinary task list.
🛠️ What Templater is
Templater is a plugin for “smart” templates. An ordinary template just inserts the same text. But a Templater template can think: substitute today’s date, the day of the week, or, as in our case, find yesterday’s uncompleted tasks and carry them over.
It works once — at the moment a note is created. The code (it’s written between the <% and %> markers) fires and disappears, leaving an ordinary ready text in its place.
You don’t need to understand it: it’s enough to paste the code into the template once — after that everything happens automatically.
The logic is simple and very convenient:
📄 Yesterday's note find the last note before the current day
→
🔍 We look for "- [ ]" gather all the unclosed tasks
→
📥 Today insert them into the new note
Here’s this code from the template (it’s pasted as is, nothing needs to be changed — except, if you wish, the path to the daily-notes folder):
<%*const moment = tp.obsidian.moment;const fn = tp.file.title;const date = moment(fn, 'DD-MM-YYYY');// On Sundays we add a backup buttonif (date.isValid() && date.day() === 0) { tR += '- [ ] `button-local-backup`\n';}const pathToDailyNotes = "2. Areas/Дневники/Ежедневные заметки"; // ← your pathconst currentDate = moment(tp.file.title, 'DD-MM-YYYY');const today = moment().startOf('day');const referenceDate = currentDate.isAfter(today) ? today.clone().add(1, 'day') : currentDate;function findLatestDailyNoteBeforeDate(beforeDate) { const folder = app.vault.getAbstractFileByPath(pathToDailyNotes); if (!folder || !folder.children) return null; const dailyFiles = folder.children .filter(file => { if (file.extension !== "md") return false; if (!file.name.match(/^\d{2}-\d{2}-\d{4}\.md$/)) return false; const fileDate = moment(file.name.replace('.md', ''), 'DD-MM-YYYY'); return fileDate.isBefore(beforeDate) && fileDate.isSameOrBefore(today); }) .sort((a, b) => { const dateA = moment(a.name.replace('.md', ''), 'DD-MM-YYYY'); const dateB = moment(b.name.replace('.md', ''), 'DD-MM-YYYY'); return dateB.valueOf() - dateA.valueOf(); }); return dailyFiles.length > 0 ? dailyFiles[0] : null;}if (!currentDate.isValid()) { tR += `❌ Couldn't determine the date from the file name. Format: DD-MM-YYYY.`;} else { const yesterday = referenceDate.clone().subtract(1, 'day').format('DD-MM-YYYY'); let targetFile = app.vault.getAbstractFileByPath(`${pathToDailyNotes}/${yesterday}.md`); let targetDate = yesterday; if (!targetFile) { targetFile = findLatestDailyNoteBeforeDate(referenceDate); if (targetFile) targetDate = targetFile.name.replace('.md', ''); } if (!targetFile) { tR += `❌ No daily notes before ${referenceDate.format('DD-MM-YYYY')}.`; } else { const fileContent = await app.vault.read(targetFile); const tasks = fileContent.split("\n").filter(line => line.trim().startsWith("- [ ]")); if (tasks.length === 0) { tR += `✅ No uncompleted tasks for ${targetDate}.`; } else { tR += `## 🔁 Uncompleted tasks from ${targetDate} (the last note)\n\n`; tR += tasks.join("\n"); } }}%>
If your diary had a gap of several days, the script will still find the last note before the current day and pull the tasks from it — nothing gets lost. You only need to change pathToDailyNotes if you have a different folder.
Step 8. Habit and food buttons (Meta Bind)
Next in the template come the habits. They work on the Meta Bind plugin, which lets you edit a note’s properties right from the text — no need to scroll up and open the properties panel.
🔗 What Meta Bind is
Meta Bind links a note’s properties (the same ones from step 2) with convenient elements right in the text: toggles, checkboxes, input fields.
Without it, to mark a habit you’d have to scroll up and change the property manually. With it — you just flip the ”🏃 Sport” toggle as you go through the note, and the checkbox is set in the properties by itself.
An entry like INPUT[toggle:Спорт] means precisely: “put a toggle here, linked to the Спорт property.”
`INPUT[toggle:Спорт]` 🏃♂️ Sport
`INPUT[toggle:Чтение]` 📖 Reading
`INPUT[toggle:Прогулка]` 🚶♂️ Walk
Here INPUT[toggle:Спорт] is a toggle linked to the Спорт property. You flipped the toggle in the body of the note — the checkbox is automatically set in the properties. And since the charts take the data precisely from the properties, your habit immediately gets into the statistics.
Food is set up the same way, only via text fields:
At the end there’s the button-calories button — ”🌮 Count calories”. This is my personal button that uses AI to estimate the calorie count from what I entered in the food fields.
It's not possible to fill everything in perfectly every day — and that's normal. But even a couple of filled-in days a week give clear dynamics on the habit and calorie charts.
Step 9. Thoughts — the most important section
And the most important thing — at the very bottom of the template is the “Thoughts” section. There’s no code or template here. It’s an absolutely empty space for reflection.
Here I write down during the day:
tasks for the future and ideas;
problems that worry me;
reflections and observations.
If I can't solve a task right now, I don't pressure myself. I write in "Thoughts" why I can't take it on. Often it turns out that the brain is stuck on another, external task — and the awareness of this itself removes the stupor.
These thoughts work for me further on too:
On the home page. Tomorrow I’ll see yesterday’s thoughts in a special block on the home page (Homepage).
In the MOC - Дневники note. There’s code there that gathers thoughts from all the daily notes and shows them by month — day by day. New tasks and atomic notes are born from them.
From the phone. I have a widget set up that writes a thought straight into the right section of today’s note. Indispensable when an idea comes on the street.
The code: all thoughts from all daily notes by month
This block I paste into a separate note MOC - Дневники (it’s in my 2. Areas/Дневники). It goes through all the daily notes of the month, pulls the “Thoughts” section out of each (and also the properties Мысль_дня and Инсайт_дня, if they exist) and outputs them as a list. The ”← Previous / Next →” buttons flip through the months, and ”🔽 Newest first” changes the sorting.
What to replace for yourself
In the code there’s one line with the path to the daily-notes folder — put your path:
Also the block looks for the heading ## Мысли (Thoughts) and the property Дата (Date) in the notes. If your section is named differently (e.g. # Мысли) — it’ll still work (it looks for 1 to 3 hashes). The Дата property must be in the daily note’s properties in date format.
Copy the block whole — from the line with the word dataviewjs and to the closing backticks:
📷 Screenshot: the MOC - Дневники note with a list of thoughts by month and toggle buttons (insert an image here)
The home page: habits and thoughts
Every morning Obsidian opens for me not on an empty spot, but on a home page (the MOC - HOME note, the Homepage plugin). On it I immediately see the two most important things: the habits chart for the current month and yesterday’s thoughts. So the day starts with a short “overview of myself.”
🏠 What Homepage is
Homepage is a plugin that makes a chosen note the “home” one: it’s precisely the one that opens on launching Obsidian (and via the home button).
It’s convenient to make a dashboard the home page — a note with charts, buttons and a summary. Then every launch of the program starts with an overview, rather than an empty screen.
This block consists of two tabs — “Habits” and “Thoughts”. The “Habits” tab builds a completion chart for the month (it takes the data from the daily notes’ properties). The “Thoughts” tab shows the “Thoughts” section from yesterday’s note.
What to replace for yourself
At the start of the code there’s one line with the path to the daily-notes folder — specify your path:
And in the habits array, list your habits — the names must exactly match the property names in the template (Спорт, Чтение, Прогулка, etc.).
For the habits chart you need the Obsidian Charts plugin (it provides the window.renderChart function). Install it the same way as the rest: Browse → "Charts" → Install and enable.
Copy the block whole — from the line with the word dataviewjs and to the closing backticks:
I haven’t given up paper completely — sometimes it’s pleasant to write by hand. In my system there’s a button for this — ”📸 Photo to text” (the label button-image-2-text, the script image-to-text).
The logic is simple: I photograph a page of the paper notebook → the button recognises the handwritten text using AI → I can copy it into the daily note or create a new note from it.
📓 A paper sheet
→
📸 Photo to text (AI)
→
📝 Text in a note
And I also love drawing diagrams by hand — and any such drawing is easily inserted right into a note (via the Excalidraw plugin or the same drawing button). So keeping a diary in Obsidian is not limited in functionality: paper, drawings, voice, photos — everything flows into one place.
The takeaway
That’s the whole system. It looks large-scale, but it’s assembled from simple building blocks:
1.Plugins: Dataview, Meta Bind, Homepage, Templater, Buttons, QuickAdd.
2.The built-in "Daily notes" + a template in the Areas folder (PARA).
3.Properties (YAML) for habits and food.
4.The Google Calendar widget via scripts.google.com.
5.Buttons and a script connecting the diary with the projects.
6.Auto-carryover of tasks, habits, food and the thoughts section.
The main advice: don't implement everything at once. Start with the enabled daily notes and one morning-ritual button. When that becomes a habit — add the task carryover, then the calendar, then the projects. The system should unload the brain, not load it.
In the next materials I’ll show how I made myself a plugin for reading books (I highlight fragments and create notes from them) and how I clarify information with AI right in the process of reading.
For those who don't want to figure it out for ages
Try my ready-made Obsidian template and start systematising your information today