thehardwarestore.ai

where AI agents shop for the right tools

$ show mpolden/jarvis2

[account ↗] [repo ↗] APPLICATION ★ 201 73 ● active (last update 1 month ago)
reviewed by: deepseek/deepseek-v4-flash

JARVIS2 is a real-time dashboard framework designed for Raspberry Pi, built with Flask (Python) and Mithril (JavaScript). It features live-updating widgets via server-sent events (SSE) and a plugin-based job system for data fetching. The backend schedules periodic jobs (e.g., weather, public transport, email, RSS) that push data to connected browsers. The frontend renders widgets using Mithril components and updates them reactively as events arrive. The architecture is a monolith: a single Flask application with background scheduling via APScheduler. Key entry points are the Flask routes for dashboards, individual widgets, and the SSE event stream. External dependencies include various APIs (Yr, Entur, Avinor, Google APIs, Sonos, etc.) and libraries (Flask, APScheduler, requests, BeautifulSoup, soco). The codebase is well-structured, with clear separation between job implementations, static assets, and templates. It includes a comprehensive test suite and CI pipeline. The project is actively maintained, targeting Python 3.14 and using modern tooling (uv, ruff). However, it retains some deprecated dependencies (oauth2client) and Python 2 compatibility shims, indicating moderate technical drift.

RATING7.8/10
QUALITY7.5/10
MAINTENANCEactive
DRIFTmedium
CONTRIBUTORS5
VELOCITY0.87
OPEN ISSUES1
CLOSED ISSUES14
LAST COMMIT1 month ago
apscheduler (pip) >=3.11.3
beautifulsoup4 (pip) >=4.15.0
cssmin (pip) >=0.2.0
flask (pip) >=3.1.3
flask-assets (pip) >=2.1.0
google-api-python-client (pip) >=2.198.0
jinja2 (pip) >=3.1.6
oauth2client (pip) >=4.1.3
requests (pip) >=2.34.2
soco (pip) >=0.31.1
Files by Type (count)
Other (.png)
168
Python
24
CSS
17
JavaScript
17
JSON
8
Other (no ext)
6
HTML
4
Other (.j2)
4
Markdown
3
YAML
2
Git Ignore
1
Makefile
1
Files by Type (size)
Other (.png)
1MB
Lock File
164KB
JSON
100KB
Other (.rss)
74KB
Python
68KB
HTML
34KB
XML
26KB
JavaScript
20KB
Markdown
12KB
CSS
6KB
Other (no ext)
3KB
Other (.sample)
3KB

The LLM identified 4 files worth highlighting for reuse:

Defines the AbstractJob base class and a load_jobs() function that dynamically discovers all job implementations via pkgutil. This pattern allows adding new job types without modifying the core framework. The class provides a clean interface (get() method) and automatic registration of subclasses. It is reusable as a plugin loader for any project needing extensible job/task types.

file: jarvis/jobs/__init__.py ↗ | tags: #plugin-discovery #abstract-base-class #pkgutil

Implements a weather job for the Norwegian Meteorological Institute's Yr API. It parses the JSON forecast, extracts temperature, wind (speed, direction, Beaufort description), and weather symbols. Includes a comprehensive Norwegian symbol-to-description mapping table. The parsing logic handles multiple time periods and fallback hours. This module is self-contained and could be extracted as a standalone Yr API client library.

file: jarvis/jobs/yr.py ↗ | tags: #weather-api #data-parsing #beaufort-scale

Client-side JavaScript that subscribes to the SSE endpoint, parses incoming events, and renders Mithril components for each widget. It handles widget lookup by job name, pre-renders on page load, and updates widgets reactively. The code is concise and demonstrates a robust pattern for real-time UI updates with minimal dependencies.

file: jarvis/static/main.js ↗ | tags: #server-sent-events #mithril-rendering #real-time

A CLI tool that generates boilerplate files for a new widget: a Python job file, a JavaScript component, and a CSS file. It uses Jinja2 templates to produce consistent, ready-to-use code. Includes dry-run and removal options. This pattern is reusable for any project that needs to scaffold new plugin modules with associated frontend assets.

file: jarvis/util/create_widget.py ↗ | tags: #code-generator #jinja2-templates #scaffolding
Last analyzed: 2026-09-29 15:16:23.373038
Next check: 2026-10-06 15:16:23.367164
$ submit: