No description
  • JavaScript 93%
  • HTML 6.5%
  • CSS 0.5%
Find a file
2026-02-16 13:11:01 -08:00
.github Added GitHub & Ko-Fi links 2026-02-15 07:53:37 -08:00
public Added CORS proxy to more calls 2026-02-15 19:04:35 -08:00
src Adjust padding so Save/Cancel buttons are not cut off (also move them outside the scroll area) 2026-02-16 13:11:01 -08:00
.gitignore Use AI to overhaul into a fully customizable dashboard app 2026-02-14 22:34:26 -08:00
CNAME Add gh-pages and CNAME 2026-02-15 17:22:42 -08:00
package-lock.json Add gh-pages and CNAME 2026-02-15 17:22:42 -08:00
package.json Add gh-pages and CNAME 2026-02-15 17:22:42 -08:00
README.md Added a couple helper methods and better documentation for GenericWidget 2026-02-16 12:58:06 -08:00

OpenDak

An open-source, configurable dashboard inspired by DakBoard. Display clocks, weather, calendars, and data from any API — all on top of a rotating wallpaper.

Widget Types

  • Clock — configurable timezone, 12/24h format, seconds, date display
  • Weather — current conditions + multi-day forecast via OpenWeatherMap
  • Calendar — aggregates multiple iCal feeds with color-coded events
  • Generic — fetch any JSON API with JSONPath selectors for flexible data display

Configuration

All settings are managed through a slide-out settings panel (click the ⚙️ icon). Settings are stored in localStorage and can be exported/imported as JSON.

Global Settings

Setting Description
Background Subreddit Subreddit for rotating wallpaper images (e.g. EarthPorn)
CORS Proxy URL + headers for proxying external requests (needed for iCal feeds)

Widget Settings

Every widget has base settings for positioning and appearance:

Setting Description Example Values
Position (x, y) Pixel, percentage, center, right:, bottom: 200, 10%, center, right:0
Size (width, height) Pixel or percentage (bare numbers default to px) 300, 25%
Title Optional label above the widget
Text Align left or right
Background Color Any CSS color — rgba or 8-digit hex rgba(134,122,122,0.36), #867A7A5C
Font Size small, medium, or large

Each widget type has additional type-specific settings (API keys, timezones, calendar URLs, JSONPath selectors, etc.) configurable through the settings panel.

Generic Widget

The Generic widget fetches JSON from any API and uses two selectors to extract and display data:

  • Data Selector — a JSONPath expression that selects which data to extract from the API response. If the result is a single scalar value (e.g. a number or string), it's displayed as-is. If it's an array, each item is shown as a bulleted list.
  • Display Selector — applied after the Data Selector when the result is an array of objects. Specifies which property of each object to display (e.g. title). Supports simple property names or JSONPath expressions starting with $.

Example: given an API that returns { "items": [{ "title": "Foo", "type": "video" }, ...] }:

Setting Value Effect
Data Selector $.items Selects all items
Data Selector $.items[?(@.type=='video')] Selects only items where type is "video"
Display Selector title Shows each item's title instead of the full object
Max Items 5 Limits output to 5 items

Filter Helpers

The Data Selector also supports these built-in helper functions for date filtering:

Helper Description Example
daysAgo(n) Returns a timestamp for n days ago daysAgo(5)
toDate(s) Converts a date string or timestamp to a comparable value toDate(@.created)

Example — show only videos created in the last 5 days:

$.items[?(@.type=='video' && toDate(@.created) > daysAgo(5))]

Try It

Visit opendak.app — click the ⚙️ to configure your widgets, or import a pre-made settings JSON via the Import button.