diff --git a/README.md b/README.md index 43825e3f..bebb5794 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ -# Math Biotech +# Inmerson • Personal Math & Biotech Lab -Mathematics learning application for biotechnology students, designed to be published as a responsive web app, an installable PWA and native mobile packages from one shared codebase. +A personal mathematics and biotechnology learning laboratory by Inmerson, designed to be published as a responsive web app, an installable PWA and native mobile packages from one shared codebase. The project combines interactive mathematical learning, biotechnology-oriented examples, three-dimensional visualizations and a REST API for deterministic calculations and study records. diff --git a/android/app/src/main/res/values/strings.xml b/android/app/src/main/res/values/strings.xml index f7c7636a..4d11aafd 100644 --- a/android/app/src/main/res/values/strings.xml +++ b/android/app/src/main/res/values/strings.xml @@ -1,7 +1,7 @@ - Math Biotech - Math Biotech + Inmerson Lab + Inmerson Lab com.inmersion.mathbiotech com.inmersion.mathbiotech diff --git a/capacitor.config.ts b/capacitor.config.ts index faf93081..6fe4abfb 100644 --- a/capacitor.config.ts +++ b/capacitor.config.ts @@ -2,7 +2,7 @@ import type { CapacitorConfig } from '@capacitor/cli'; const config: CapacitorConfig = { appId: 'com.inmersion.mathbiotech', - appName: 'Math Biotech', + appName: 'Inmerson Lab', webDir: 'dist' }; diff --git a/components/Sidebar.tsx b/components/Sidebar.tsx index b95f8ff7..0a6ce66a 100644 --- a/components/Sidebar.tsx +++ b/components/Sidebar.tsx @@ -8,6 +8,7 @@ import { Cylinder, Globe, ArrowUpRight, PieChart, Sparkles } from 'lucide-react'; import { motion, AnimatePresence } from 'framer-motion'; +import { BRAND_SHORT_NAME } from '../data/branding'; interface SidebarProps { currentView: ViewMode; @@ -203,7 +204,7 @@ export const Sidebar: React.FC = ({ currentView, currentModule, se
-

Math Biotech

+

{BRAND_SHORT_NAME}

{currentModule.replace('_', ' ')}
diff --git a/data/branding.test.ts b/data/branding.test.ts new file mode 100644 index 00000000..8bc8d0c7 --- /dev/null +++ b/data/branding.test.ts @@ -0,0 +1,30 @@ +import { describe, expect, it } from 'vitest'; +import { + BRAND_DESCRIPTION, + BRAND_FULL_NAME, + BRAND_NAME, + BRAND_SHORT_NAME, + BRAND_TAGLINE, +} from './branding'; + +describe('personal branding', () => { + it('uses the approved Inmerson identity', () => { + expect(BRAND_NAME).toBe('Inmerson'); + expect(BRAND_TAGLINE).toBe('Personal Math & Biotech Lab'); + expect(BRAND_FULL_NAME).toBe('Inmerson • Personal Math & Biotech Lab'); + expect(BRAND_SHORT_NAME).toBe('Inmerson Lab'); + }); + + it('contains no university attribution', () => { + const branding = [ + BRAND_NAME, + BRAND_TAGLINE, + BRAND_FULL_NAME, + BRAND_SHORT_NAME, + BRAND_DESCRIPTION, + ].join(' '); + + expect(branding).not.toContain('Warsaw University of Life Sciences'); + expect(branding).not.toContain('SGGW'); + }); +}); diff --git a/data/branding.ts b/data/branding.ts new file mode 100644 index 00000000..757d9d52 --- /dev/null +++ b/data/branding.ts @@ -0,0 +1,5 @@ +export const BRAND_NAME = 'Inmerson'; +export const BRAND_TAGLINE = 'Personal Math & Biotech Lab'; +export const BRAND_FULL_NAME = `${BRAND_NAME} • ${BRAND_TAGLINE}`; +export const BRAND_SHORT_NAME = 'Inmerson Lab'; +export const BRAND_DESCRIPTION = 'A personal interactive laboratory for mathematical modeling, biotechnology, observation and learning.'; diff --git a/docs/superpowers/plans/2026-08-06-inmerson-personal-branding.md b/docs/superpowers/plans/2026-08-06-inmerson-personal-branding.md new file mode 100644 index 00000000..ac303b8f --- /dev/null +++ b/docs/superpowers/plans/2026-08-06-inmerson-personal-branding.md @@ -0,0 +1,164 @@ +# Inmerson Personal Branding Implementation Plan + +> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. + +**Goal:** Replace university attribution with a consistent personal brand: `Inmerson • Personal Math & Biotech Lab`. + +**Architecture:** Add a small typed branding module for React-facing copy, then update static platform metadata with the same approved strings. Preserve mathematical and biotechnology learning terminology while removing external institutional ownership. + +**Tech Stack:** React 19, TypeScript, Vitest, Vite, PWA manifest, Capacitor, Android resources, Express. + +## Global Constraints + +- Primary name is exactly `Inmerson`. +- Signature is exactly `Personal Math & Biotech Lab`. +- Formal name is exactly `Inmerson • Personal Math & Biotech Lab`. +- Compact name is exactly `Inmerson Lab`. +- Do not retain `Warsaw University of Life Sciences` or `SGGW` in current user-facing source or metadata. +- Do not change package IDs, URLs, mathematical content, or application behavior. + +--- + +### Task 1: Establish tested branding constants + +**Files:** +- Create: `data/branding.test.ts` +- Create: `data/branding.ts` + +**Interfaces:** +- Produces: `BRAND_NAME`, `BRAND_TAGLINE`, `BRAND_FULL_NAME`, `BRAND_SHORT_NAME`, and `BRAND_DESCRIPTION` string constants. + +- [ ] **Step 1: Write the failing test** + +```ts +import { describe, expect, it } from 'vitest'; +import { + BRAND_DESCRIPTION, + BRAND_FULL_NAME, + BRAND_NAME, + BRAND_SHORT_NAME, + BRAND_TAGLINE, +} from './branding'; + +describe('personal branding', () => { + it('uses the approved Inmerson identity', () => { + expect(BRAND_NAME).toBe('Inmerson'); + expect(BRAND_TAGLINE).toBe('Personal Math & Biotech Lab'); + expect(BRAND_FULL_NAME).toBe('Inmerson • Personal Math & Biotech Lab'); + expect(BRAND_SHORT_NAME).toBe('Inmerson Lab'); + }); + + it('contains no university attribution', () => { + const branding = [BRAND_NAME, BRAND_TAGLINE, BRAND_FULL_NAME, BRAND_SHORT_NAME, BRAND_DESCRIPTION].join(' '); + expect(branding).not.toContain('Warsaw University of Life Sciences'); + expect(branding).not.toContain('SGGW'); + }); +}); +``` + +- [ ] **Step 2: Run verification and confirm RED** + +Run: `npm run verify` + +Expected: TypeScript fails because `./branding` does not exist. + +- [ ] **Step 3: Add the minimal branding module** + +```ts +export const BRAND_NAME = 'Inmerson'; +export const BRAND_TAGLINE = 'Personal Math & Biotech Lab'; +export const BRAND_FULL_NAME = `${BRAND_NAME} • ${BRAND_TAGLINE}`; +export const BRAND_SHORT_NAME = 'Inmerson Lab'; +export const BRAND_DESCRIPTION = 'A personal interactive laboratory for mathematical modeling, biotechnology, observation and learning.'; +``` + +- [ ] **Step 4: Run tests and confirm GREEN** + +Run: `npm run verify` + +Expected: branding tests and all existing checks pass. + +### Task 2: Apply branding to React surfaces + +**Files:** +- Modify: `views/DashboardView.tsx` +- Modify: `components/Sidebar.tsx` +- Modify: `views/AIChatView.tsx` + +**Interfaces:** +- Consumes: constants exported by `data/branding.ts`. + +- [ ] **Step 1: Update the dashboard hero** + +Import `BRAND_NAME`, `BRAND_TAGLINE`, and `BRAND_DESCRIPTION`. Render `BRAND_NAME` as the hero heading, `BRAND_TAGLINE` as a prominent signature, and `BRAND_DESCRIPTION` as supporting copy. + +- [ ] **Step 2: Update compact navigation identity** + +Import `BRAND_SHORT_NAME` in `Sidebar.tsx` and replace the `Math Biotech` heading with it. + +- [ ] **Step 3: Update AI introduction** + +Import `BRAND_SHORT_NAME` in `AIChatView.tsx` and introduce the assistant as `${BRAND_SHORT_NAME} Assistant`. + +- [ ] **Step 4: Run verification** + +Run: `npm run verify` + +Expected: Typecheck, all tests, and production build succeed. + +### Task 3: Apply branding to platform and repository metadata + +**Files:** +- Modify: `index.html` +- Modify: `manifest.json` +- Modify: `metadata.json` +- Modify: `capacitor.config.ts` +- Modify: `android/app/src/main/res/values/strings.xml` +- Modify: `README.md` +- Modify: `server/src/index.ts` + +**Interfaces:** +- Static surfaces use the exact approved strings from Global Constraints. + +- [ ] **Step 1: Update browser and PWA identity** + +Set the HTML title and manifest full name to `Inmerson • Personal Math & Biotech Lab`; set manifest short name to `Inmerson Lab`. + +- [ ] **Step 2: Update application metadata** + +Set metadata name to the formal brand and description to the personal-lab description. + +- [ ] **Step 3: Update installed app labels** + +Set Capacitor and Android visible app names to `Inmerson Lab`. Preserve `com.inmersion.mathbiotech` identifiers. + +- [ ] **Step 4: Update public project and API identity** + +Change the README heading to the formal brand. Rename API display messages to `Inmerson Lab API` without changing endpoints or behavior. + +- [ ] **Step 5: Run full verification** + +Run: `npm run verify` + +Expected: 0 type errors, 0 failed tests, successful Vite production build. + +### Task 4: Verify removal and deploy + +**Files:** +- Generated by workflow: `site/**` + +- [ ] **Step 1: Search current source** + +Search for `Warsaw University of Life Sciences` and `SGGW` in the branch. Expected: no current source matches except historical documentation or git history; no user-facing current file matches. + +- [ ] **Step 2: Open and merge the pull request** + +Create a PR describing the personal brand, red-green test evidence, and metadata updates. Merge only after CI succeeds. + +- [ ] **Step 3: Verify main and Pages workflows** + +Confirm main CI succeeds and the Pages publishing workflow commits fresh `site/` output. + +- [ ] **Step 4: Verify live deployment** + +Confirm the latest Pages build status is `built`, and `site/index.html` references the newly generated assets and formal browser title. diff --git a/docs/superpowers/specs/2026-08-06-inmerson-personal-branding-design.md b/docs/superpowers/specs/2026-08-06-inmerson-personal-branding-design.md new file mode 100644 index 00000000..161d64ea --- /dev/null +++ b/docs/superpowers/specs/2026-08-06-inmerson-personal-branding-design.md @@ -0,0 +1,38 @@ +# Inmerson Personal Branding Design + +## Goal + +Remove all Warsaw University of Life Sciences and SGGW attribution from the product, and present the application as a personal learning laboratory owned by Inmerson. + +## Brand system + +- Primary name: `Inmerson` +- Descriptive signature: `Personal Math & Biotech Lab` +- Full formal name: `Inmerson • Personal Math & Biotech Lab` +- Compact product reference: `Inmerson Lab` + +`Math Biotech` may remain as a description of the learning domain, but it must not be presented as an institution or external owner. + +## User interface + +The dashboard hero will lead with `Inmerson`, followed by the signature `Personal Math & Biotech Lab`. The supporting sentence will describe the application as a personal interactive laboratory for mathematical modeling and biotechnology, without mentioning any university. + +The sidebar will use `Inmerson Lab` as the compact identity so the narrow layout remains readable. The AI assistant will introduce itself as the Inmerson Lab assistant. + +## Platform metadata + +The browser title, PWA manifest, application metadata, Capacitor app name, and Android labels will use the personal brand. The repository README and backend API identity will also describe the project as Inmerson Lab so public and installed surfaces remain consistent. + +## Architecture + +A small `data/branding.ts` module will hold shared React-facing brand constants. Components will import these constants instead of duplicating names. Static files that cannot import TypeScript will use the exact same approved strings directly. + +## Testing + +A branding unit test will establish the approved name hierarchy and assert that exported branding contains neither `Warsaw University of Life Sciences` nor `SGGW`. Existing typecheck, unit tests, and production build must remain green. + +## Success criteria + +1. No current source or generated user-facing metadata attributes the project to Warsaw University of Life Sciences or SGGW. +2. Dashboard, sidebar, AI greeting, browser/PWA/mobile metadata, README, and API identity consistently use the Inmerson personal brand. +3. The branding regression test, full test suite, typecheck, production build, and GitHub Pages deployment succeed. diff --git a/index.html b/index.html index d9414d01..cffc7d56 100644 --- a/index.html +++ b/index.html @@ -8,7 +8,7 @@ - Math Biotech + Inmerson • Personal Math & Biotech Lab diff --git a/manifest.json b/manifest.json index 2333b3e1..e7033c60 100644 --- a/manifest.json +++ b/manifest.json @@ -1,6 +1,6 @@ { - "name": "Math Biotech SGGW", - "short_name": "MathBiotech", + "name": "Inmerson • Personal Math & Biotech Lab", + "short_name": "Inmerson Lab", "start_url": "/", "display": "standalone", "background_color": "#020617", diff --git a/metadata.json b/metadata.json index 95d76ced..9edd721b 100644 --- a/metadata.json +++ b/metadata.json @@ -1,5 +1,5 @@ { - "name": " Math Biotech", - "description": "A bio-inspired, interactive mathematical platform for analyzing Linear Algebra and Calculus through a futuristic research lens.", + "name": "Inmerson • Personal Math & Biotech Lab", + "description": "A personal interactive laboratory for mathematical modeling, biotechnology, observation and learning.", "requestFramePermissions": [] } \ No newline at end of file diff --git a/server/src/index.ts b/server/src/index.ts index 8d2e52ed..1ec41441 100644 --- a/server/src/index.ts +++ b/server/src/index.ts @@ -20,7 +20,7 @@ app.use(express.urlencoded({ extended: true })); app.get('/health', (req: Request, res: Response) => { res.json({ status: 'OK', - message: 'Math Biotech API is running', + message: 'Inmerson Lab API is running', timestamp: new Date().toISOString() }); }); @@ -32,9 +32,9 @@ app.use('/api/exam', examRoutes); // Root endpoint app.get('/', (req: Request, res: Response) => { res.json({ - name: 'Math Biotech API', + name: 'Inmerson Lab API', version: '1.0.0', - description: 'Backend API for Math Biotech Project', + description: 'Backend API for Inmerson Personal Math & Biotech Lab', endpoints: { health: '/health', matrix: { @@ -71,9 +71,9 @@ app.use((err: Error, req: Request, res: Response, next: express.NextFunction) => // Start server app.listen(PORT, () => { - console.log(`✅ Math Biotech API server running on port ${PORT}`); + console.log(`✅ Inmerson Lab API server running on port ${PORT}`); console.log(`📊 Health check available at http://localhost:${PORT}/health`); console.log(`📚 API documentation at http://localhost:${PORT}/`); }); -export default app; +export default app; \ No newline at end of file diff --git a/views/AIChatView.tsx b/views/AIChatView.tsx index 19e28312..69317388 100644 --- a/views/AIChatView.tsx +++ b/views/AIChatView.tsx @@ -3,6 +3,7 @@ import React, { useState, useRef, useEffect } from 'react'; import ReactMarkdown from 'react-markdown'; import { Send, Settings, Sparkles, Key, AlertTriangle, Bot } from 'lucide-react'; import { GoogleGenAI } from "@google/genai"; +import { BRAND_SHORT_NAME } from '../data/branding'; interface Message { id: string; @@ -17,7 +18,7 @@ export const AIChatView: React.FC = () => { const [input, setInput] = useState(''); const [showSettings, setShowSettings] = useState(() => !localStorage.getItem(STORAGE_KEY)); const [messages, setMessages] = useState([ - { id: '1', role: 'model', text: 'Hello! I am your Math Biotech Assistant. 🧬\n\nI can solve math problems or explain biological concepts. How can I help you today?' } + { id: '1', role: 'model', text: `Hello! I am your ${BRAND_SHORT_NAME} Assistant. 🧬\n\nI can solve math problems or explain biological concepts. How can I help you today?` } ]); const [isLoading, setIsLoading] = useState(false); const messagesEndRef = useRef(null); diff --git a/views/DashboardView.tsx b/views/DashboardView.tsx index 66535554..4e910fab 100644 --- a/views/DashboardView.tsx +++ b/views/DashboardView.tsx @@ -28,6 +28,11 @@ import { LearningDestinationRef, searchLearningDestinations, } from '../data/learningCatalog'; +import { + BRAND_DESCRIPTION, + BRAND_NAME, + BRAND_TAGLINE, +} from '../data/branding'; interface ModuleConfig { id: ModuleType; @@ -253,10 +258,13 @@ export const DashboardView: React.FC = ({ onSelectModule, onNavi -

Math Biotech

+
+

{BRAND_TAGLINE}

+

{BRAND_NAME}

+
-

- Interactive mathematical modeling for the Warsaw University of Life Sciences. Search a concept or enter a module to learn through observation and interaction. +

+ {BRAND_DESCRIPTION} Search a concept or enter a module to learn through careful observation and interaction.