Saved locally
Saved locally
Nextra
Learn · Build · Operate
PERSONAL WORKSPACE

Welcome, Guest.

Choose where you want to work.

✦ QUICK CAPTURESave an idea without leaving home.
8-WEEK PROGRAM

Business Operations

Build the knowledge, systems, and habits to become stronger in modern office, operations, and business-support roles.

Strategy Operations Systems Implementation
Program Progress Your 8-week learning plan
0%
✦
Next Assignment Up next
Coursework

Loading next assignment…

Due Date Make the plan fit real life.
♡

Need more time?
Adjust it here. Your custom date autosaves and syncs.

▤

Coursework

Your eight-week business operations learning journey

Coursework needs attention
Schedule controls Adjust your plan without rebuilding the calendar.
Focus Timer
One focused block is enough to move the course forward.
45:00
CAREER / APPLICATION TRACKER

Job Applications

Keep the useful parts of your spreadsheet without the giant horizontal row. Track where you applied, what the company does, pay, interviews, interest, and what happened next.

Total applications0
Active0
Interviewing0
Offers / accepted0
NEW / UPDATEAdd application
0 of 0 applications
AP · Applied REV · Under review INT · Interview PINT · Post interview DENY · Not selected UNKNOWN · Not recorded
LIFE / PERSONAL ORGANIZATION

Projects & Tasks✳

Capture first. Organize later. Keep everything from one-off errands to long-term goals in one private space.

◈ Private to your Nextra account
INBOX0Waiting to organize
OPEN ITEMS0Across all stages
DUE NOW0Overdue or due today
PROJECTS0Your project folders
✦

Press Enter to save it immediately. No project or deadline required. Alt + Q opens capture from anywhere in Nextra.

YOUR TO-DO SPACE

Inbox

0 items
Saving and syncChanges are saved locally and merged with your account's existing Supabase cloud sync. Deleted items are retained as hidden sync records so they do not reappear on another device. Backups include this workspace.
TASK DETAILS

New task or idea

PROJECT FOLDER

Create project

BUILD LAB / WEB-001 FROM ZERO → DEPLOYED APP

Learn the stack by rebuilding what you already use.

This curriculum uses Nextra as the working project. Explore web foundations, a 13-lesson JavaScript track, DevTools debugging, app behavior, browser state, PWA caching, Supabase, SQL security, and Cloudflare Pages deployment.

HTMLStructure and meaning
CSSLayout and visual system
JavaScriptBehavior and state
SQL + SupabaseCloud data and access rules
PROGRESS / LAB 0 / 0 COMPLETE
0%

Start with the anatomy of a web page.

AUTOSAVE / DATA FLOW LOCAL-FIRST
USER CHANGECheck a box, type a note, or finish a Build Lab lesson.
LOCAL SAVEState is written to localStorage immediately.
DEBOUNCEA short timer waits for changes to stop before cloud write.
SUPABASEThe newest state is upserted to the user's row.
SAFETY SYNCPeriodic and lifecycle-triggered syncs reduce stale-device risk.
ARCHITECTURE / WHAT HAPPENS WHEN YOU OPEN THE APP
CLOUDFLARE PAGESServes the modular HTML, CSS, JavaScript, data, assets, manifest and service worker from the Pages edge network.
BROWSERParses HTML, applies CSS and runs JavaScript.
LOCAL STATElocalStorage keeps progress available on this device.
SUPABASE AUTHIdentifies you with a persistent browser session.
POSTGRES / RLSStores JSON state and restricts rows to your user ID.
STYLE LAB / CSS VARIABLES LIVE EXPERIMENT
LIVE CSS PREVIEW

The browser redraws this immediately.

These controls update CSS custom properties live. This is the same design-token concept used by Nextra's theme engine in css/app.css and js/core.js.

CURRENT CODING PROJECT PROJECT FILES

Keep the files for whatever you are actively building here, even when it is not tied to a specific Build Lab lesson.

Current Coding Project 0 files
NEW IN v4.1 / DEDICATED PROGRAMMING TRACK

JavaScript: from first variable to Nextra feature.

13 progressive lessons with explanations, hands-on tasks, guided steps, Nextra source references, troubleshooting and self-checks. Build a mock Plant Care Log as the capstone. Existing Build Lab progress and file uploads continue to work.

0 of 13 JavaScript lessons complete
SOURCE-GUIDED WEB DEVELOPMENT LAB

Learn Nextra by reading the code that actually powers it.

Browse Nextra the same way you would browse a real codebase: by folder and module. Expand a folder, open a file, then click any source line to see which Build Lab lesson explains that region.

HTMLCSSJavaScriptStatePWASupabase SQL
BODY / PAGE MAP

The page is a tree of containers.

Each visible region has an HTML structure, CSS rules, and often JavaScript behavior attached to it.

<body>Browser pageContains the app and scripts.
<main>App shellShared wrapper around Nextra.
<header> + <nav>NavigationBrand, Home/System links, autosave status.
.tab-pageApp screensHome, Coursework, Build Lab, Code Lab, Sync.
#courseAssignmentsRendered from JavaScript data.
#buildLessonsLessonsAlso rendered from data.
localStorageBrowser memoryProgress and preferences.
SupabaseCloud layerAuthentication and synced state.
GUIDED ANATOMY

Open a section and trace it into the source.

Each dropdown defines the important syntax and links to official documentation.

01 Document shell: <html>, <head>, and <body>CORE-01 · CORE-02 ⌄

What it does

The browser begins with the document shell. The head contains metadata, fonts, the PWA manifest, and CSS. The body contains the visible app and JavaScript behavior.

Representative code

<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>Nextra — Career Learning</title>
</head>
<body>
  <main>...</main>
  <script>...</script>
</body>
</html>

Terms in this section

lang="en"Declares the document language.
charset="utf-8"Selects UTF-8 text encoding.
viewportControls mobile viewport scaling.
<body>Contains the rendered page content.

Go deeper

02 Nextra app shell and tab pagesCORE-02 · CORE-04 ⌄

What it does

The app shell contains the shared header plus separate Coursework, Build Lab, Code Lab, and Sync sections. JavaScript toggles the active class so only one app page is visible at a time.

Representative code

<main class="app-shell">
  <header>...</header>
  <section id="pageCoursework" class="tab-page active">...</section>
  <section id="pageBuild" class="tab-page">...</section>
  <section id="pageCode" class="tab-page">...</section>
  <section id="pageSync" class="tab-page">...</section>
</main>

Terms in this section

idA unique element identifier.
classA reusable styling/behavior hook.
activeA state class used to show the selected page.
<section>A semantic thematic region.

Go deeper

03 Navigation and clean URL routingCORE-05 ⌄

What it does

Nextra uses setTab() as a small client-side router. It shows the requested screen, updates the browser URL with the History API, and restores the correct screen when Back or Forward is used.

Representative code

function setTab(tab) {
  page.classList.toggle("active", tab === "coursework");
  buildPage.classList.toggle("active", tab === "build");
  codePage.classList.toggle("active", tab === "code");
}

Terms in this section

functionDeclares reusable JavaScript logic.
classList.toggle()Adds or removes a class based on a condition.
onclickRuns JavaScript when a control is activated.
DOMThe browser's object representation of the HTML document.

Go deeper

04 Coursework grid and responsive layoutCORE-03 · CORE-04 ⌄

What it does

Coursework uses CSS Grid for the main content and sidebar. Media queries collapse the grid on smaller screens, allowing the same HTML to work on desktop and mobile.

Representative code

.coursework-layout {
  display: grid;
  grid-template-columns: minmax(0, 1fr) 286px;
  gap: 14px;
}

@media (max-width: 1080px) {
  .coursework-layout { grid-template-columns: 1fr; }
}

Terms in this section

display:gridCreates a Grid layout context.
grid-template-columnsDefines the grid column tracks.
minmax()Sets minimum and maximum track sizing.
@mediaConditionally applies responsive CSS.

Go deeper

05 Data-driven coursework renderingAPP-01 · CORE-05 ⌄

What it does

The assignment cards are generated from JavaScript data rather than copied into HTML 32 times. render() reads assignment objects plus saved state, creates DOM nodes, and inserts them into the course container.

Representative code

assignments.forEach(a => {
  const card = document.createElement("article");
  card.innerHTML = `<strong>${a.title}</strong>`;
  course.appendChild(card);
});

Terms in this section

arrayAn ordered JavaScript collection.
objectA set of named key/value properties.
createElement()Creates a DOM element.
template literalA backtick string supporting ${expression}.

Go deeper

06 Theme engine: canvas, panels, and accentCORE-06 ⌄

What it does

The theme system stores independent design tokens for the page background, foreground panels, and accent. JavaScript writes those values into CSS custom properties and derives readable supporting colors.

Representative code

:root {
  --user-background: #121014;
  --user-panel: #cbc7cc;
  --theme-accent: #d4479a;
}

.card { background: var(--user-panel); }

Terms in this section

--custom-propertyA reusable CSS variable.
var()Reads a custom property.
setProperty()Updates a CSS property from JavaScript.
color-mix()Creates a color by mixing two inputs.

Go deeper

07 localStorage: progress that survives refreshesAPP-02 ⌄

What it does

Course progress, notes, due dates, and preferences are serialized to localStorage. That keeps state available after refreshes before cloud synchronization happens.

Representative code

localStorage.setItem(
  STORE,
  JSON.stringify(state)
);

const restored = JSON.parse(
  localStorage.getItem(STORE) || "{}"
);

Terms in this section

localStorageBrowser key/value storage for the current origin.
JSON.stringify()Converts a JavaScript value to JSON text.
JSON.parse()Converts JSON text back to JavaScript.
originThe scheme/host/port boundary used by browser storage.

Go deeper

08 Autosave: local first, cloud secondAPP-03 · SQL-03 ⌄

What it does

Changes write to localStorage immediately. When signed in, a short debounce schedules cloud sync. syncNow() merges local and remote state, then upserts the result to Supabase.

Representative code

function saveLocal() {
  localStorage.setItem(STORE, JSON.stringify(state));

  clearTimeout(saveDebounce);
  saveDebounce = setTimeout(() => {
    syncNow(false);
  }, 650);
}

Terms in this section

debounceDelays repeated work until activity settles.
setTimeout()Schedules a callback later.
async / awaitSyntax for promise-based asynchronous work.
upsertInsert a missing row or update an existing one.

Go deeper

09 PWA manifest and service workerAPP-04 ⌄

What it does

The manifest describes the installable app. The service worker caches the app shell and can answer requests from CacheStorage, helping the installed PWA load reliably.

Representative code

self.addEventListener("install", event => {
  event.waitUntil(
    caches.open(CACHE).then(cache => cache.addAll(ASSETS))
  );
});

Terms in this section

service workerA background browser worker.
CacheStorageBrowser API for cached responses.
manifest.jsonMetadata for an installable web app.
fetch eventA network request intercepted by a service worker.

Go deeper

10 Supabase table and Row Level SecuritySQL-01 · SQL-02 · SQL-03 ⌄

What it does

Supabase stores course state in Postgres. The table contains a user_id, JSON state/preferences, and timestamps. RLS policies compare auth.uid() to user_id so each signed-in user can only access their own row.

Representative code

create table public.course_state (
  user_id uuid primary key
    references auth.users(id),
  state jsonb not null default '{}',
  preferences jsonb not null default '{}'
);

alter table public.course_state
enable row level security;

Terms in this section

uuidA universally unique identifier.
jsonbPostgreSQL JSON storage type.
primary keyUniquely identifies a row.
RLSRow Level Security.
auth.uid()Current authenticated Supabase user UUID.

Go deeper

11 Coursework file uploads and downloadsAPP-06 ⌄

What it does

The upload box receives File objects from the browser. Nextra stores the binary Blob in IndexedDB, keeps lightweight metadata in course state, and can optionally mirror the Blob into a private Supabase Storage bucket for cross-device downloads.

Representative code

<input type="file" multiple>

const file = input.files[0];
await putWorkBlob({ blob: file });

const url =
  URL.createObjectURL(file);

Terms in this section

type="file"Creates a browser file picker.
multipleAllows more than one selected file.
File / BlobBrowser objects representing binary file data.
IndexedDBBrowser database that can persist Blobs and structured objects.
createObjectURL()Creates a temporary URL that can download or display a Blob.

Go deeper

12 Learning-area side drawerAPP-07 · CORE-04 · CORE-05 ⌄

What it does

The learning drawer separates category-level navigation from page-level navigation. Career currently contains Business Operations. Coding contains Build Lab and Code Lab. Because the drawer is generated from LEARNING_AREAS, future tracks such as Python can be added to the Coding category without rebuilding the menu from scratch.

Representative code

const LEARNING_AREAS = [
  {
    id: "coding",
    pages: [
      { tab: "build" },
      { tab: "code" }
    ]
  }
];

Terms in this section

nested arrayPages are grouped inside a learning-area object.
data-drawer-tabStores which app page a rendered menu button opens.
aria-expandedCommunicates whether the drawer is open.
Escape keyProvides keyboard dismissal for the side panel.

Go deeper

LESSON MAP

Every Build Lab lesson connected to the project.

The source-line selector highlights matching lessons here.

ATTRIBUTE + SYNTAX DICTIONARY

What does that thing actually do?

Open any term while reading the source.

HTML elements

<header>⌄

Introductory or navigation content.

Official reference ↗
<nav>⌄

Navigation region.

Official reference ↗
<main>⌄

Dominant document content.

Official reference ↗
<section>⌄

Thematic section.

Official reference ↗
<article>⌄

Self-contained composition.

Official reference ↗
<aside>⌄

Related secondary content.

Official reference ↗
<details>⌄

Native expandable disclosure.

Official reference ↗
<summary>⌄

Clickable label for <details>.

Official reference ↗

HTML attributes

id⌄

Unique element identifier.

Official reference ↗
class⌄

Reusable styling and behavior classes.

Official reference ↗
aria-label⌄

Accessible name for a control or region.

Official reference ↗
data-*⌄

Custom data stored on an HTML element.

Official reference ↗
href⌄

Navigation/resource target.

Official reference ↗
type⌄

Defines control/input behavior.

Official reference ↗
value⌄

Current/default form-control value.

Official reference ↗
placeholder⌄

Hint displayed in an empty form control.

Official reference ↗

CSS

:root⌄

Root pseudo-class, commonly used for global variables.

Official reference ↗
--custom-property⌄

Author-defined CSS variable.

Official reference ↗
var()⌄

Reads a CSS custom property.

Official reference ↗
display:grid⌄

Two-dimensional Grid layout.

Official reference ↗
display:flex⌄

One-dimensional Flexbox layout.

Official reference ↗
@media⌄

Conditional responsive CSS.

Official reference ↗
::before / ::after⌄

Generated pseudo-elements.

Official reference ↗
!important⌄

Raises declaration priority in the cascade.

Official reference ↗

JavaScript / DOM

const / let⌄

Block-scoped variable declarations.

Official reference ↗
function⌄

Reusable executable logic.

Official reference ↗
getElementById()⌄

Finds an element by id.

Official reference ↗
querySelector()⌄

Finds the first element matching a CSS selector.

Official reference ↗
classList⌄

Adds/removes/toggles classes.

Official reference ↗
addEventListener()⌄

Registers an event callback.

Official reference ↗
async / await⌄

Promise-based asynchronous control flow.

Official reference ↗
localStorage⌄

Persistent origin-scoped browser storage.

Official reference ↗
fetch()⌄

Promise-based network request API.

Official reference ↗

SQL / Supabase

CREATE TABLE⌄

Creates a database table.

Official reference ↗
uuid⌄

UUID data type.

Official reference ↗
jsonb⌄

Binary JSON storage type.

Official reference ↗
PRIMARY KEY⌄

Uniquely identifies a row.

Official reference ↗
RLS policy⌄

Row-level database access rule.

Official reference ↗
auth.uid()⌄

Current authenticated user's UUID.

Official reference ↗
PROJECT SOURCE / MODULE BROWSER

Open the code by folder, just like the deployed project.

Each dropdown represents a project layer. Expand a folder, choose a file, then inspect and search the real source Cloudflare is serving.

CURRENT MODULEindex.html
Click any source lineThe matching Build Lab lesson will appear here.
Loading source…
CODING / WEBSITE ARCHIVE

Your old websites, still alive.

Your recovered high-school websites live directly in /websites/. Nextra catalogs them here while Cloudflare serves each recovered HTML file as its own real website.

LIVE PROJECT PATTERN nextra-learning.pages.dev/websites/project-name.html
MANUAL ADD GUIDE

Add another archived website without changing Nextra's code.

Open full guide ↗
  1. Extract the latest Nextra ZIP.Work from the same project folder you deploy to Cloudflare.
  2. Copy the old .html file into /websites/.Example: /websites/web-design-final.html.
  3. Keep the file self-contained.If its CSS and JavaScript are already inside the HTML, nothing else is needed.
  4. Add it to websites/catalog.json.Enter a title, exact HTML filename, year, and optional description.
  5. Deploy the whole Nextra folder/ZIP again.Cloudflare publishes the archive folder with the rest of Nextra.
Old-site compatibility tip

If each project really contains all of its CSS and JavaScript inside one HTML file, it should load as-is. Only projects that reference external files need those extra files copied too.

CATALOG

Archived websites

Loading /websites/catalog.json…
PLANT CARE SYSTEM

Plant Command Center

A daily plant-care hub for the moth orchid and African violet, with Ask Nextra AI guidance, weather-aware setup instructions, detailed care guides, a long-term care journal, watering/fertilizer/repot history, plant milestones, live shelf data, and troubleshooting for future problems.

Omaha · Weather-aware
Plant Care ready.Open this section to load the current forecast.
Your account

Profile & Account

Manage your Nextra profile, view your account access, or sign out.

Profile
Your Nextra Profile
G
Current profile Guest Sign in to access Nextra. Signed out

Your display name belongs to the Supabase account that is signed in. It follows that account to your other devices and is used for the welcome message on Home.

Sign in first to set your profile name.
Cloud + device management

Keep phone and desktop on the same page.

Owner-only controls for account access, cloud sync, backups, appearance, and deployment settings.

System
Build & Release Information
v—
Document Nextra version-number rules Release numbering reference

Write the custom GENERATION.FEATURE.MINOR.HOTFIX convention into BUILD-VERSIONING.md and surface it in Build & Release Information so the release numbering rules are easy to check.

GenerationMajor Nextra generation; resets the other three numbers.
FeatureSubstantial new capability; resets minor and hotfix.
MinorOrdinary enhancements and refinements; resets hotfix.
HotfixFocused correction without new planned functionality.

Trailing zero segments are omitted: 4.0.2 is shorthand for 4.0.2.0. Refer to BUILD-VERSIONING.md for the full rules and examples.

Build IDUnknown
ReleasedUnknown
ChannelUnknown

Build information unavailable

This deployment has not loaded build metadata.

Included in this build
    Release history
    Version rule Choose GENERATION.FEATURE.MINOR.HOTFIX using BUILD-VERSIONING.md, then update data/build-info.js before deployment. The footer, drawer, and this card all read the same release metadata.
    Users
    Access Management

    Self-signups start as Pending. Approve a person to give them Business Operations access. You can also suspend Business Operations access later without deleting their account.

    Loading account access…
    Access + Cloud
    Supabase Workspace

    Nextra now uses the same Supabase project for password login, role checks, and account-specific cloud sync. The browser-safe Project URL and publishable key should also be placed in data/app-config.js so another device can reach the login screen without manual setup.

    Checking deployment login configuration…
    Checking account session…
    Multi-user setup

    Run database/supabase_access_setup.sql, keep your account as owner, and let your coworker use Create account on the Nextra login page. New accounts start pending; approve them above to unlock Business Operations.

    Diagnostics
    Sync Health

    Use this on both phone and desktop. The account fingerprint should match on both devices. Background checks are now read-only unless there is actually something new to save.

    Waiting for cloud connection.
    AccountSigned out
    Account fingerprint—
    This device—
    Last verified syncNever
    Cloud row updatedUnknown
    Notes on this device0
    Notifications
    Course Reminders

    Choose when this app should remind you about upcoming coursework. The calendar file is optional and stays based on the original course schedule; adjustable in-app due dates are the primary schedule.

    Notifications not configured.
    Planning
    Future Project Ideas A small parking lot for things we may build into Nextra later.
    • Public art portfolio + commissions Give Nextra a public-facing gallery, commission info, examples, and request CTA while keeping the workspace separate.
    • Custom Nextra domain + subdomains Eventually replace the pages.dev address and optionally separate the public site and workspace with subdomains.
    • Private commission manager Track inquiries, client details, price, deposit, references, revisions, deadlines, status, payment, and delivery privately.
    • Later polish: PWA + analytics Improve install/offline behavior and add privacy-friendly traffic insight once the public portfolio is useful enough to share.

    These are intentionally ideas, not active commitments. Add, remove, or reprioritize them as Nextra grows.

    Recovery
    Backup & Restore

    Your browser still keeps a local copy. Export a JSON backup periodically; restore merges the newest version of each assignment back into the app.