dashboard settings

config backup & transfer v00

all credentials, custom time zones, and settings live locally in your browser storage. export your config to transfer setup to another machine or browser profile, or import a template.json.

profile & navigation customization
customizes the dashboard header title ("{name}'s personal dashboard").
destination for the dashboard header homepage button and logo (default: https://davidlechan.dev).
layout & overflow mode display
select rotating mode to cycle rows at full height, or scrolling mode to display all rows.
seconds (default: 30s)
time to display each widget row before rotating to the next row.
spotify integration unconfigured
in developer.spotify.com, add this exact redirect uri:
important: spotify requires https://. whitelist both https://davidlechan.dev/dashboard/ and https://davidlechan.dev/dashboard to prevent matching errors.
override the redirect uri sent to spotify accounts oauth.
pkce flow | no client secrets stored
when active and music plays, spotify stays pinned in slot 1 while the other slot cycles through all non-pinned widgets.
world clock & primary time zone multi-zone
the primary zone receives emphasized visual placement with live seconds and date.
cards list
seconds (default: 10s)
time to display each set of alternate time zone rows before cycling to the next set.
calendar feeds ical / ics
remote calendars
enter private or public ics feed links from google calendar, apple calendar, or outlook.
select how the calendar widget displays events on your dashboard.
most calendar providers block browser requests (cors). provide a custom cors proxy prefix or leave empty for automated fallback.
cloudflare calendar worker setup guide ▾

Google Calendar, Apple iCloud, and Outlook block browser requests (CORS). Deploy a free Cloudflare Worker to proxy calendar feeds securely:

  1. Log in to workers.cloudflare.com and choose Workers & Pages > Create Application > Create Worker.
  2. Name your worker (e.g. calendar-worker) and click Deploy.
  3. Click Edit Code and replace the code with the script below:
export default {
  async fetch(request) {
    const url = new URL(request.url);
    const targetUrl = url.searchParams.get('url');
    if (!targetUrl) {
      return new Response('Missing ?url= parameter', { status: 400 });
    }

    const corsHeaders = {
      'Access-Control-Allow-Origin': '*',
      'Access-Control-Allow-Methods': 'GET, OPTIONS',
      'Access-Control-Allow-Headers': '*',
    };

    if (request.method === 'OPTIONS') {
      return new Response(null, { headers: corsHeaders });
    }

    try {
      const res = await fetch(targetUrl, {
        headers: { 'User-Agent': 'Mozilla/5.0 (compatible; CalendarWorker/1.0)' },
      });
      const body = await res.text();
      return new Response(body, {
        status: res.status,
        headers: {
          ...corsHeaders,
          'Content-Type': 'text/calendar; charset=utf-8',
          'Cache-Control': 'public, max-age=300',
        },
      });
    } catch (err) {
      return new Response('Proxy Error: ' + err.message, {
        status: 502,
        headers: corsHeaders,
      });
    }
  },
};
  1. Click Deploy.
  2. Copy your worker URL (e.g. https://calendar-worker.<subdomain>.workers.dev/?url=) into the input above and click Save Settings.

view dashboard ↗