Full Year in New Tab is a Chrome MV3 extension that replaces the new tab page with a local, full-year calendar. It gives you a quick view of the current year, today's date context, year progress, and calendar display preferences every time you open a new tab.
- Full-year calendar on every new tab
- Today highlighting and selected date context
- Day-of-year, remaining-days, and year progress display
- Optional ISO week numbers
- Optional quarter labels and quarter boundaries
- Optional month numbers
- Sunday or Monday week start
- Balanced, planning, wall calendar, and dense display modes
- Comfortable or compact density
- Light, dark, or system theme
- Weekend, workday, or no day emphasis
- Keyboard-friendly date navigation
- Local settings with reset and erase controls
The extension is designed to work locally inside the browser. It does not collect, transmit, sell, or share user data.
The extension has:
- No permissions
- No host permissions
- No analytics
- No telemetry
- No tracking pixels
- No cookies
- No remote requests
- No remote assets
- No Chrome sync storage
- No background worker
Calendar display preferences are stored only on the device in localStorage under fyi:calendar-settings. See docs/PRIVACY.md for the full privacy handoff.
Install dependencies:
npm installRun the local Vite dev server:
npm run devRun checks:
npm run typecheck
npm test
npm run buildBuild the extension:
npm run buildThen open Chrome's Extensions page, enable Developer mode, choose Load unpacked, and select the generated dist/ directory.
After loading the built extension in Chrome, run a quick browser-level check:
- Open a new tab and confirm the full-year calendar renders.
- Open Settings and change the display mode.
- Toggle week numbers and quarter labels.
- Switch between light, dark, and system themes.
- Reload the new tab and confirm settings persist.
- Use Erase local data and confirm defaults return.
Full Year in New Tab is intentionally focused on a local full-year calendar. It does not include:
- Events or reminders
- External calendar integration
- Accounts, cloud sync, or cross-device sync
- Analytics or productivity scoring
- Incognito support
Chrome Web Store publishing notes and permission/privacy justifications are tracked in CHROMEWEBSTORE.md.
Before packaging, confirm the release metadata matches the extension behavior:
manifest.jsonandpackage.jsonuse the intended version.CHROMEWEBSTORE.mdstill matches the extension purpose, permissions, privacy posture, and listing copy.- docs/PRIVACY.md still matches runtime behavior.
- Any manifest, permission, privacy, screenshot, or listing copy changes are documented before submission.
For the current extension posture, the manifest should still have no permissions and no host_permissions.
Run the checks directly while developing:
npm run typecheck
npm test
npm run buildThe release script repeats the required checks before creating the archive.
npm run releaseThe release script:
- Runs
npm run typecheck. - Runs the Vitest suite.
- Removes and rebuilds
dist/. - Reads the version from
dist/manifest.json. - Creates
full-year-in-new-tab-v<version>.zipfrom the root contents ofdist/.
Review the unzip -l output printed by the release script. The archive should include:
manifest.jsonnewtab.htmltheme-bootstrap.js_locales/icons/assets/
Before uploading, confirm:
- No source maps are present unless intentionally enabled.
- No unexpected font assets are present.
- No remote assets or remotely loaded code were introduced.
- No manifest permissions or host permissions were added unless explicitly documented in
CHROMEWEBSTORE.md.
For the existing live extension:
- Open the Chrome Developer Dashboard.
- Select the existing Full Year in New Tab item.
- Open the package/upload area for the item.
- Upload
full-year-in-new-tab-v<version>.zip. - Confirm the uploaded package version is greater than the currently published version.
For a first-time listing, use the dashboard's new item flow instead of updating an existing item.
Review the Store listing before submission:
- Update listing copy, screenshots, category, or distribution only if they changed for this release.
- Keep the single purpose aligned with
CHROMEWEBSTORE.md. - Keep privacy practices aligned with docs/PRIVACY.md.
- For the current release posture, disclose that the extension does not collect user data.
- For the current manifest, there are no permissions and no host permissions to justify.
- Confirm the package uses local extension code and does not rely on remote assets or remote scripts.
Submit the uploaded package for Chrome Web Store review.
If you want to control the exact publication time after approval, use the dashboard's deferred publishing option if available for the item.
After approval or publication:
- Verify the public listing shows the intended version, screenshots, and description.
- Install or update the extension from the Chrome Web Store.
- Open a new tab and smoke-test the calendar, settings, theme, and local data erase flow.
- If a bad update is still in review, cancel the submission in the dashboard.
- If a bad update has already published, follow Chrome Web Store rollback guidance and submit a corrected package.