Dashboard
culturalverse content overview
—
Total Lessons
—
Published Live
—
Drafts
3
Active Cultures
Recent Activity
Loading activity…
Quick Actions
All Lessons
loading…
| ID | Title | Module | Read time | Status | Actions |
|---|---|---|---|---|---|
| Loading lessons… | |||||
Lessons
| ID | Title | Read time | Status | Actions |
|---|---|---|---|---|
| Loading… | ||||
New Lesson
Add or edit a lesson in the Culturalverse
Prefix: km- (Kānaka) · ke- (Kemet) · bridge- (Bridge)
Supports: <h4> <p> <ul><li> <callout> <callout type="gold"> <facts>val::key|val::key</facts> <twocol left="" right="">…||…</twocol> <concepts> <quote cite="">
0 words · 0 chars
Controls display order within the module
Supabase Status
Checking Supabase connection…
Globe Cultures
Manage cultures shown on the Cosmic Weave globe
| ID | Name | Theme | Status | Actions |
|---|---|---|---|---|
| kanaka | 🌺 Kānaka Maoli | emerald | Live | |
| kemet | ☥ Ancient Kemet | gold | Live | |
| bridge | 🌐 The Bridge | bridge | Live | |
| dreamtime | 🌏 Dreamtime | rust | Coming Soon | |
| dogon | 🪘 Dogon | amber | Coming Soon | |
| vedic | 🕉️ Vedic | saffron | Coming Soon |
💡 Culture edits update
culturalverse-data.js — use Copy to File after saving to get the formatted entry.
Supabase DB Setup Guide
Run these SQL commands in Supabase → SQL Editor to enable live content management
Step 1 — Create the lessons table
Go to Supabase → SQL Editor → paste and run:
create table cv_lessons (
id text primary key, -- e.g. 'km-laau'
module text not null, -- 'kanaka' | 'kemet' | 'bridge'
module_id text, -- e.g. 'kanaka-healing'
lesson_num text, -- e.g. 'KM·09'
title text not null,
read_time text, -- e.g. '16 min'
lead_text text, -- lead paragraph (plain text)
content text, -- full lesson content (HTML/tags)
sources text, -- sources block (newline separated)
mana integer default 100,
sort_order integer default 0,
status text default 'draft', -- 'draft' | 'live'
created_at timestamptz default now(),
updated_at timestamptz default now()
);
-- Row Level Security
alter table cv_lessons enable row level security;
create policy "Public can read live lessons"
on cv_lessons for select
using (status = 'live');
create policy "Admins can manage all lessons"
on cv_lessons for all
using (
exists (
select 1 from profiles
where profiles.id = auth.uid()
and (profiles.theme->>'_isAdmin')::boolean = true
)
);
Step 2 — Grant yourself admin access
In Supabase → Table Editor → profiles → find your row → edit the
theme JSONB column. Add "_isAdmin": true to the existing JSON object:{
"_isAdmin": true,
"_cvLessons": [],
"_cvMana": 0
/* ... keep all your existing theme keys */
}
Once this is set, this admin panel will be accessible only to your account. Anyone else who tries to load the page will be redirected back to Culturalverse.
Step 3 — Seed your existing lessons into the DB
Once the table exists, run this from the SQL Editor to insert the current lessons from
culturalverse-data.js as a starting point. Paste one lesson at a time or build an import script:insert into cv_lessons (id, module, lesson_num, title, read_time, status, sort_order)
values
('km-kumulipo', 'kanaka', 'KM·01', 'The Kumulipo — Sacred Chant of Creation', '12 min', 'live', 1),
('km-wakea', 'kanaka', 'KM·02', 'Wākea & Papahānaumoku', '8 min', 'live', 2),
('km-starcompass','kanaka','KM·03', 'The Star Compass', '10 min', 'live', 3),
('km-hokuleaa', 'kanaka', 'KM·04', 'Hōkūleʻa — The Voyaging Canoe', '8 min', 'live', 4),
('km-ahupuaa', 'kanaka', 'KM·05', 'The Ahupuaʻa', '10 min', 'live', 5),
('km-loikalo', 'kanaka', 'KM·06', 'Loʻi Kalo & Loko Iʻa', '10 min', 'live', 6),
('km-olelo', 'kanaka', 'KM·07', 'ʻŌlelo Hawaiʻi', '8 min', 'live', 7),
('km-hula', 'kanaka', 'KM·08', 'Hula — The Body as Sacred Text', '8 min', 'live', 8),
('km-laau', 'kanaka', 'KM·09', 'Laʻau Lapaʻau — Hawaiian Plant Medicine', '16 min', 'live', 9),
('ke-nun', 'kemet', 'KE·01', 'Nun & the Primordial Waters', '8 min', 'live', 1),
('ke-ennead', 'kemet', 'KE·02', 'The Heliopolitan Ennead', '12 min', 'live', 2),
('ke-ptah', 'kemet', 'KE·03', 'Ptah & the Memphite Theology', '8 min', 'live', 3),
('ke-maat', 'kemet', 'KE·04', 'Maʻat — Truth, Justice, and Cosmic Balance', '10 min', 'live', 4),
('ke-maat-politics','kemet','KE·05','Maʻat as Political Philosophy', '7 min', 'live', 5),
('ke-medunetjer','kemet', 'KE·06', 'Medu Netjer — Words of the Gods', '9 min', 'live', 6),
('ke-medicine', 'kemet', 'KE·07', 'Kemetic Medicine — Imhotep, the Papyri, and Healing','14 min','live',7),
('bridge-darkness','bridge','BR·01','Both Begin in Primordial Darkness and Water', '6 min', 'live', 1),
('bridge-pairs', 'bridge', 'BR·02', 'Creation Through Paired Complementary Forces', '6 min', 'live', 2),
('bridge-aloha-maat','bridge','BR·03','Aloha and Maʻat — Two Philosophies of Cosmic Alignment','10 min','live',3)
on conflict (id) do nothing;
Step 4 — Update culturalverse-data.js to fetch from Supabase
Once the table is populated, replace the static
CULTURALVERSE_DATA loader in culturalverse-lessons.js with a Supabase fetch. The admin panel will then be the single source of truth for all lesson content — no more editing the data file by hand.// In culturalverse-lessons.js — add at init:
async function loadLessonsFromDB() {
const sb = window.piko_supa;
if (!sb) return false; // fallback to static data
const { data, error } = await sb
.from('cv_lessons')
.select('*')
.eq('status', 'live')
.order('module')
.order('sort_order');
if (error || !data?.length) return false;
// merge DB content into CULTURALVERSE_DATA lessons
data.forEach(row => {
const culture = CULTURALVERSE_DATA.cultures.find(c => c.id === row.module);
if (!culture) return;
culture.modules.forEach(mod => {
const lesson = mod.lessons.find(l => l.id === row.id);
if (lesson) {
// overwrite with DB content if present
if (row.title) lesson.title = row.title;
if (row.content) lesson.content = row.content;
if (row.read_time) lesson.readTime = row.read_time;
}
});
});
return true;
}
Settings
Admin account & password management
Current Auth Mode
⚙️ Change Local Password
Changes the
admin username password stored in this browser.
Minimum 12 characters. This only affects the local fallback — your Pikoverse password is managed via pikoverse.xyz.
🔗 Switch to Supabase Auth
To sign in with your Pikoverse email instead of the local username/password,
run this SQL in Supabase → SQL Editor with your actual email:
update profiles
set theme = jsonb_set(
coalesce(theme, '{}'),
'{_isAdmin}',
'true'::jsonb
)
where id = (
select id from auth.users where email = 'your@email.com'
);
-- Confirm:
select id, display_name, theme->>'_isAdmin' as is_admin
from profiles
where theme->>'_isAdmin' = 'true';
Once set, sign out and sign back in using your Pikoverse email. Saves will go directly to Supabase.