Releases: mcuste/obsidian-gcal-sync
Release list
0.5.0
Added
-
Clicking the icon on a declaration opens a panel to pick its date, time, length, and repeat, rather
than typing the directive. It works on a chip in Live Preview and Reading view, on agcalchip in
the properties widget, and on the marker beside a declaration shown as written, which is how a
declaration with a typo is fixed. The panel shows what it will write, in words and as text, before
you apply it.Applying rewrites that one declaration and nothing else in the note. In Live Preview it goes through
the editor, so one undo takes it back. It leaves alone what it cannot own: a start that is not
written stays unwritten, a repeat that belongs to a whole line or note stays where it is, a UTC
offset is kept, and a rule it cannot phrase stays a text field. A code span holding two events, two
repeats, or an unknown directive gets no panel at all.This is the only thing in the plugin that writes to a note. Sync itself still never does. The new
Pick dates from a declaration setting, on by default, removes the panel when turned off.
Fixed
- Changing a declaration from an all-day event to a timed one, or back, no longer breaks the sync.
Google merges an update into the event it already holds, so the olddatestayed next to the new
dateTimeand every sync from then on failed with "Invalid start time". Nothing synced at all
while that lasted, which left any extra copy of an event on the calendar and every declaration
showing the grey "not synced yet" marker.
0.4.0
Added
- A declaration you are not editing now becomes a chip with the date, the time, and the repeat in
words, led by the sync icon, instead of the text with an icon after it. Click a chip to get the
text back and edit it. The text still shows while the cursor is inside it, and when the
declaration could not be read. - The
gcalnote property gets the same chips: over the YAML with Properties in document on
Source, and over Obsidian'sgcalfield on Visible, when it holds one value or a list of maps. - Render declarations, a new setting, on by default. Turn it off to always see the text.
0.3.4
Fixed
- A note whose only declaration is a repeat on its own, such as
`gcal-repeat:daily`, now
syncs. The note was skipped before it was ever parsed, because the check for whether a note is
worth parsing looked forgcal:only. - Reading view now marks a declaration written as a repeat on its own, such as
`gcal-repeat:daily`, and no longer drops the markers on every declaration in a section after
the first one.
0.3.3
Fixed
- Two devices syncing the same vault no longer duplicate events. Each declaration now reserves the
Google event ID it is created under, so a second device asking for that ID at the same moment
writes the existing event instead of adding a copy. - The vault ID is now always the hash of the vault name, rather than a stored one taking precedence,
so two devices holding the same vault agree on it and stop duplicating each other's events. Events
stamped with a random ID kept by an earlier release are no longer recognized, and have to be
deleted in Google Calendar. - Extra copies of an event are removed without waiting for approval and without being held back
while a note cannot be read, since one copy always survives. The copy Google created first is the
one kept, and the sync notice counts the copies removed.
0.3.2
Changed
- The README leads with how sync works and the event syntax, with labeled diagrams for a
declaration and the sync flow, and no longer carries an install section. - The docs are shorter and use plainer wording. Settings and troubleshooting are now reference
tables. No behavior changed.
0.3.1
Fixed
- A vault opened without the plugin's
data.json, such as on a second machine, now takes its vault
ID from the vault name instead of a random one, so it finds its events instead of duplicating
them. A stored vault ID is left alone.
0.3.0
Added
- Standalone inline recurrence declarations, such as
`gcal-repeat:daily`, create an all-day
event beginning today.everydayis accepted as an alias fordaily.
0.2.0
Changed
- The settings tab is built with Obsidian's declarative settings API, so its settings are found by
Obsidian's settings search. The event syntax and trust model text is split into named rows. - An unrecognized event time zone, or an interval or change limit below 1, is rejected with a
message under the setting instead of being ignored. minAppVersionis now 1.13.0, the first Obsidian version with the declarative settings API.- OAuth authorization deadlines use the active window's timers, so sign-in also works from a
popout window. - Status markers and destructive actions use Obsidian's current UI helpers and button styling.
0.1.0
Added
- One-way sync from vault notes to Google Calendar. Notes are the source of truth, each sync makes
the calendar match them, nothing is written back into a note, and only events the plugin created
for this vault are ever touched. - Inline declarations in backticks,
`gcal:2026-08-18T14:00/PT1H`, titled by the text in front
of them. Only a code span holding nothing but directives counts, so a note can describe the
syntax without declaring events. - Note-property declarations, as a single value or a list of
when,title, andrepeatmaps,
with a note-levelgcal-repeatthat every entry inherits. - Starts as a date for an all-day event, a local timestamp read in the event time zone, a bare time
meaning today, or an exact instant carryingZor a UTC offset. A bare time is pinned to the
date its event already has on Google, so it does not walk forward day after day. - Recurrence by name (
daily,weekdays,quarterly), weekday lists and ranges,
every-N-day/week/month/yearintervals, or a raw RRULE. - Status markers on each declaration in Live Preview and Reading view: synced, pending, blocked by
a sibling, and error with the reason on hover. - Event identity from a declaration's position, hashed with the vault ID before upload so note and
folder names stay on the device. A declaration that only moved is rekeyed in place rather than
deleted and recreated, so guest replies and reminders survive. - Guard rails against a note changing the calendar unintentionally: approval for large or
destructive plans, a per-sync change limit, deletions held back while any note is unreadable, and
a synced-folder allowlist. - Google sign-in with the authorization code flow and PKCE over a loopback callback, storing the
client credentials and refresh token in Obsidian's secret storage. Calendar selection and
creation from the settings tab, and a disconnect action that revokes the refresh token with
Google. - Setup, event syntax, settings, sync, security, troubleshooting, and development documentation
underdocs/.
First public release. The plugin ships no Google credentials, so each user supplies their own
Google Cloud OAuth client.