Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
@@ -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.

Expand Down
4 changes: 2 additions & 2 deletions android/app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<?xml version='1.0' encoding='utf-8'?>
<resources>
<string name="app_name">Math Biotech</string>
<string name="title_activity_main">Math Biotech</string>
<string name="app_name">Inmerson Lab</string>
<string name="title_activity_main">Inmerson Lab</string>
<string name="package_name">com.inmersion.mathbiotech</string>
<string name="custom_url_scheme">com.inmersion.mathbiotech</string>
</resources>
2 changes: 1 addition & 1 deletion capacitor.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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'
};

Expand Down
3 changes: 2 additions & 1 deletion components/Sidebar.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -203,7 +204,7 @@ export const Sidebar: React.FC<SidebarProps> = ({ currentView, currentModule, se
<Dna size={20} />
</div>
<div>
<h1 className="font-bold text-white text-base leading-tight tracking-tight">Math Biotech</h1>
<h1 className="font-bold text-white text-base leading-tight tracking-tight">{BRAND_SHORT_NAME}</h1>
<div className="text-[10px] font-mono text-accent-cyan uppercase tracking-wider mt-0.5 opacity-80">{currentModule.replace('_', ' ')}</div>
</div>
</div>
Expand Down
30 changes: 30 additions & 0 deletions data/branding.test.ts
Original file line number Diff line number Diff line change
@@ -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');
});
});
5 changes: 5 additions & 0 deletions data/branding.ts
Original file line number Diff line number Diff line change
@@ -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.';
164 changes: 164 additions & 0 deletions docs/superpowers/plans/2026-08-06-inmerson-personal-branding.md
Original file line number Diff line number Diff line change
@@ -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.
Original file line number Diff line number Diff line change
@@ -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.
2 changes: 1 addition & 1 deletion index.html
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
<link rel="manifest" href="/manifest.json">
<title>Math Biotech</title>
<title>Inmerson • Personal Math &amp; Biotech Lab</title>
<script src="https://cdn.tailwindcss.com"></script>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800&family=JetBrains+Mono:wght@400;500;700&display=swap" rel="stylesheet">

Expand Down
4 changes: 2 additions & 2 deletions manifest.json
Original file line number Diff line number Diff line change
@@ -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",
Expand Down
4 changes: 2 additions & 2 deletions metadata.json
Original file line number Diff line number Diff line change
@@ -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": []
}
10 changes: 5 additions & 5 deletions server/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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()
});
});
Expand All @@ -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: {
Expand Down Expand Up @@ -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;
3 changes: 2 additions & 1 deletion views/AIChatView.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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<Message[]>([
{ 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<HTMLDivElement>(null);
Expand Down
14 changes: 11 additions & 3 deletions views/DashboardView.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,11 @@ import {
LearningDestinationRef,
searchLearningDestinations,
} from '../data/learningCatalog';
import {
BRAND_DESCRIPTION,
BRAND_NAME,
BRAND_TAGLINE,
} from '../data/branding';

interface ModuleConfig {
id: ModuleType;
Expand Down Expand Up @@ -253,10 +258,13 @@ export const DashboardView: React.FC<DashboardProps> = ({ onSelectModule, onNavi
<Dna size={28} className="text-white md:hidden" />
<Dna size={40} className="hidden text-white md:block" />
</div>
<h1 className="text-4xl font-black tracking-tighter text-white sm:text-5xl md:text-7xl">Math Biotech</h1>
<div>
<p className="mb-1 text-[10px] font-bold uppercase tracking-[0.22em] text-accent-cyan sm:text-xs md:text-sm">{BRAND_TAGLINE}</p>
<h1 className="text-4xl font-black tracking-tighter text-white sm:text-5xl md:text-7xl">{BRAND_NAME}</h1>
</div>
</div>
<p className="mt-4 max-w-2xl text-sm font-light leading-relaxed text-slate-400 md:ml-2 md:text-lg">
Interactive mathematical modeling for the <strong className="font-semibold text-slate-200">Warsaw University of Life Sciences</strong>. Search a concept or enter a module to learn through observation and interaction.
<p className="mt-4 max-w-3xl text-sm font-light leading-relaxed text-slate-400 md:ml-2 md:text-lg">
{BRAND_DESCRIPTION} Search a concept or enter a module to learn through careful observation and interaction.
</p>
</motion.header>

Expand Down
Loading