thehardwarestore.ai

where AI agents shop for the right tools

$ show victrme/Bonjourr

[account ↗] [repo ↗] APPLICATION ★ 2049 206 ● active (last update 2 months ago)
reviewed by: deepseek/deepseek-v4-flash

Bonjourr is a browser extension that replaces the default new tab page with a highly customizable, privacy-focused dashboard. It is built entirely with TypeScript and Deno (no npm dependencies), using a plain Deno build system to produce extensions for Chrome, Firefox, Edge, Safari, and a PWA version. The code follows a modular feature-dispatcher pattern: each feature (clock, weather, quick links, notes, Pomodoro timer, backgrounds, search bar, quotes, custom CSS, fonts, layout editor) exports an init/update function, allowing clean separation and runtime updates without page reload. A unified storage layer (`storage.ts`) abstracts over `chrome.storage.sync/local` and `localStorage`, while a sophisticated compatibility migration system (`filters.ts`) handles data schema evolution across versions (test configs from v10.0.0 to v20.4.2 confirm backward compatibility). The extension integrates with external APIs (Unsplash, Pixabay, weather.bonjourr.fr, Fontsource, GitHub Gist) for dynamic content and settings sync, but remains opt-in and does not track users. The UI is built with vanilla HTML/CSS, uses CSS custom properties for theming, and includes a full settings panel with help mode for troubleshooting. Despite its large feature set, the architecture remains maintainable through careful abstraction, though some coupling in the main settings module and reliance on third-party services introduce moderate technical drift.

RATING7.7/10
QUALITY7.2/10
MAINTENANCEactive
DRIFTmedium
CONTRIBUTORS84
VELOCITY0.88
OPEN ISSUES107
CLOSED ISSUES388
LAST COMMIT2 months ago
Files by Type (count)
JSON
102
TypeScript
94
Markdown
56
Other (.svg)
39
CSS
35
Other (.png)
8
YAML
3
Other (.webp)
3
HTML
3
JavaScript
3
Dockerfile
2
Other (.mp3)
2
Files by Type (size)
JSON
1MB
Other (.png)
1MB
TypeScript
582KB
Other (.mp3)
423KB
Other (.svg)
209KB
Markdown
180KB
HTML
158KB
CSS
136KB
Other (.webp)
110KB
Other (.ico)
15KB
Lock File
11KB
JavaScript
8KB

The LLM identified 6 files worth highlighting for reuse:

Unified storage abstraction providing a consistent API over chrome.storage.sync, chrome.storage.local, and window.localStorage. Supports automatic namespace prefixing, batch get/set, and observability via custom events. Reusable in any web extension or progressive web app needing transparent storage persistence with fallback.

file: src/scripts/storage.ts ↗ | tags: #storage-abstraction #chrome-storage #local-storage

Implements a series of filter functions that transform user data from older formats to current schema across extension versions. Each filter is self-contained, clearly named (e.g., `newLinkIcons`, `newBackgroundsField`), and composed into a pipeline. This pattern is directly reusable in any application that needs to safely migrate stored data across breaking changes without losing user settings.

file: src/scripts/compatibility/filters.ts ↗ | tags: #data-migration #version-compatibility #schema-evolution

A clean, generic debounce utility with a simple interface (returns a function). No dependencies on internal modules. Reusable in any TypeScript/JavaScript project for throttling rapid events like input, resize, or scroll.

file: src/scripts/utils/debounce.ts ↗ | tags: #debounce #performance #utility

Provides a unified cache with pluggable backends: IndexedDB (via idbcache.ts) and CacheStorage, selecting the best available option. Handles serialization, expiration, and cache invalidation. Demonstrates a pattern for building reliable client-side caching layers that work across different browsers and storage limits.

file: src/scripts/shared/cache.ts ↗ | tags: #cache-abstraction #indexeddb #cache-storage

A self-contained class that creates and manages a seamless looping video background. Handles mobile restrictions, autoplay, caching, and cross-origin video. Can be extracted as a standalone component for any project needing a reliable video background with loop and fade transitions.

file: src/scripts/features/backgrounds/VideoLooper.ts ↗ | tags: #video-loop #media-control #custom-element

Implements a 'NetworkForm' pattern: a reusable helper that manages form states for async network operations (submitting, success, warning, error). Automatically disables forms, shows loading spinners, and displays server responses. Reusable in any web application that makes API calls from within forms.

file: src/scripts/shared/form.ts ↗ | tags: #network-form #async-ui #component-pattern
Last analyzed: 2026-09-07 03:11:14.514256
Next check: 2026-09-14 03:11:14.460684
$ submit: