SolarOS

Community applications

SolarOS Playground

Playground lets you discover, install, and run community Python and Lua applications directly on SolarOS. Connect the device to Wi-Fi and open the catalog:

playground

The first opening downloads the catalog. Use the arrow keys to browse, Enter to inspect an application, d to install it, and r to run an installed copy. Press / to search. Playground also provides shell commands:

playground refresh
playground search QUERY
playground install APP-ID
playground run APP-ID

See the Playground manual for all controls, storage choices, update markers, and source commands.

Extend SolarOS without rebuilding it

Playground applications are scripts and assets rather than firmware packages. They run through the python or lua application already built into SolarOS, so a new tool, experiment, or game can be shared without compiling and flashing new firmware.

Both runtimes expose SolarOS services through the solaros API. Python applications use import solaros; Lua applications use the preloaded solaros table or require("solaros"). The available storage, networking, hardware, TUI, and graphics APIs depend on the board and firmware flavor:

Applications declare their minimum SolarOS version and required board capabilities, allowing Playground to show whether they can run on the current device.

Share an application

The preferred way to share an application is to contribute it to the SolarOS Playground repository on GitHub. Start from an existing Python or Lua example, add the application source and manifest, build the catalog, run its tests, and open a pull request. The contribution guide and manifest reference describe the complete process.

Contributing through the shared repository makes applications discoverable to all Playground users and gives the executable source a public review path.

SolarDrop

SolarDrop is a local Python-based Playground aggregator. It combines locally uploaded applications, the official SolarOS Playground, and other compatible catalogs into one source that your SolarOS device can use.

Forks and self-hosted repositories

You can use a compatible catalog outside the default repository:

SolarOS stores the selected source on the device. Packages are checked against the size and SHA-256 digest in that catalog before installation, but Playground applications are not sandboxed. Only install applications and select repositories whose maintainers you trust.

Current catalog

Available applications.

29 applications in 7 categories, generated from the current community catalog. Select an application to read its repository README.

Games

Music

Social

Accessibility

Utilities

Science

Examples

Python · Version 0.1.0 · SolarOS 4.11.2+

Hex-O-Spell

Hex-O-Spell turns a SolarOS gadget into an accessible BLE keyboard. Its two-stage radial selector provides the alphabet, period, question mark, space, and backspace with six directions and one trigger.

Select a group and trigger it, then select and trigger characters. The group stays open for consecutive characters; select < to return to the group ring. Letters are sent as uppercase characters, matching the original interaction.

Pairing

The first run shows a pairing popup before BLE advertising starts. Tap Pair or trigger it with Enter or Space; pairing never starts merely by opening an unpaired app. Enter the displayed six-digit passkey on the remote computer. SolarOS stores the BLE bond, and the app records successful bonding so later runs advertise for the remembered host automatically.

Open Settings and choose Pair new host to pair or replace a host. The old host may need Bluetooth disabled while the new computer connects. The --pair argument is the explicit command-line equivalent.

Controls

  • Pointer: moving over an outer hex highlights it. A touch press or mouse click
  • triggers the highlighted hex; the last pointer coordinate remains highlighted.

  • Joystick: normalized X/Y coordinates highlight a hex, while the physical
  • neutral position highlights the center. Enter or Space triggers; automatic trigger also supports joysticks without a button.

  • Keyboard: Left or Up advances around the six outer hexagons; Right or Down
  • moves in the opposite direction. Space or Enter triggers the highlighted hex.

  • Settings: press Tab from the ring. Use Up/Down to move, Left/Right or -/+
  • to change dwell time, Enter or Space to activate, and Escape to return.

  • Escape exits.

The graphics scale from the actual display height. All seven hexagons have the same size and form a compact honeycomb. Hover uses a single solid, thick outline that remains crisp on 1bpp displays; triggering briefly inverts the complete hexagon. On landscape displays the ring uses nearly all available height, while Settings, the one-line BLE state, and the last-typed preview occupy the side margins.

Arguments

--auto-trigger             enable dwell triggering
--no-auto-trigger          disable dwell triggering
--dwell-ms 300..2000       set the dwell interval
--pair                     explicitly start host pairing at launch

Settings persist on the preferred SolarOS storage volume. BLE HID requires SolarOS 4.11.2 or later with Python, graphics, generic input, and BLE support.

Origins and license

The interaction follows the Hex-O-Spell model described in the 2006 TU Berlin paper The Berlin Brain-Computer Interface presents the novel mental typewriter Hex-o-Spell and Marton Juhasz's 2016 joystick adaptation. This port is distributed under the MIT License in LICENSE.

Lua · Version 1.0.0 · SolarOS 4.4.0+

Hello Lua

A minimal application that verifies a downloaded Lua script can be launched through the SolarOS Playground.

Python · Version 1.0.0 · SolarOS 4.4.0+

Hello Python

A minimal application that verifies a downloaded Python script can be launched through the SolarOS Playground.

Lua · Version 1.0.0 · SolarOS 4.4.0+

Mandelbrot (Lua)

Renders a four-shade Mandelbrot set that scales to the available graphic display.

Requires a graphic display.

Python · Version 1.0.0 · SolarOS 4.4.0+

Mandelbrot (Python)

Renders a black-and-white Mandelbrot set that scales to the available graphic display.

Press Escape or Q to exit after rendering is complete.

Requires a graphic display.

Lua · Version 1.0.0 · SolarOS 4.4.0+

Snake (Lua)

The Lua version of the SolarOS Snake example. The board scales to the available graphic display and uses simple tones for game feedback.

Controls:

  • Arrow keys, WASD, or HJKL move.
  • Space or P pauses and resumes.
  • Enter, R, or Space restarts after a collision.
  • Escape or Q exits.

Requires a graphic display and audio output.

Python · Version 1.0.0 · SolarOS 4.4.0+

Snake (Python)

The Python version of the SolarOS Snake example. The board scales to the available graphic display and uses simple tones for game feedback.

Controls:

  • Arrow keys, WASD, or HJKL move.
  • Space or P pauses and resumes.
  • Enter, R, or Space restarts after a collision.
  • Escape or Q exits.

Requires a graphic display and audio output.

Lua · Version 1.1.0 · SolarOS 4.6.7+

Sokoban

A turn-based box-pushing puzzle for SolarOS. Sokoban redraws only after the board changes, making it especially comfortable on reflective and e-paper displays. The board scales to the available graphic display.

Ten original, solver-verified levels focus on routing, box order, recovery space, and avoiding attractive dead ends. Sol, the tiny warehouse cat, is a transparent monochrome sprite with a drawing fallback for SolarOS <=4.6.7.

Controls:

  • Arrow keys, WASD, or HJKL move.
  • U or Backspace undoes one move.
  • R restarts the current level.
  • N, Page Down, or ] opens the next level.
  • P, Page Up, or [ opens the previous level.
  • Enter or Space advances after solving a level.
  • Escape or Q exits.

Requires a graphic display.

Python · Version 1.0.0 · SolarOS 4.8.9+

Chromatic Tuner

Chromatic Tuner listens to the default SolarOS audio input and shows the nearest equal-tempered note. Its horizontal needle covers -50 through +50 cents around that note. The center band marks the in-tune region.

Hold the sound source near the microphone and sustain one clear note at a time. The single tuner face always shows its needle and signal meter, with a large -- until a note locks. A detected note adds its frequency, name and octave, cents, and pitch confidence. Detection covers approximately 50 through 900 Hz and uses A4 = 440 Hz.

Controls

  • Left/Right (or -/+) adjusts input sensitivity from 1x through 16x.
  • Escape or Q exits.

The tuner starts at 8x input sensitivity. Reduce it if a loud instrument clips the signal meter, or increase it for a quiet source. This bounded digital gain works consistently across supported audio-input devices and does not change the system microphone setting.

Requirements

Chromatic Tuner requires SolarOS 4.8.9 or newer, a graphic display, an audio input, PSRAM-backed Python, and the solaros.audio.capture and solaros.dsp APIs. It captures at most 4096 native frames per update. The app does not write recordings to storage.

Room noise, simultaneous notes, strong echoes, or a weak signal can prevent a stable reading. For best results, play a single sustained note and mute other strings or sound sources.

Python · Version 1.0.0 · SolarOS 4.4.0+

Formulas

An offline scientific field reference for SolarOS. Formulas presents a collapsible subject tree, typesets each equation from a small ASCII MathTeX source, explains every variable and its coherent SI unit, and calculates any one supported unknown from the remaining values.

The initial catalog covers practical geometry, mechanics, fluids, thermodynamics, electricity, waves and radio, chemistry, navigation, and orbital mechanics. Formula notes state the important assumptions and any fixed physical constant used by a calculation.

Tree controls

  • Up and Down move by one visible line.
  • Right expands a subject, or moves to its first child when already expanded.
  • Left collapses an expanded subject; otherwise it moves to the parent.
  • Enter expands or collapses a subject, or opens the selected formula.
  • Page Up and Page Down move through long trees.
  • Escape or Q exits.

Formula-card controls

  • Any arrow key selects the previous or next variable. The corresponding
  • symbol is underlined in the typeset formula.

  • Enter edits the selected value. Type a decimal or scientific-notation value,
  • then press Enter to accept it. Escape cancels the edit.

  • C or Delete clears the selected value.
  • R clears the complete calculation.
  • Escape returns to the formula tree; Q exits.

Values marked * are entered values. Leave one variable unknown and it is calculated automatically, marked =. Clearing a different entered value uses the previous result as a known value and rearranges the same equation for the new unknown.

Display and compatibility

Formulas requires a graphic display. Its primary layout targets the 400 by 300 monochrome reflective display, with compact layouts for smaller one-bit displays. Very small displays show one variable at a time and use an inline ASCII fallback when a stacked fraction cannot fit vertically.

The app always uses coherent SI units as printed beside each variable. It does not convert units and does not parse arbitrary user-provided equations.

The supported catalog notation is deliberately small: numbers, symbols, subscripts, superscripts, arithmetic, grouping, \frac, \sqrt, common Greek symbol names, and basic trigonometric or logarithmic functions. It is not a general LaTeX implementation.

Lua · Version 1.0.0 · SolarOS 4.4.0+

Triangle Solver

A pocket triangle calculator for SolarOS. Enter any three valid measurements, including at least one side, and the app calculates all side lengths and internal angles. Angles are in degrees; angle A is opposite side a, and so on.

Supported cases:

  • SSS: three sides.
  • SAS: two sides and their included angle.
  • ASA/AAS: two angles and one side.
  • SSA: two sides and a non-included angle, including both answers when the
  • measurements describe two possible triangles.

Controls:

  • Arrow keys select side a, b, or c, or angle A, B, or C.
  • Number keys and the decimal point enter a measurement. The first character
  • typed after changing fields replaces that field's previous value.

  • Backspace removes the last digit; C or Delete clears the selected field.
  • Enter or Space solves the triangle.
  • N switches between two valid SSA solutions.
  • R clears every input.
  • Escape or Q exits.

Exactly three input fields must contain values when solving. Values marked with * are inputs; unmarked values are calculated results.

The upper half of the display shows the triangle. The angle fields A, B, and C form the first input row; the corresponding side fields a, b, and c form the second row. Status and control help remain below the fields.

Requires a graphic display.

Python · Version 1.0.0 · SolarOS 4.4.0+

Unit Converter

Convert common SI measurements to Imperial units and back. The app starts with an ordered list of conversion types. After choosing a type, select units on both sides and edit either value; the other side updates immediately.

Included conversion types and units:

  • Length: km, m, dm, cm, mm; mi, yd, ft, in.
  • Mass: t, kg, g, mg; long ton, st, lb, oz.
  • Temperature: degrees Celsius, kelvin; degrees Fahrenheit, degrees Rankine.
  • Angle: radians and milliradians; degrees, arcminutes, and arcseconds.
  • Area: km^2, ha, m^2, cm^2, mm^2; mi^2, acre, yd^2, ft^2, in^2.
  • Volume: m^3, L, mL; Imperial gallon, quart, pint, fluid ounce, ft^3, in^3.
  • Speed: km/h, m/s; mph, ft/s.
  • Pressure: MPa, kPa, Pa, bar; psi, inHg.
  • Force: kN, N; lbf.
  • Power: MW, kW, W; mechanical hp, BTU/h.
  • Energy: MJ, kJ, J; international-table BTU, ft-lb.

The conversion-type list uses large borderless rows with an inverted selection bar. In a converter, the focused value or unit field is also inverted; the other fields retain thin outlines.

Controls in the conversion-type list:

  • Up and Down select a type; Page Up and Page Down move by one screen.
  • Enter, Space, or Right opens the selected converter.
  • Escape or Q exits.

Controls in a converter:

  • Left and Right move across the two value and two unit fields. Tab moves to
  • the next field.

  • Up and Down change the selected unit. When a value is selected, they move to
  • the value on the other side.

  • Enter or Space also advances the selected unit.
  • Number keys, the decimal point, and minus sign edit the selected value. The
  • first typed character replaces that field and makes it the conversion source.

  • Backspace removes the last character; C or Delete clears the selected value.
  • R restores the default units and the value 1.
  • Escape returns to the type list; Q exits.

The app requires a graphic display and adapts its layout to the display size.

Python · Version 1.3.1 · SolarOS 4.8.4+

BlueSky

BlueSky is a text-only AT Protocol client for SolarOS. It provides a compact, keyboard-driven way to read and post on Bluesky, including accounts hosted on personal data servers (PDSes).

Features

  • Sign in with a Bluesky app password and a manually selected PDS.
  • Save login details locally for automatic sign-in.
  • Read, refresh, and page through the home timeline.
  • Switch between compact previews and fully wrapped post text in Home and
  • profile timelines; the selected mode is remembered.

  • Open complete posts and conversation threads.
  • Browse an author's profile timeline or enter any handle.
  • Compose text posts.
  • Reply to posts from Home, profiles, threads, or the complete post view.
  • Like/unlike directly from Home and profile timelines, or from the complete
  • post view; repost/unrepost from the complete post view.

  • Read accepted direct and group conversations, start one-to-one
  • conversations, and send text replies.

  • Stream larger API responses to disk to keep MicroPython memory use bounded.
  • Update only the changed selector rows while moving through a timeline.

First run and privacy

Enter the HTTPS origin of the account's PDS, such as https://pds.example.com, the account handle, and a Bluesky app password. Use an app password rather than the account's primary password.

The PDS address, handle, and app password are stored in config.json beside the installed script. A normal SD-card Playground installation stores it at:

/sdcard/playground/python/bluesky/config.json

This file is plain text. Treat the device and its storage as trusted. Access and refresh tokens are kept only in interpreter memory and cleared when the app exits. Expired access tokens are refreshed automatically during a running session. To replace a saved login, run:

playground run bluesky --login

Controls

  • Up/Down: move through lists or scroll a reader.
  • Page Up/Page Down: move five posts in Home or one page in an open message
  • conversation.

  • Enter or Right: open the selected post.
  • r: refresh the current timeline or message list.
  • v: toggle compact or full-text display in Home and profile timelines.
  • n: load the next timeline page.
  • c: compose a post; Ctrl-D submits multiline text.
  • a: reply to the selected post; Ctrl-D submits multiline text.
  • p: open the selected author's timeline.
  • u: enter a handle and open that user's timeline.
  • t: open the selected post's thread.
  • d: open messages; Enter opens a conversation and c writes a reply.
  • In Messages, n starts a one-to-one conversation by handle.
  • In Home, profiles, or a complete post, l toggles a like.
  • In a complete post, b toggles a repost.
  • Escape, Left, or q: go back or quit.

Limitations

BlueSky does not perform automatic handle-to-PDS discovery or OAuth. It does not currently support rich-text facets, images, notifications, message requests, group-conversation creation, or attachments.

Requirements

BlueSky requires SolarOS 4.8.4 or newer, Wi-Fi, and the Python and Playground packages. It uses the package-gated synchronous and streaming solaros.http APIs and the terminal UI, so it does not require a graphical display.

Python · Version 1.1.0 · SolarOS 4.8.9+

Cyberspace

Cyberspace is a human-operated SolarOS text client for the Cyberspace social network. It provides feed and thread reading, posts and replies, notifications, profiles and follows, search, topics, guilds, bookmarks, watched threads, journal notes and revisions, settings, C-Mail, and cIRC.

The client is intentionally confined to this foreground application. It does not provide a Native Agent tool, scripting API, background job, bot, scraper, or automation interface. Cyberspace content must not be supplied to an AI system. These boundaries follow the Cyberspace API terms for personal clients.

Login and privacy

Enter credentials through the app's terminal UI. Password entry uses the native SolarOS masked-input rendering option. The password is discarded after the login request and is never saved.

The login screen places separate Email and Password boxes below a large ASCII-art CYBERSPACE heading. Login, saved-login, and forget-saved controls are selectable Unicode-box buttons. Use Up, Down, or Tab to move between the fields and actions. Password input is always masked.

Remembered login is off by default. If you enable it, session.json is written beside the installed entry script. That file contains only the account email address and refresh token. The password and ID token are never stored. The token is plaintext, and Playground applications are executable code rather than sandboxes. A saved session is not used until you select Use saved login. Select Forget saved login on the same screen, or log out, to delete the file. Reinstalling or upgrading the app can also remove it.

Account creation remains on <https://cyberspace.online>. An unverified account can request a new verification email from the login flow.

Navigation

After login, the top bar provides the same flat screen model as cyber-tui: Feed, Notifications, Email, IRC, Journal, Bookmarks, Guilds, Topics, Profile, and Settings. The bar shows the active tab and automatically windows the labels to fit narrow SolarOS terminals.

Feed entries, guilds and guild threads, C-Mail conversations, cIRC rooms, and thread replies use selectable Unicode-bordered cards. Usernames, post titles, conversation partners, and room names use bold text. Enter opens the selected card. In a thread, Enter opens the complete selected post or reply in a scrollable reader. Reply, bookmark, watch, and copy-link always target the currently selected post or reply card.

Common controls:

  • Arrow keys or j/k: move or scroll; Down loads the next page at the end
  • Enter: open or select
  • Ctrl-Left/Ctrl-Right: change tabs from any tab view
  • Escape: go back
  • q: exit the application from a list or reading view
  • r: reply to the selected feed/thread card, or refresh where shown
  • n: create an entry, note, thread, or conversation where available
  • /: search from the feed
  • Page Down: request the next bounded page and move forward one visible page

Action keys shown in the footer expose bookmark/watch/report/edit/delete, profile, guild, notification, note-revision, attachment-copy, presence, and message operations. Destructive and reporting operations require confirmation. Attachment URLs can be copied to the shared SolarOS clipboard. Images, GIFs, audio, and websites are represented as labeled URLs; no graphics or audio service is required.

The multiline editor accepts UTF-8 input. Enter inserts a newline, Ctrl-S (or Ctrl-D) submits, and Escape cancels. Entry, reply, and journal text is bounded to 32,768 UTF-8 bytes. Smaller API limits are applied to titles, messages, profile fields, search terms, and report reasons.

Open C-Mail conversations use left/right-aligned message boxes. cIRC rooms use compact IRC-style <username> message time rows without per-message boxes. Both have a persistent input box at the bottom. Enter sends the input. All printable characters, including digits and q, go to that input; Left/Right edits it, while Ctrl-Left/Ctrl-Right changes tabs directly. Page Up and Page Down move by a full page; Page Up automatically loads the next bounded history page when necessary. Shift-Page Up and Shift-Page Down are accepted as keyboard-layout aliases. Ctrl-O explicitly loads older history, Ctrl-R reconnects, and Ctrl-U opens the cIRC user list. Chat renders /art, actions, deleted-message tombstones, attachments, and style labels as terminal-safe text. Spoilers stay hidden until explicitly revealed. C-Mail and cIRC use bounded REST history plus one live Firebase SSE message stream for the open conversation or room. Streams stop when the view closes, the user logs out, or the app exits.

Terminals smaller than 36 columns by 13 rows show a size warning. The interface uses solaros.tui, so it works on the physical display terminal and on cursor-addressable SSH, CDC, serial, or telnet shells.

Requirements

Cyberspace requires SolarOS 4.8.9 or newer, Wi-Fi, the Python and Playground packages, and the package-gated synchronous and streaming solaros.http APIs. It does not require a graphics display or audio hardware. HTTPS uses the SolarOS certificate bundle and always connects to https://api.cyberspace.online (and the login-provided Firebase RTDB URL); custom endpoints and redirects are disabled.

On firmware that provides retained solaros.http sessions, the REST client keeps one same-origin HTTPS connection open for the foreground app and closes it on exit. Older compatible firmware falls back to bounded one-shot requests. Firebase SSE remains a separate streaming connection.

Python · Version 1.1.0 · SolarOS 4.8.4+

Contacts for SolarOS

Contacts is an offline graphical personal address book for SolarOS. It is separate from SolarOS's built-in provider-neutral contacts service, which is intended for gateway and MeshCore identities rather than ordinary personal contact information.

Features

  • Alphabetical contact list
  • Search across every stored field
  • Multiple phone numbers per person
  • Multiple email addresses per person
  • Multiple labeled handles, such as Bluesky, Mastodon, Matrix, or amateur radio
  • Postal or physical address
  • Website
  • Free-form notes
  • Editing and deletion
  • Duplicate phone number, email, and handle suppression
  • Field and record size limits chosen for predictable MicroPython memory use
  • Atomic saves with interrupted-save recovery and a retained previous copy
  • Validation and repair of malformed or partially invalid saved data

Installation and launch

Copy this directory to /apps/addressbook and add the included alias line to /.shell/alias, or install it through Playground. Launch it with:

addressbook

The name addressbook is intentional. SolarOS's native contacts application has command precedence and manages trusted or discovered messaging endpoints. Using a separate command prevents the two applications from colliding.

Controls

Contact list

  • Up / Down: select a contact
  • Page Up / Page Down: move by one screen
  • Enter / Right: open the selected contact
  • A: add a contact
  • /: search names, contact details, addresses, and notes
  • C: clear the current search
  • Esc: exit

Contact details

  • Up / Down: scroll by one line
  • Page Up / Page Down: scroll by one screen
  • E: edit the contact
  • D or Delete: delete the contact after confirmation
  • Esc / Left: return to the list

Editors

  • Up / Down: select a field or list item
  • Enter: edit or choose
  • S: save a new or edited contact from any field
  • Backspace: remove the last character in a text field
  • Esc: cancel; unsaved contact edits require confirmation before they are
  • discarded

Adding a contact opens this editor directly with Name selected. There is no separate name prompt or second page of save and cancel menu entries.

Phone numbers and email addresses are deliberately stored as entered rather than being rejected by strict format rules. This allows extensions, international dialing forms, unusual local addresses, and future protocols. Handles consist of a user-chosen service or label and a value.

Storage

Contacts stores data in /.addressbook/contacts.json, outside the installed application directory so a Playground update cannot replace it. Writes first go to contacts.json.tmp; the previous valid file is retained as contacts.json.bak. On startup the app checks the primary, temporary, and backup copies in that order and recovers a usable interrupted save. Existing data from the earlier /apps/addressbook/contacts.json location is migrated automatically after the updated app starts successfully.

The current version supports up to 256 contacts. Each contact may contain up to 8 phone numbers, 8 email addresses, and 12 handles. Names and individual values are bounded, addresses may contain 500 characters, and notes may contain 1,200 characters. These are memory-safety limits rather than file-system limits: the app parses its JSON store in memory on an ESP32.

Current limitations

  • Data is local to this application and is not synchronized into SolarOS's
  • native messaging-identity contact service.

  • There is currently no CardDAV synchronization, vCard import/export, or
  • automatic website/phone launching.

  • The keyboard text API enters printable ASCII. Existing Unicode data remains
  • valid when read from JSON, but cannot be typed directly on current devices.

  • Displays smaller than 160 by 112 pixels receive an explanatory compatibility
  • screen instead of a clipped interface.

Python · Version 1.1.0 · SolarOS 4.8.4+

Calendar for SolarOS

Calendar is an offline-first graphical calendar designed for keyboard-driven SolarOS devices. It keeps events locally and expands recurring rules only for the date range currently on screen, keeping memory use bounded.

Features

  • Agenda view covering today and the next 30 days
  • Graphical month grid with per-day event counts
  • Single-day event lists and detailed event reading
  • Timed and all-day events
  • Location and notes fields
  • Multiple named calendars with independent visibility
  • Clearly exposed creation of additional local calendars
  • Downloadable ICS URL subscriptions with per-calendar and sync-all refresh
  • Transactional subscription refresh: failed downloads and malformed files keep
  • the previously downloaded events intact

  • Search across titles, locations, and notes
  • Per-event reminders while Calendar is running
  • Daily, weekday, weekly, monthly, and yearly recurrence
  • Weekly selection of multiple weekdays
  • Monthly numbered-day, Nth-weekday, and last-weekday rules
  • Optional recurrence ending dates
  • Skip one occurrence without deleting its recurring series
  • Duplicate, edit, or delete events and recurring series
  • 12- or 24-hour time display
  • Sunday- or Monday-first month layout
  • Four date formats
  • ICS import and export
  • JSON backup export
  • Interrupted-save recovery and bounded validation of saved data

Installation and launch

Copy this directory to /apps/calendar and add the included alias line to /.shell/alias, or install the application through Playground. Launch it with:

calendar

An ICS file can be imported directly from the shell using SolarOS's canonical file argument:

calendar --file /Downloads/events.ics

Additional calendars are managed through Settings > Calendars and subscriptions. The first two entries create a local calendar or add an ICS calendar from an http://, https://, or webcal:// URL. Open a subscribed calendar there and choose Sync now to refresh only that calendar, or use Sync all URL calendars from Settings.

Subscribed calendars are read-only because their contents are replaced during refresh. An event from a subscription can be duplicated into a local calendar before editing it. Downloads are streamed to a temporary file and capped at 1 MB; the application parses the completed file before replacing any existing events.

Controls

Agenda

  • Up / Down: select an occurrence
  • Enter: open the selected event
  • A: add an event
  • M: open the month view
  • /: search
  • S: settings
  • Esc: exit

Month

  • Arrow keys: move by one day or one week
  • [ / ] or Page Up / Page Down: previous or next month
  • Enter: open the selected day's events
  • A: add an event on the selected date
  • T: return to today
  • Esc: return to Agenda

Event details

  • E: edit the event or recurring series
  • D: duplicate the event
  • S: skip this occurrence of a recurring event
  • X: delete this occurrence or the entire event
  • Esc: return

Storage and exports

Calendar stores its state beside the application in calendar.json. Saves are written through a temporary file, with recovery from an interrupted save or backup when possible.

Exports are written to /Downloads:

  • calendar-YYYY-MM-DD.ics
  • calendar-YYYY-MM-DD.json

The ICS reader handles common VEVENT fields, unfolded lines, all-day and timed events, RRULE, and EXDATE. Imported UIDs are used to skip duplicates. New local events use the configured SolarOS user and hostname as the UID origin, for example e2-20260912T100300@heyvictorfrost.mosscap. Exports include the required UTC DTSTAMP property.

Current limitations

  • Reminders appear only while Calendar is open. Event reminder data is stored in
  • a form suitable for later SolarOS scheduler integration.

  • ICS timezone identifiers and UTC markers are currently interpreted as local
  • wall-clock time. Import calendars already exported in the device's timezone.

  • The importer supports the recurrence forms offered by this app. Complex
  • combinations involving COUNT, multiple BYSETPOS values, or detached recurrence overrides are not preserved fully.

  • URL calendars refresh only when requested; there is no background sync.
  • Authenticated calendar URLs and CalDAV write synchronization are not
  • currently supported.

Requirements

Calendar requires SolarOS 4.8.4 or newer, the Python runtime, writable storage, a ready graphics display, keyboard input, and Wi-Fi for URL calendars. Existing local and previously synchronized events remain usable offline.

Python · Version 1.1.4 · SolarOS 4.8.4+

Control Center

Control Center is a graphical status and service manager for SolarOS. It uses the native Python APIs introduced by current SolarOS builds; it does not run or parse shell commands.

Features

  • Identity, uptime, registered-app count, and job count overview.
  • Background-job list with active jobs first, a solid divider before inactive
  • jobs, and incremental name selection as you type.

  • Confirmed start and stop actions for jobs. Jobs that require command-line
  • arguments can be started through sequential generic argument fields.

  • Wi-Fi start/reconnect, station disconnect, and confirmed service stop.
  • Storage status and capacity when the active MicroPython integer build can
  • represent the volume's byte counts, plus block-device rescan and default-volume mounting.

  • Battery voltage, charge state, external-power status, and environmental
  • readings when the corresponding hardware services are present.

  • Graceful handling of services unavailable in a particular firmware flavor.
  • An icon-led instrument-panel layout with crisp selection outlines, compact
  • page counters, and native SolarOS symbols for each main control area.

  • Overview and Hardware readings use aligned, individually separated key/value
  • rows rather than dense wrapped text.

Control Center deliberately does not unmount its own storage, erase saved Wi-Fi profiles, or change the system identity. These operations are too disruptive for a one-key dashboard action.

SolarOS currently exposes job arguments as an ordered list of strings, without names, types, choices, or defaults. Control Center therefore adds generic fields sequentially; enter values in the same order used by job start <name> ....

Controls

  • Up/Down or j/k: move through ordinary lists. In Background jobs, use
  • Up/Down so every printable key remains available for name selection.

  • Type a job-name prefix in Background jobs to select the first match;
  • Backspace shortens the prefix.

  • Enter or Right: open or activate the selected item.
  • For a stopped job, choose y to use defaults or n to enter one argument per
  • field. Submit a blank field to finish and start the job.

  • Escape or Left: go back or exit. In other screens, q also goes back.
  • Page Up/Page Down: move through long job lists.
  • Destructive or connection-breaking actions require y confirmation.

Requirements

Control Center requires a current SolarOS Python runtime with solaros.jobs, solaros.wifi, solaros.storage, solaros.identity, solaros.apps, and the graphical display API. Unsupported optional services are shown as unavailable instead of preventing the app from opening.

Python · Version 1.8.0 · SolarOS 4.8.4+

copyparty Client

A full-screen graphical client for browsing a copyparty server from SolarOS.

Features

  • Browse remote folders using copyparty's JSON listing API.
  • Navigate a pixel-based interface with clear file and folder rows, paging,
  • progress bars, and layouts that adapt to the display size.

  • Save and switch among up to 20 named server connections.
  • Authenticate with either a password or --usernames username/password pair.
  • Page through large directory listings from a disk-backed index.
  • Download files directly to flash or SD storage in bounded HTTP ranges.
  • Recursively download a remote folder.
  • Preview folder contents and follow per-file and overall download progress.
  • Choose the local destination for every download.
  • Upload local files up to 64 KiB into the current remote folder.
  • Create folders when the signed-in user has write permission.
  • Refuse to overwrite an existing remote file.
  • Prefill an upload path with the canonical Playground --file PATH option.

Setup

Run copyparty, press n in the saved-server screen, and enter a connection name and server URL. Include any volume or folder that should be the root of the browser, for example:

https://files.example.net/SolarOS/

Entering a bare hostname or IP address automatically selects copyparty's stock port 3923. URLs that include http://, https://, or an explicit port are preserved. For example, a stock LAN server can be entered as 192.168.1.20, which becomes http://192.168.1.20:3923/.

The username and password are optional. Leave the username blank for a normal password-only copyparty server. If the server uses copyparty's --usernames option, enter both fields; the client sends PW: username:password as required by copyparty. Saved connections and credentials are stored as plain text in config.json beside the installed script. Do not distribute that file in a support bundle or copied installation. Configurations made by versions before 1.4 are migrated into the saved-server list automatically. Malformed saved entries, control characters, and credentials containing HTTP header delimiters are rejected rather than sent to a server.

SolarOS validates HTTPS certificates against its built-in certificate bundle. Self-signed certificates are not supported by the HTTP client; use a publicly trusted certificate or plain HTTP only on a trusted local network. For safety, the client follows neither redirects nor links to a different server origin.

Controls

  • Up/Down and Page Up/Page Down move through the remote listing.
  • Enter opens a folder or downloads the selected file.
  • d downloads the selected file or folder and asks for a local destination.
  • u uploads a local file into the current remote folder.
  • m creates a folder in the current remote folder.
  • r refreshes the listing.
  • c opens saved servers, where n adds, e edits, and d deletes a server.
  • Escape or q goes to the parent folder, then exits from the configured root.

From the shell, an existing file can be prepared for upload with:

copyparty --file /notes/todo.txt

SolarOS Playground Python cannot currently enumerate local directories, so local paths are entered in a path editor rather than selected from a local directory tree. Remote navigation is fully interactive.

Limits

Directory listings are capped at 512 KiB, individual downloaded files at 64 MiB, recursive folder downloads at 256 files and 256 subdirectories, and uploads at 64 KiB. Failed write operations report the HTTP status returned by copyparty; read-only users can continue browsing and downloading normally.

Before a folder download begins, the client enumerates its contents into a disk-backed plan. The download screen shows each file as pending, active with a percentage, or complete, plus overall byte progress. If the plan is longer than the display, it automatically follows the active file from page to page. The plan is removed when the transfer finishes or fails, so large folder trees do not remain in the MicroPython heap.

Downloads are written with an .incomplete suffix until the server confirms the transfer completed. Interrupted files are preserved with that suffix for inspection or removal and are never presented as completed downloads. Replacing an existing single-file destination requires confirmation. Recursive downloads stop before transfer if an existing file or a case-insensitive local filename collision is found, preventing a folder from silently replacing local content. File data is pulled in 64 KiB HTTP ranges over one reused connection and each range is written before the next is requested. The complete file is never held in memory, and storage or display delays cannot overflow a background network queue. Directory listings still use a bounded stream because their total size is capped at 512 KiB.

The client requires SolarOS 4.8.4 or newer with Wi-Fi, Python, Playground, and the HTTP client enabled.

Release verification

Version 1.6.0 is tested against copyparty 1.20.23 with anonymous and password-protected volumes, rejected logins, JSON directory listings, byte-range downloads, and authenticated uploads. The test suite also covers terminal-control sanitization, narrow-display clipping, malformed large listings, incomplete transfers, path portability, header-injection rejection, and local filename collision protection.

Python · Version 1.4.1 · SolarOS 4.8.4+

Flint for SolarOS

Flint is an offline Markdown notebook and personal knowledge base for SolarOS. It keeps notes as ordinary files, adds Obsidian-style wiki links and backlinks, and treats daily notes as one part of a general-purpose vault.

Features

  • Folder-based Markdown vault
  • [[Wiki links]], [[Note|aliases]], and [[Note#Heading]]
  • Link hopping and creation of missing linked notes
  • Backlinks
  • Daily notes with an editable template
  • Tags, search, recent notes, and favorites
  • Graphical vault and folder browser
  • Full-document Markdown editor with a cursor-centered viewport
  • Note creation, deletion, renaming, and moving
  • Folder creation, renaming, and safe deletion
  • Automatic exact-link updates when a note is renamed
  • Explicit, progress-reporting refresh of all known indexed notes
  • Command-line import for notes copied onto the device outside Flint
  • Direct opening of an existing Markdown or text file supplied as an argument
  • Atomic note, configuration, and index writes
  • UTF-8-aware 32 KiB editor limit
  • Safe recovery when an index update or refresh is interrupted
  • Independent indexes for multiple configured vaults
  • Lists reopen at the previous position after closing a note
  • No image decoding or table layout

Installation and launch

Install Flint through Playground, or copy this directory to /apps/flint and add the included alias line to /.shell/alias.

flint
flint /notes/vault/Projects/SolarOS.md
flint --add-file /downloads/SolarOS.md
flint --add-list /downloads/flint-paths.txt

The second form opens a Markdown or text file directly. Press B from its reading screen to enter the vault browser. While actively editing, use Ctrl+B instead, because an ordinary B is inserted into the note.

--add-file adds a file to the vault. A file already under the configured vault root is indexed in place. A file elsewhere is copied into the vault root with a safe, unique filename. Supported files are .md, .markdown, and .txt, up to Flint's normal 32 KiB note limit.

--add-list reads absolute note paths from a newline-delimited text file and adds them in one Python session. Empty lines and lines beginning with # are ignored. This is useful in SolarOS shell scripts, because launching a foreground application ends the remainder of the script.

Main areas

  • Today's note opens or creates Daily/YYYY-MM-DD.md using the configured
  • template.

  • Browse vault navigates folders and notes.
  • Recent notes and Favorites provide quick access.
  • Search checks indexed metadata and then scans one note body at a time.
  • Tags groups indexed notes by hashtag.
  • Refresh index reparses known notes and removes entries whose files are no
  • longer readable.

Reader controls

  • Up / Down: scroll
  • Page Up / Page Down: move one page
  • E: edit
  • L: list and follow wiki links
  • K: show backlinks
  • F: toggle favorite
  • A: show every note action, including rename, move, and delete
  • B: open the vault browser from the current note's folder
  • Esc: return to the previous screen

Vault browser controls

  • Enter: open the highlighted folder or note
  • N: create a note in the current folder
  • F: create a subfolder
  • M: rename the highlighted folder
  • D: delete the highlighted note or folder after confirmation
  • R: refresh the saved index
  • Esc: move to the parent folder or leave the browser

Deleting a folder moves every indexed note beneath it to the vault-root orphaned notes folder before removing it. Filename collisions receive a numbered filename. If an unindexed file prevents the now-empty folder from being removed, Flint leaves that folder in place and reports the problem.

Editor controls

  • Printable keys: insert text at the cursor
  • Enter: insert a newline
  • Arrow keys: move the cursor
  • Page Up / Page Down: move several lines
  • Home / End: move to the beginning or end of the current line
  • Backspace / Delete: remove text
  • Tab: insert four spaces
  • Ctrl+S: save and return to reading mode
  • Ctrl+B: save or discard changes and enter the vault browser
  • Esc: return to reading mode, prompting if the note changed

Storage and compatibility

The default vault is /notes/vault. Its contents are normal .md, .markdown, and .txt files that can also be opened by SolarOS Reader or Writer and copied to a desktop Markdown application.

Flint's rebuildable indexes and settings live separately in /.flint. Each configured vault has its own index, so switching vaults cannot mix their notes. The default vault retains the compatible index.json filename. An index contains titles, paths, tags, outgoing links, previews, favorites, and recent paths; it is not the authoritative copy of any note.

Flint recognizes common Markdown headings, paragraphs, lists, block quotes, code fences, rules, inline links, emphasis, and wiki links. Images are replaced with a short “Image omitted” line. Tables remain readable source text rather than being laid out as grids. Plugin syntax, Canvas, Dataview, embedded web content, and graph visualization are not supported.

Resource limits

  • Up to 512 indexed notes
  • Up to 32 KiB per note
  • Up to 32 KiB per editable document
  • Up to 16 indexed tags and 32 outgoing wiki-link targets per note

Only the current note is loaded for reading or editing, and full-text search opens one note at a time. SolarOS Python currently has no directory-list API, so Flint's browser is populated from its saved index. Notes created by Flint are indexed automatically. Use flint --add-file /path/to/note.md after transferring a note through Files, FTP, or another app. These limits keep memory use predictable on ESP32 devices.

Privacy

Flint data is stored as plaintext Markdown. The app intentionally does not offer a cosmetic PIN screen or claim that the vault is encrypted.

Python · Version 1.4.1 · SolarOS 4.8.4+

Flint TUI for SolarOS

Flint TUI is the text-interface edition of Flint, an offline Markdown notebook and personal knowledge base for SolarOS. The original graphical edition remains in the separate flint package.

Both editions use the same default vault (/notes/vault), configuration, and per-vault indexes (/.flint), so notes can be opened in either one without conversion and switching vaults cannot mix their note lists.

Features

  • Folder-based Markdown vault
  • Full-document, line-based text editor
  • [[Wiki links]], aliases, heading links, and backlinks
  • Link hopping and creation of missing linked notes
  • Daily notes with an editable template
  • Tags, full-text search, recent notes, and favorites
  • Note creation, deletion, renaming, and moving
  • Folder creation, renaming, and safe deletion
  • Exact wiki-link updates when a note is renamed
  • Import and in-place indexing of files copied onto the device
  • Atomic note, configuration, and index writes
  • UTF-8-aware 32 KiB editor limit
  • Safe recovery when an index update or refresh is interrupted
  • Lists reopen at the previous position after closing a note
  • Text rendering for headings, lists, quotes, code, links, and emphasis
  • Image placeholders and plain-text tables; no image decoding

Launch and import

flint-tui
flint-tui /notes/vault/Projects/SolarOS.md
flint-tui --add-file /downloads/SolarOS.md
flint-tui --add-list /downloads/flint-paths.txt

Files already inside the configured vault are indexed in place. Files outside it are copied to the vault root using a safe, unique filename. Flint accepts .md, .markdown, and .txt notes up to 32 KiB.

--add-list reads newline-delimited absolute paths from a text file and adds them in one Python session. Empty lines and # comment lines are ignored.

Reader controls

  • Up / Down: scroll one row
  • Page Up / Page Down: scroll one page
  • E: edit the complete document
  • L: list and follow wiki links
  • K: show backlinks
  • F: toggle favorite
  • A: show all note actions
  • B: open the vault browser
  • Esc: return to the previous screen

Editor controls

  • Printable keys: insert into the active line
  • Enter: split the active line at the cursor
  • Backspace at the start of a line: join it to the preceding line
  • Delete at the end of a line: join it to the following line
  • Arrow keys: move within and between lines
  • Page Up / Page Down: move several lines
  • Home / End: move to the start or end of the active line
  • Tab: insert four spaces
  • Ctrl+S: save and return to the reader
  • Ctrl+B: save or discard changes and open the vault browser
  • Esc: return to the reader, prompting if the document changed

The editing buffer is a list of physical Markdown lines. Normal typing copies only the active line. The complete document is joined only when it is saved or when the editor must return its contents.

Vault browser controls

  • Enter: open the highlighted folder or note
  • N: create a note in the current folder
  • F: create a subfolder
  • M: rename the highlighted folder
  • D: delete the highlighted note or folder after confirmation
  • R: refresh the saved index
  • Esc: move to the parent folder or leave the browser

Deleting a folder moves every indexed note beneath it to the vault-root orphaned notes folder before removing it. Filename collisions receive a numbered filename. A folder containing unindexed files is left in place if it cannot safely be emptied.

Storage limitations

SolarOS Python currently has no directory-list API. Flint's vault browser is therefore populated from its saved index. Notes created by either Flint edition are indexed automatically. After transferring another note using Files or FTP, run flint-tui --add-file /path/to/note.md.

Flint stores plaintext Markdown and does not claim to encrypt the vault.

Python · Version 1.0.0 · SolarOS 4.8.4+

Home Assistant

Control and monitor Home Assistant entities from the graphic display. Browse any combination of lights, fans, sensors, and more. Sections are defined entirely by your config file — only add what you have.

Configure

Create ha.cfg in the same directory as ha.py:

url=http://YOUR_HA_IP:8123
token=YOUR_LONG_LIVED_ACCESS_TOKEN

[Lights]
light.living_room=Living Room
switch.kitchen=Kitchen

[Fans]
fan.bedroom_fan=Bedroom

[Energy]
binary_sensor.grid_status=Grid
sensor.battery_percent=Battery
sensor.solar_production=Solar

[Temperatures]
sensor.outdoor_temp=Outside
sensor.indoor_temp=Inside

Generate a long-lived access token in Home Assistant under Profile → Long-Lived Access Tokens.

Sections can be named anything. Any section containing light.*, switch.*, or fan.* entities automatically supports toggling. Sensor-only sections are read-only. Unused sections (Energy, Fans, etc.) can simply be omitted.

Up to 8 sections and 8 entities per section are supported.

Icon mapping

Section icons are chosen automatically by name:

Name containsIcon
light, lamplightbulb
fan, ventfan
energy, power, solar, gridbolt
anything elsepulse

State formatting

Entity / sectionDisplay
Section name contains "temp" or "climate"72.3°
Section name contains "energy", "power", "solar", "grid"1.2 kW / 450 W
binary_sensor.*on / off
Entity ID contains "battery"85%
Anything elseraw state

Controls

KeyAction
Up / DownMove cursor
EnterOpen section / toggle entity
QGo back / exit
EscapeExit

The display refreshes automatically every 30 seconds. After 60 seconds of inactivity a full-screen 7-segment clock appears; any key returns to the app.

Requirements

Home Assistant requires SolarOS 4.8.4, Wi-Fi, a graphic display, and the Python and Playground packages. The solaros.http and solaros.time APIs must be available (included in standard Wi-Fi builds).

Python · Version 1.0.0 · SolarOS 4.8.4+

Launcher Builder for SolarOS

Launcher Builder is a graphical, keyboard-driven editor for SolarOS's native Launcher configuration. It previews the layout on the device and writes the same JSON format that launcher reads.

Features

  • Every native grid dimension from 1 to 8 columns and 1 to 8 rows
  • Up to 32 launch items, with empty cells allowed in larger grids
  • Adaptive preview using smaller icons and fewer labels in dense layouts
  • Discovery of built-in SolarOS apps through solaros.apps.list()
  • Discovery of Playground-installed apps from /.shell/playground
  • Discovery of manually installed apps and commands from /.shell/alias
  • Manual shell commands and Python script paths
  • Searchable gallery of every native SolarOS icon
  • Popular-icon shortcut view and automatic icon suggestions
  • Editable item titles, commands, icons, and positions
  • Moving into an occupied cell swaps the two items
  • Full-screen preview before saving
  • Atomic saves with interrupted-save recovery and a temporary backup
  • Validation against the native Launcher's name, command, grid, item, and icon
  • limits

The application contains icon names only. The icons themselves are rendered by SolarOS through gfx.icon(), so no bitmap library is duplicated in the app.

Installation and launch

Copy this directory to /apps/launcher_builder and add the included alias line to /.shell/alias, or install it through Playground. Launch it with:

launcher-builder

By default, Launcher Builder edits /launcher.json, the native Launcher's preferred-storage configuration. A different file can be opened with:

launcher-builder --file /path/to/another-launcher.json

Controls

Main editor

  • Arrow keys: select a grid cell
  • Enter: add an item to an empty cell or edit an occupied cell
  • G: choose columns and rows independently
  • P: show a full-screen launcher preview; press any key to return
  • S: save
  • Esc: exit, with a save/discard prompt when there are unsaved changes

Icon picker

  • Arrow keys: select an icon
  • Enter: use the selected icon
  • /: search all native icon names
  • A: switch between popular icons and the complete icon set
  • Page Up / Page Down: move through icon pages
  • Esc: cancel

Moving items

  • Arrow keys: choose the destination
  • Enter: move to an empty cell or swap with the item in an occupied cell
  • Esc: cancel

Storage and safety

The native Launcher requires a non-empty item list, allows grid dimensions from 1 through 8, and supports no more than 32 items. Launcher Builder enforces those rules before saving. When a smaller grid cannot contain the current item count, the resize is refused rather than deleting items.

Saves first go to <config>.tmp. The previous primary file is briefly moved to <config>.bak while the new file is installed. If startup finds a usable temporary or backup copy, it recovers it. Invalid existing files are left in place and the default layout is opened in memory, so nothing is overwritten until the user explicitly saves.

Current limitations

  • SolarOS exposes built-in apps directly but does not currently expose a public
  • Python API that enumerates Playground packages. Launcher Builder reads the shell alias file generated by Playground instead.

  • Aliases with the same command name as a built-in app are shown once, with the
  • built-in entry taking precedence.

  • The preview represents the layout and native icons closely, but the native
  • Launcher remains responsible for its final title fitting and exact spacing.

Python · Version 1.0.1 · SolarOS 4.8.4+

OPDS Browser

OPDS Browser is a text-first OPDS 1.x catalog client and book downloader for SolarOS. It works with Kavita and conventional OPDS repositories while leaving book reading to SolarOS Reader.

Features

  • Configure and browse multiple OPDS servers.
  • Kavita base URL and auth-key setup, full OPDS URLs, and HTTP Basic auth.
  • Follow navigation feeds and paginated catalog results.
  • Search servers that advertise an OpenSearch endpoint.
  • Keep a single offline To Read list across all configured servers.
  • Stream downloads to /Books with filesystem-safe filenames.
  • Show explanatory progress stages while downloading and parsing.
  • Reuse parsed pages from a short-lived eight-page cache.
  • Cooperatively precache nearby catalog pages without freezing input.
  • Filter downloads to EPUB, plain text, and Markdown formats supported by
  • SolarOS Reader.

Server profiles and credentials are stored in servers.json beside the installed script. To Read and download-history records are stored there as well. A normal SD-card Playground installation uses:

/sdcard/playground/python/opds/

Credentials are plain text. Do not distribute servers.json in a support bundle or copied installation. Downloaded books remain in /Books when the app is upgraded or removed.

Controls

  • Up/Down: move through lists.
  • Page Up/Page Down: move by a visible page.
  • Enter: open a server, feed, book, or action.
  • /: search the active server when it advertises OpenSearch.
  • s: add or remove a compatible book from To Read.
  • In Manage Servers, a adds and x removes a server.
  • Escape or q: go back or quit.

Open downloaded books through Files or from a shell with:

reader /Books/book-name.epub

SolarOS does not currently expose an application-handoff API to a running Python script, so OPDS Browser cannot launch Reader itself.

Limits

Catalog pages are capped at 512 KiB, descriptions at 2 KiB per To Read item, and individual downloads at 64 MiB. Covers, PDF display, and reading-progress synchronization are intentionally omitted.

Requirements

OPDS Browser requires SolarOS 4.8.4 or newer, Wi-Fi, and the Python and Playground packages. It uses the streaming solaros.http API and the terminal UI, so it does not require a graphical display or an SD card.

Python · Version 1.0.0 · SolarOS 4.6.8+

QR Share

Render useful data as a high-contrast QR code on a SolarOS graphic display. With no arguments, QR Share reads only the public half of the default SSH key pair through solaros.ssh_keys and displays it for copying to another machine. Private key material is never opened.

Usage:

python qrshare.py
python qrshare.py --ssh
python qrshare.py solar-os.eu
python qrshare.py --text "hello from SolarOS"
python qrshare.py --file /notes/wifi.txt

The compact encoder uses QR Model 2 byte mode, low error correction, versions 1 through 15, and supports up to 520 UTF-8 bytes. This keeps a typical RSA or Ed25519 OpenSSH public key at three physical pixels per QR module on the 400×300 Waveshare display.

File input is limited to 520 bytes. Larger files are rejected before encoding; QR Share displays the limit and file path and waits for Escape.

Controls:

  • R reloads the selected public key or file.
  • Escape or Q exits.

Requires a graphic display and SolarOS 4.6.8. Automatic SSH-key mode also requires a firmware flavor with the SSH service.

Python · Version 1.1.2 · SolarOS 4.8.4+

RSS Reader

RSS Reader is an offline-first, text-only RSS 2.0 and Atom reader for SolarOS. It combines subscribed feeds into one timeline while retaining per-feed views and cached article text for disconnected reading.

Features

  • Aggregate and individual-feed views.
  • Add and remove HTTPS RSS or Atom feeds on the device.
  • BBC World News, Hackaday, and Hacker News starter subscriptions.
  • Configurable retention of 1 to 50 posts per feed.
  • Read/unread tracking and a per-feed "mark all read" action.
  • Offline article cache with a separate body file for each post.
  • Basic HTML and Markdown conversion for terminal reading.
  • Image placeholders based on alt text or the source filename; images are not
  • downloaded.

  • Streamed, one-feed-at-a-time refreshes with bounded memory use.

Feed subscriptions are stored in feeds.json, lightweight article metadata in cache.json, and article bodies below articles/, all beside the installed script. A normal SD-card Playground installation uses:

/sdcard/playground/python/rss/

Each feed receives its own stable folder under articles/. Old cached content remains available when a refresh fails. Article bodies are capped at 12 KiB, and files that age out of a feed's configured retention limit are removed.

Controls

  • Up/Down: move through posts.
  • Page Up/Page Down: move five posts at a time.
  • Enter or Right: open the selected article and mark it read.
  • r: refresh all configured feeds.
  • f: open the feed manager or change between aggregate and feed views.
  • m: mark every cached post in the current individual feed as read.
  • In the feed manager, a adds a feed and x removes one.
  • In the feed manager, +/- changes retained posts per feed.
  • Escape, Left, or q: go back or quit.

Removing a subscription leaves its already cached posts intact. The app does not download linked web pages or images and cannot hand a link directly to the graphical Web application.

Requirements

RSS Reader requires SolarOS 4.8.4 or newer, Wi-Fi, and the Python and Playground packages. It uses the streaming solaros.http API and the terminal UI, so it does not require a graphical display.

Python · Version 1.2.0 · SolarOS 4.8.4+

Today Dashboard

Today Dashboard is a lightweight, offline daily overview for SolarOS. It reads the data already maintained by Todo List, Calendar, Flint, and RSS Reader and presents it in one 400 by 300 pixel screen.

Features

  • Today's visible calendar events, including recurring events.
  • Open general tasks and tasks completed today.
  • Due recurring tasks are shown even if Todo List has not yet been opened that
  • day; Today does not modify Todo List's state.

  • Recent Flint notes and unread cached RSS posts.
  • A calm four-card home screen using SolarOS's native calendar, task, book, and
  • RSS icons.

  • A compact in-app status bar shows Wi-Fi state, battery level, charging state,
  • and the current time while SolarOS graphics mode is active.

  • Drill-down lists for every section.
  • Manual refresh without repeatedly reading storage in the background.
  • Read-only integration: source data remains owned by its original app.

Missing apps or damaged state files are treated as empty sources, so Today can still open when only some companion apps are installed. Custom Flint vaults are supported through Flint's saved configuration and per-vault index.

Controls

  • Arrow keys or h/j/k/l: move through the dashboard grid; Up/Down
  • or j/k moves through detail lists.

  • Enter: open a dashboard section. Enter or Right opens a selected detail item.
  • Escape, Left, or q: go back or exit.
  • r: reload all sources from storage.

Data access

Today reads /apps/todo/todo.json, /apps/calendar/calendar.json, /apps/rss/cache.json, and Flint's index under /.flint. It does not edit any of these files and requires no network connection.

Python · Version 1.1.2 · SolarOS 4.8.4+

Todo List

Todo List is an offline graphical task manager for SolarOS. It keeps quick one-off work, recurring chores, and project-specific lists together without requiring a network connection.

Features

  • A Today list containing open general tasks, today's recurring tasks, and
  • tasks completed today.

  • Projects with independent task lists and full completion history.
  • Daily, weekday, multi-day weekly, numbered-day monthly, and Nth-weekday
  • monthly recurring-task templates.

  • Edit, pause, resume, or remove existing recurrence rules.
  • Open-task sorting by creation time or name.
  • Optional added and completion dates, with four display formats.
  • Optional hiding of completed tasks.
  • Independent clearing of completed general or project tasks.
  • Plain-text and Markdown exports to /Downloads.
  • Atomic, versioned JSON storage beside the installed app.
  • Recovery from a complete temporary or backup state file after an interrupted
  • save.

Recurring templates create no backlog. When the app opens, each active template creates at most one task for the current day if its schedule is due. Completed recurring instances remain ordinary task history.

Controls

  • Up/Down or j/k: move through a list.
  • Enter or Space: complete or reopen the selected task.
  • a: add a one-off task.
  • r: add a recurring task.
  • e: rename the selected task.
  • x or Delete: delete the selected task or project.
  • o: switch open-task sorting between creation time and name.
  • p: open Projects from Today.
  • s: open Settings from Today.
  • Escape, Left, or q: go back or exit.

The interface is designed for a 400 by 300 pixel reflective LCD but reads the actual display dimensions at runtime. It redraws only after input or data changes, never continuously in the background.

Weekly setup uses Space to toggle one or more weekdays and s to save the selection. Monthly setup can use a numbered calendar day or a rule such as "the second Tuesday" or "the last Friday". Existing rules are managed from Settings under Manage recurring tasks.

Deleting an ordinary task removes it permanently. Deleting a generated recurring task dismisses only that occurrence, so it does not immediately reappear and the recurrence continues on its next scheduled day. Recurrence creation and schedule editing require a valid SolarOS clock.

Storage and exports

State is saved in todo.json beside the application. Writes first go to a temporary file and are renamed into place, reducing the risk of corruption if power is interrupted. The previous complete file is retained as a backup until the replacement is safely in place. On a direct /apps installation the usual path is:

/apps/todo/todo.json

Exports are written as todo-list-YYYY-MM-DD.txt or .md under /Downloads. They include the general list, every project, completion dates, and recurring template status.

Requirements

Todo List requires SolarOS 4.8.4 or newer, the Python runtime, storage, and a graphical display with keyboard input.

Python · Version 1.0.0 · SolarOS 4.8.4+

Weather

Weather shows current conditions and a seven-day Open-Meteo forecast on the graphic display. The upper boxes show temperature, relative humidity, wind speed, and wind direction. The two graphs show forecast temperature and precipitation.

When the board provides the optional SolarOS environmental sensor service, valid local readings replace Open-Meteo's current temperature and humidity. Wind and forecast data always come from Open-Meteo. Each temperature and humidity box identifies its source as local or meteo.

Configure

Weather stores config.json beside weather.py. For an SD installation, the normal path is:

/sdcard/playground/python/weather/config.json

Save coordinates from a shell:

python /sdcard/playground/python/weather/weather.py --lat 52.5200 --lon 13.4050 --save-only

Or save a city and optional country qualifier:

python /sdcard/playground/python/weather/weather.py --city Berlin --country Germany --save-only

The equivalent configuration files are:

{"latitude": 52.52, "longitude": 13.405, "name": "Berlin", "refresh_minutes": 10}
{"city": "Berlin", "country": "Germany", "refresh_minutes": 10}

City names are resolved with the Open-Meteo Geocoding API at startup. Use a country name or two-letter country code when the city name is ambiguous.

refresh_minutes controls automatic forecast and sensor refreshes. It defaults to 10 when omitted and accepts an integer from 1 to 1440. Change only the interval in an existing configuration with:

python /sdcard/playground/python/weather/weather.py --refresh-minutes 15 --save-only

Run weather.py --help for the command-line summary. Omit --save-only to save the supplied configuration and then open Weather on a display-owned session.

Controls

  • + or = selects seven daily aggregates.
  • - selects the next 24 hourly forecast samples.
  • R refreshes the forecast and local sensor readings.
  • Escape or Q exits.

Weather refreshes the forecast and local sensor readings automatically at the configured interval. The active hourly or daily graph scale is preserved.

The daily temperature graph uses the mean of each day's hourly temperatures. The daily precipitation graph uses the sum of each day's hourly precipitation.

Requirements

Weather requires SolarOS 4.8.4, Wi-Fi, a graphic display, the Python and Playground packages, and the package-gated solaros.http API. A local temperature/humidity sensor is optional. HTTPS requests use the SolarOS certificate bundle. No Open-Meteo API key is required for non-commercial use; review Open-Meteo's current terms for other use.

Python · Version 1.0.3 · SolarOS 4.8.4+

Wikipedia Reader

Wikipedia Reader is a text-first Wikipedia client for constrained SolarOS devices. It uses Wikipedia's plain-text extract API for fast article loading and fetches link data separately for in-app browsing.

Features

  • Search by article title and text.
  • Open a random article.
  • Follow internal Wikipedia links without leaving the app.
  • Keep bookmarks and recently viewed articles.
  • Cache up to 20 ordinary articles for quick repeat and offline reading.
  • Keep selected articles in a separate, uncapped offline library.
  • Choose a Wikipedia language edition.
  • Clear disposable cache and recent history independently.
  • Stream article extracts and link data to disk to bound memory use.
  • Omit images, tables, and other web-page chrome.

Configuration, history, bookmarks, the article cache, and the offline library are stored beside the installed script. Article identities include their Wikipedia language, so saved copies from different editions can coexist. A normal SD-card Playground installation uses:

/sdcard/playground/python/wikipedia/

The 20-article cache has no time-to-live; it evicts older disposable articles only when the count limit is exceeded. Articles marked for offline use are not subject to that cap.

Controls

  • Up/Down or Page Up/Page Down: turn article pages or move through lists.
  • Enter or l: list links in the current article.
  • s: add or remove the current article as a bookmark.
  • o: keep or remove the current article in the offline library.
  • Escape or q: go back or quit.

The Settings screen changes the language, clears the disposable article cache, or clears recent history. Clearing the cache preserves offline-kept articles; clearing history preserves both cached and offline articles.

Desktop offline-library builder

The companion build_offline_cache.py utility in this project's desktop tools accepts a UTF-8 file containing one Wikipedia article URL per line:

python build_offline_cache.py links.txt --output wikipedia-offline

Blank lines and lines beginning with # are ignored. All URLs in one run must use the same Wikipedia language. Copy the generated cache/, offline.json, and config.json into the installed Wikipedia Reader directory.

Requirements

Wikipedia Reader requires SolarOS 4.8.4 or newer, Wi-Fi, and the Python and Playground packages. Already cached and offline-kept articles remain readable without a connection. The app uses the package-gated synchronous and streaming solaros.http APIs and the terminal UI, so it does not require a graphical display.

Join us on: