<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Google-Calendar on Harshvardhan</title>
    <link>https://harsh17.in/tags/google-calendar/</link>
    <description>Recent content in Google-Calendar on Harshvardhan</description>
    <image>
      <title>Harshvardhan</title>
      <url>https://harsh17.in/img/sharing-image.png</url>
      <link>https://harsh17.in/img/sharing-image.png</link>
    </image>
    <generator>Hugo</generator>
    <language>en</language>
    <lastBuildDate>Mon, 04 May 2026 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://harsh17.in/tags/google-calendar/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Firefox Calendar Sidebar</title>
      <link>https://harsh17.in/firefox-calendar-sidebar/</link>
      <pubDate>Mon, 04 May 2026 00:00:00 +0000</pubDate>
      <guid>https://harsh17.in/firefox-calendar-sidebar/</guid>
      <description>A Firefox sidebar extension that puts a plain mini-month plus a compact agenda of my Google Calendar permanently in the browser&amp;rsquo;s side panel.</description>
      <content:encoded><![CDATA[<p>I keep <code>calendar.google.com</code> pinned somewhere &mdash; a Cmd+Tab away, a bookmark in the toolbar, a tab I never close. None of those solves the actual problem, which is that I want my calendar <em>visible</em>. Not one click away. Not one keystroke away. Just there, on the side, while I work on something else.</p>
<p>Firefox has a real sidebar &mdash; the kind that hosts extension panels alongside the main page; Bitwarden lives there, for example. I built a small extension that puts my Google Calendar in it.</p>
<p><figure>
  <img src="screenshot.png" alt="Calendar Sidebar in Firefox" loading="lazy" /><figcaption>Calendar Sidebar in Firefox</figcaption>
</figure>
</p>
<h2 id="what-it-does">What It Does</h2>
<p>The sidebar has two parts. The top is a plain mini-month calendar: month name, prev/next, today highlighted, click any date to open that day in a new tab. Deliberately no events drawn on the grid; it stays out of the way. The bottom is a compact agenda of my Google Calendar, embedded directly from Google. A reload button, a settings gear, and an &ldquo;Open in tab&rdquo; button sit in a thin toolbar on top.</p>
<p>There&rsquo;s a small options page where you set a <strong>Calendar ID</strong> (your Google account email, in the simple case) and an <strong>account index</strong> (<code>0</code> for your first logged-in Google account, <code>1</code> for the second, etc.). Settings live in <code>browser.storage.sync</code>, so they follow the profile across machines. Mine are set once and I forget the page exists.</p>
<h2 id="building-it">Building It</h2>
<p>The extension is plain JavaScript &mdash; no framework, no build step, no dependencies. It uses Manifest V2, because Firefox supports it well and the <code>sidebar_action</code> API is what makes the whole thing possible.</p>
<p>Three pieces do most of the work. The agenda is Google&rsquo;s <code>htmlembed</code> endpoint in an iframe &mdash; that endpoint, unlike most of <code>calendar.google.com</code>, is designed to be embedded. A small <code>webRequest</code> background script strips <code>X-Frame-Options</code> and <code>Content-Security-Policy</code> from Google&rsquo;s responses, but only when the request comes from this extension&rsquo;s sidebar; other tabs of <code>calendar.google.com</code> are untouched. The mini-month is custom JS, about eighty lines: build a 6×7 grid for the current month, pad with previous/next-month days, highlight today, hook prev/next/Today buttons. A content script also injects <code>html { zoom: 0.85 }</code> into the agenda iframe so more events fit at sidebar widths.</p>
<p>The whole thing is around 350 lines of code spread across <code>manifest.json</code>, <code>sidebar.html</code>, <code>sidebar.js</code>, <code>options.html</code>, <code>options.js</code>, <code>content.js</code>, and <code>background.js</code>.</p>
<h2 id="a-caveat-about-firefox-extensions">A Caveat About Firefox Extensions</h2>
<p>Unsigned extensions in Firefox only persist as &ldquo;temporary add-ons&rdquo; &mdash; they vanish on browser restart. To install permanently, you submit the package to Mozilla as an <em>unlisted</em> self-distributed extension; their tooling signs it, returns an <code>.xpi</code>, and that one installs forever. No public review for the unlisted track, so the round trip takes minutes.</p>
<p>The repo&rsquo;s README has the exact <code>web-ext sign</code> command, and a <code>xpinstall.signatures.required</code> workaround if you&rsquo;d rather use Firefox Developer Edition.</p>
<p>You can find the source on <a href="https://github.com/harshvardhaniimi/firefox-calendar-sidebar">GitHub</a>.</p>
<p>This project was orchestrated into existence by <a href="https://claude.ai/code">Claude Code</a>.</p>
]]></content:encoded>
    </item>
  </channel>
</rss>
