From 1ed0226b69655ba440ee9535274fa2e4f90b4fee Mon Sep 17 00:00:00 2001 From: Frederik Spirgi Date: Wed, 9 Sep 2026 08:50:47 +0200 Subject: [PATCH] rebrand --- README.md | 8 ++++++-- package.json | 7 +++++-- public/app/constants.js | 13 +++++++------ public/app/dom.js | 8 ++++---- public/app/themeController.js | 10 ++++++---- public/index.html | 18 ++++++++++-------- public/market.html | 7 ++++--- public/market.js | 4 ++-- public/privacy.html | 1 + public/script.js | 16 ++++++++-------- public/settings.html | 27 ++++++++++++++------------- public/settings.js | 8 ++++---- public/style.css | 9 ++++++++- public/tos.html | 1 + 14 files changed, 80 insertions(+), 57 deletions(-) diff --git a/README.md b/README.md index 5e92ca3..c701a3f 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,13 @@ -# KrisHD_AI +# Elsewhere -KrisHD_AI is an Express + SQLite app for account-based chat, persona management, roleplay chat sessions, and a simple persona market backed by a remote model API. +Elsewhere is an Express + SQLite app for account-based chat, persona management, roleplay chat sessions, and a simple persona market backed by a remote model API. + +A space for every conversation. Six appearance styles (Grove, Parchment, Aurora, Current, Iris, and Graphite) each support light and dark modes. The Elsewhere identity stays consistent across styles. Internal theme and storage keys remain stable to preserve saved preferences. ## Setup +Node.js 22 or newer is required. + 1. Install dependencies with `npm install`. 2. Copy `.env.example` to `.env` and set at least `SESSION_SECRET`. 3. Start the app with `npm run dev` for local development or `npm start` for a normal server run. diff --git a/package.json b/package.json index 2e0073f..f520c67 100644 --- a/package.json +++ b/package.json @@ -3,6 +3,9 @@ "version": "1.0.0", "type": "module", "main": "server.js", + "engines": { + "node": ">=22" + }, "scripts": { "start": "node server.js", "dev": "node --watch server.js", @@ -10,8 +13,8 @@ "test": "node --test" }, "dependencies": { - "bcrypt": "^5.1.1", - "better-sqlite3": "^9.5.0", + "bcrypt": "^6.0.0", + "better-sqlite3": "^13.0.3", "body-parser": "^1.20.2", "express": "^4.19.2", "express-session": "^1.17.3", diff --git a/public/app/constants.js b/public/app/constants.js index 0b63eea..cda0318 100644 --- a/public/app/constants.js +++ b/public/app/constants.js @@ -6,11 +6,12 @@ export const onboardingPrompts = { roleplay: ["Start a roleplay scene with immediate tension.", "Give me a dramatic opening with clear stakes."] }; +// Stable keys preserve existing saved appearance preferences. export const themes = { - "fakegpt": {name: "FakeGPT", short: "FG"}, - "fraud": {name: "Fraud", short: "FR"}, - "germini": {name: "Germini", short: "GE"}, - "slopilot": {name: "Slopilot", short: "SP"}, - "beta-ai": {name: "Beta AI", short: "BA"}, - "confusity": {name: "Confusity", short: "CF"} + "fakegpt": {name: "Grove", short: "GR"}, + "fraud": {name: "Parchment", short: "PA"}, + "germini": {name: "Aurora", short: "AU"}, + "slopilot": {name: "Current", short: "CU"}, + "beta-ai": {name: "Iris", short: "IR"}, + "confusity": {name: "Graphite", short: "GP"} }; diff --git a/public/app/dom.js b/public/app/dom.js index 2fd97f3..c8114a2 100644 --- a/public/app/dom.js +++ b/public/app/dom.js @@ -112,8 +112,8 @@ const onboardingContinue = $("onboardingContinue"); const onboardingSkip = $("onboardingSkip"); const authScreens = document.querySelectorAll(".auth-screen"); const toggleButtons = document.querySelectorAll(".auth-toggle .toggle"); -const themeNameTargets = document.querySelectorAll("[data-theme-name]"); -const themeLogoTargets = document.querySelectorAll("[data-theme-logo]"); +const brandNameTargets = document.querySelectorAll("[data-brand-name]"); +const brandLogoTargets = document.querySelectorAll("[data-brand-logo]"); const modelSection = document.querySelector(".chat-drawer-section--model"); const personaSection = document.querySelector(".chat-drawer-section--persona"); @@ -231,8 +231,8 @@ export { sendBtn, saveGenerationSettingsBtn, sessionUser, - themeLogoTargets, - themeNameTargets, + brandLogoTargets, + brandNameTargets, toggleButtons, userPersonaList }; diff --git a/public/app/themeController.js b/public/app/themeController.js index aae6d62..661a76f 100644 --- a/public/app/themeController.js +++ b/public/app/themeController.js @@ -24,16 +24,17 @@ export function applyTheme(themeKey, { persist = true, title = null, themeSelect = null, - nameTargets = document.querySelectorAll("[data-theme-name]"), - logoTargets = document.querySelectorAll("[data-theme-logo]") + nameTargets = document.querySelectorAll("[data-brand-name]"), + logoTargets = document.querySelectorAll("[data-brand-logo]") } = {}) { const nextTheme = normalizeTheme(themeKey); const theme = themes[nextTheme]; + document.documentElement.dataset.theme = nextTheme; document.body.dataset.theme = nextTheme; if (typeof title === "function") document.title = title(theme); if (typeof title === "string") document.title = title; - nameTargets.forEach((target) => { target.textContent = theme.name; }); - logoTargets.forEach((target) => { target.textContent = theme.short; }); + nameTargets.forEach((target) => { target.textContent = "elsewhere"; }); + logoTargets.forEach((target) => { target.textContent = ""; target.classList.add("doorway-mark"); }); if (themeSelect) themeSelect.value = nextTheme; if (persist) localStorage.setItem(THEME_STORAGE_KEY, nextTheme); document.dispatchEvent(new CustomEvent("appearancechange", {detail: {theme: nextTheme}})); @@ -42,6 +43,7 @@ export function applyTheme(themeKey, { export function applyThemeMode(modeKey, {persist = true, modeSelect = null} = {}) { const nextMode = normalizeThemeMode(modeKey); + document.documentElement.dataset.themeMode = nextMode; document.body.dataset.themeMode = nextMode; if (modeSelect) modeSelect.value = nextMode; if (persist) localStorage.setItem(THEME_MODE_STORAGE_KEY, nextMode); diff --git a/public/index.html b/public/index.html index 8d3532b..a10e550 100644 --- a/public/index.html +++ b/public/index.html @@ -2,12 +2,13 @@ - FakeGPT + + Elsewhere - + @@ -15,10 +16,11 @@
- +
-

Private workspace

-

FakeGPT

+

Your conversation space

+

elsewhere

+

A space for every conversation.

@@ -80,7 +82,7 @@