diff --git a/README.md b/README.md index f9441ce..bde0aa3 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,36 @@ -# NeuroSemantics AI +# Semantika -A minimalist mobile app for iOS and Android. The product is one thing only: -an intelligent conversation partner with a specialized knowledge base in -neurosemantics and NLP. No course portal, no CRM, no community. +**Think Beyond Thought.** -Design language: calm, simple, clear. Off-white background, near-black text, -one dark blue-green accent. No animations, no gradients. +The world's first NeuroSemantic conversation platform. Semantika helps people +explore how they create meaning, interpret their experiences, and communicate +with themselves and others — through structured conversations inspired by +neurosemantic principles. + +## Brand + +- **Core promise** — Discover the meaning behind your thinking. +- **Mission** — Helping people create better meaning. +- **Vision** — To make NeuroSemantic thinking accessible to everyone. + +**Positioning.** Semantika is not therapy, not self-help, and not a course. +It is an intelligent reflection partner that uses neurosemantic models to +help the user explore thinking patterns, communication, and perspective. +Instead of quick advice, Semantika starts by helping the user explore how +they interpret their situation — supporting reflection and +perspective-taking, not delivering finished answers. + +**Honest claims.** Neurosemantics and NLP are presented as inspiration and +models for reflection, never as scientifically proven methods. This is +enforced in the system instructions and the knowledge base; copy in the app +and the stores must follow the same rule. + +**Tone.** Never judging, dramatic, overenthusiastic, or preaching. Always +calm, curious, clear, respectful, structured, thoughtful. + +**Design.** Scandinavian, clinical, quiet, precise, minimal. Off-white +background, near-black text, one dark blue-green accent. Generous white +space. No animations, no gradients. ## System overview @@ -106,7 +131,7 @@ npx cdk deploy After the first deploy: -1. Put values into the `neurosemantics/app` secret in Secrets Manager: +1. Put values into the `semantika/app` secret in Secrets Manager: `OPENAI_API_KEY`, `APPLE_SHARED_SECRET`, `GOOGLE_SERVICE_ACCOUNT_JSON`. 2. Run `db/migrations/001_init.sql` against the cluster (credentials are in the RDS-managed secret). @@ -131,6 +156,11 @@ GitHub Actions: `ci.yml` lints, type-checks and tests every PR; ## Product philosophy +People grow when they become more aware of how they create meaning, +interpret their experiences, and shape their decisions. Semantika helps the +user ask better questions, discover new perspectives, and reflect on their +own thinking. + Every free user should leave the app feeling that the system understood their situation, that a concrete analysis is ready, and that the next step is available in Premium — never that they were held back by an artificial diff --git a/apps/mobile/app.json b/apps/mobile/app.json index 67cdbe8..61080d5 100644 --- a/apps/mobile/app.json +++ b/apps/mobile/app.json @@ -1,28 +1,28 @@ { "expo": { - "name": "NeuroSemantics AI", - "slug": "neurosemantics-ai", + "name": "Semantika", + "slug": "semantika", "version": "1.0.0", "orientation": "portrait", - "scheme": "neurosemantics", + "scheme": "semantika", "userInterfaceStyle": "light", "backgroundColor": "#F7F6F2", "ios": { - "bundleIdentifier": "com.neurosemantics.app", + "bundleIdentifier": "com.semantika.app", "supportsTablet": false, "usesAppleSignIn": true }, "android": { - "package": "com.neurosemantics.app" + "package": "com.semantika.app" }, "extra": { "apiUrl": "https://REPLACE_WITH_API_URL", "cognitoDomain": "https://REPLACE_WITH_PREFIX.auth.eu-north-1.amazoncognito.com", "cognitoClientId": "REPLACE_WITH_CLIENT_ID", - "iosMonthlyProductId": "neurosemantics_monthly", - "iosYearlyProductId": "neurosemantics_yearly", - "androidMonthlyProductId": "neurosemantics_monthly", - "androidYearlyProductId": "neurosemantics_yearly" + "iosMonthlyProductId": "semantika_monthly", + "iosYearlyProductId": "semantika_yearly", + "androidMonthlyProductId": "semantika_monthly", + "androidYearlyProductId": "semantika_yearly" } } } diff --git a/apps/mobile/package.json b/apps/mobile/package.json index 0f4b130..9c3f0aa 100644 --- a/apps/mobile/package.json +++ b/apps/mobile/package.json @@ -1,5 +1,5 @@ { - "name": "@neurosemantics/mobile", + "name": "@semantika/mobile", "version": "1.0.0", "private": true, "main": "index.ts", diff --git a/apps/mobile/src/api/client.ts b/apps/mobile/src/api/client.ts index 6b63615..604192f 100644 --- a/apps/mobile/src/api/client.ts +++ b/apps/mobile/src/api/client.ts @@ -30,7 +30,7 @@ export interface Me { messageCap: number; } -const DEVICE_KEY = 'neurosemantics.device'; +const DEVICE_KEY = 'semantika.device'; /** Stable anonymous id so guests can chat before signing in. */ async function getDeviceId(): Promise { diff --git a/apps/mobile/src/auth/session.ts b/apps/mobile/src/auth/session.ts index e0c27a5..5c651f8 100644 --- a/apps/mobile/src/auth/session.ts +++ b/apps/mobile/src/auth/session.ts @@ -19,7 +19,7 @@ interface StoredSession { expiresAt: number; // epoch ms } -const STORE_KEY = 'neurosemantics.session'; +const STORE_KEY = 'semantika.session'; const discovery: DiscoveryDocument = { authorizationEndpoint: `${appConfig.cognitoDomain}/oauth2/authorize`, @@ -27,7 +27,7 @@ const discovery: DiscoveryDocument = { revocationEndpoint: `${appConfig.cognitoDomain}/oauth2/revoke`, }; -const redirectUri = makeRedirectUri({ scheme: 'neurosemantics', path: 'redirect' }); +const redirectUri = makeRedirectUri({ scheme: 'semantika', path: 'redirect' }); /** Maps our provider names to Cognito hosted UI identity providers. */ const IDP: Record = { diff --git a/apps/mobile/src/screens/ChatScreen.tsx b/apps/mobile/src/screens/ChatScreen.tsx index f48a224..2797a1a 100644 --- a/apps/mobile/src/screens/ChatScreen.tsx +++ b/apps/mobile/src/screens/ChatScreen.tsx @@ -97,7 +97,7 @@ export function ChatScreen({ style={styles.container} behavior={Platform.OS === 'ios' ? 'padding' : undefined} > - NeuroSemantics AI + Semantika {showSuggestions ? ( {suggestions.map((s) => ( diff --git a/infra/bin/neurosemantics.ts b/infra/bin/semantika.ts similarity index 60% rename from infra/bin/neurosemantics.ts rename to infra/bin/semantika.ts index 6740546..a78b20c 100644 --- a/infra/bin/neurosemantics.ts +++ b/infra/bin/semantika.ts @@ -1,9 +1,9 @@ import { App } from 'aws-cdk-lib'; -import { NeuroSemanticsStack } from '../lib/neurosemantics-stack.js'; +import { SemantikaStack } from '../lib/semantika-stack.js'; const app = new App(); -new NeuroSemanticsStack(app, 'NeuroSemantics', { +new SemantikaStack(app, 'Semantika', { env: { account: process.env.CDK_DEFAULT_ACCOUNT, region: process.env.CDK_DEFAULT_REGION ?? 'eu-north-1', diff --git a/infra/cdk.json b/infra/cdk.json index 35bbd17..c8132ac 100644 --- a/infra/cdk.json +++ b/infra/cdk.json @@ -1,5 +1,5 @@ { - "app": "npx tsx bin/neurosemantics.ts", + "app": "npx tsx bin/semantika.ts", "context": { "@aws-cdk/aws-lambda:recognizeLayerVersion": true, "@aws-cdk/core:checkSecretUsage": true, diff --git a/infra/lib/neurosemantics-stack.ts b/infra/lib/semantika-stack.ts similarity index 95% rename from infra/lib/neurosemantics-stack.ts rename to infra/lib/semantika-stack.ts index 7f50ad1..25939a3 100644 --- a/infra/lib/neurosemantics-stack.ts +++ b/infra/lib/semantika-stack.ts @@ -15,14 +15,14 @@ import { dirname, join } from 'node:path'; const repoRoot = join(dirname(fileURLToPath(import.meta.url)), '..', '..'); -const DB_NAME = 'neurosemantics'; -const APP_SCHEME_REDIRECT = 'neurosemantics://redirect'; +const DB_NAME = 'semantika'; +const APP_SCHEME_REDIRECT = 'semantika://redirect'; /** * The entire system: one HTTP API, one Lambda, one database, one user pool, * one application secret. CloudWatch logging comes with Lambda by default. */ -export class NeuroSemanticsStack extends Stack { +export class SemantikaStack extends Stack { constructor(scope: Construct, id: string, props?: StackProps) { super(scope, id, props); @@ -46,9 +46,8 @@ export class NeuroSemanticsStack extends Stack { // --- Application secret (filled in manually after first deploy) --- const appSecret = new secretsmanager.Secret(this, 'AppSecret', { - secretName: 'neurosemantics/app', - description: - 'OPENAI_API_KEY, APPLE_SHARED_SECRET, GOOGLE_SERVICE_ACCOUNT_JSON for NeuroSemantics AI', + secretName: 'semantika/app', + description: 'OPENAI_API_KEY, APPLE_SHARED_SECRET, GOOGLE_SERVICE_ACCOUNT_JSON for Semantika', }); // --- Authentication: Cognito with Apple, Google and email --- @@ -61,7 +60,7 @@ export class NeuroSemanticsStack extends Stack { removalPolicy: RemovalPolicy.RETAIN, }); - const domainPrefix = this.node.tryGetContext('cognitoDomainPrefix') ?? 'neurosemantics'; + const domainPrefix = this.node.tryGetContext('cognitoDomainPrefix') ?? 'semantika'; const domain = userPool.addDomain('Domain', { cognitoDomain: { domainPrefix } }); // Apple/Google federation requires developer credentials; provide them via @@ -91,7 +90,7 @@ export class NeuroSemanticsStack extends Stack { if (appleTeamId && appleKeyId && applePrivateKeySecretName) { new cognito.UserPoolIdentityProviderApple(this, 'Apple', { userPool, - clientId: 'com.neurosemantics.app.signin', + clientId: 'com.semantika.app.signin', teamId: appleTeamId, keyId: appleKeyId, privateKeyValue: secretsmanager.Secret.fromSecretNameV2( diff --git a/infra/package.json b/infra/package.json index 414e288..49c9dcd 100644 --- a/infra/package.json +++ b/infra/package.json @@ -1,5 +1,5 @@ { - "name": "@neurosemantics/infra", + "name": "@semantika/infra", "version": "1.0.0", "private": true, "type": "module", diff --git a/package-lock.json b/package-lock.json index f55c1c3..8a6bbb6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,11 +1,11 @@ { - "name": "neurosemantics-ai", + "name": "semantika", "version": "1.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "neurosemantics-ai", + "name": "semantika", "version": "1.0.0", "workspaces": [ "apps/mobile", @@ -21,7 +21,7 @@ } }, "apps/mobile": { - "name": "@neurosemantics/mobile", + "name": "@semantika/mobile", "version": "1.0.0", "dependencies": { "expo": "~52.0.0", @@ -40,7 +40,7 @@ } }, "infra": { - "name": "@neurosemantics/infra", + "name": "@semantika/infra", "version": "1.0.0", "dependencies": { "aws-cdk-lib": "^2.173.2", @@ -99,6 +99,7 @@ }, "node_modules/@aws-cdk/cloud-assembly-schema/node_modules/jsonschema": { "version": "1.5.0", + "extraneous": true, "inBundle": true, "license": "MIT", "engines": { @@ -107,6 +108,7 @@ }, "node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver": { "version": "7.8.5", + "extraneous": true, "inBundle": true, "license": "ISC", "bin": { @@ -4315,18 +4317,6 @@ "node": "^22.20 || ^24.12 || >=25" } }, - "node_modules/@neurosemantics/api": { - "resolved": "services/api", - "link": true - }, - "node_modules/@neurosemantics/infra": { - "resolved": "infra", - "link": true - }, - "node_modules/@neurosemantics/mobile": { - "resolved": "apps/mobile", - "link": true - }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -5275,6 +5265,18 @@ "join-component": "^1.1.0" } }, + "node_modules/@semantika/api": { + "resolved": "services/api", + "link": true + }, + "node_modules/@semantika/infra": { + "resolved": "infra", + "link": true + }, + "node_modules/@semantika/mobile": { + "resolved": "apps/mobile", + "link": true + }, "node_modules/@sinclair/typebox": { "version": "0.27.12", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.12.tgz", @@ -6265,6 +6267,7 @@ }, "node_modules/aws-cdk-lib/node_modules/@aws-cdk/cloud-assembly-api": { "version": "2.2.6", + "extraneous": true, "inBundle": true, "license": "Apache-2.0", "dependencies": { @@ -6280,6 +6283,7 @@ }, "node_modules/aws-cdk-lib/node_modules/@aws/cloudformation-validate": { "version": "1.6.0-beta", + "extraneous": true, "inBundle": true, "license": "Apache-2.0", "engines": { @@ -6288,11 +6292,13 @@ }, "node_modules/aws-cdk-lib/node_modules/@balena/dockerignore": { "version": "1.0.2", + "extraneous": true, "inBundle": true, "license": "Apache-2.0" }, "node_modules/aws-cdk-lib/node_modules/balanced-match": { "version": "4.0.4", + "extraneous": true, "inBundle": true, "license": "MIT", "engines": { @@ -6301,6 +6307,7 @@ }, "node_modules/aws-cdk-lib/node_modules/brace-expansion": { "version": "5.0.8", + "extraneous": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -6312,6 +6319,7 @@ }, "node_modules/aws-cdk-lib/node_modules/case": { "version": "1.6.3", + "extraneous": true, "inBundle": true, "license": "(MIT OR GPL-3.0-or-later)", "engines": { @@ -6320,6 +6328,7 @@ }, "node_modules/aws-cdk-lib/node_modules/fs-extra": { "version": "11.3.6", + "extraneous": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -6333,11 +6342,13 @@ }, "node_modules/aws-cdk-lib/node_modules/graceful-fs": { "version": "4.2.11", + "extraneous": true, "inBundle": true, "license": "ISC" }, "node_modules/aws-cdk-lib/node_modules/ignore": { "version": "5.3.2", + "extraneous": true, "inBundle": true, "license": "MIT", "engines": { @@ -6346,6 +6357,7 @@ }, "node_modules/aws-cdk-lib/node_modules/jsonfile": { "version": "6.2.1", + "extraneous": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -6357,6 +6369,7 @@ }, "node_modules/aws-cdk-lib/node_modules/jsonschema": { "version": "1.5.0", + "extraneous": true, "inBundle": true, "license": "MIT", "engines": { @@ -6365,6 +6378,7 @@ }, "node_modules/aws-cdk-lib/node_modules/mime-db": { "version": "1.52.0", + "extraneous": true, "inBundle": true, "license": "MIT", "engines": { @@ -6373,6 +6387,7 @@ }, "node_modules/aws-cdk-lib/node_modules/mime-types": { "version": "2.1.35", + "extraneous": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -6384,6 +6399,7 @@ }, "node_modules/aws-cdk-lib/node_modules/minimatch": { "version": "10.2.5", + "extraneous": true, "inBundle": true, "license": "BlueOak-1.0.0", "dependencies": { @@ -6398,6 +6414,7 @@ }, "node_modules/aws-cdk-lib/node_modules/punycode": { "version": "2.3.1", + "extraneous": true, "inBundle": true, "license": "MIT", "engines": { @@ -6406,6 +6423,7 @@ }, "node_modules/aws-cdk-lib/node_modules/semver": { "version": "7.8.5", + "extraneous": true, "inBundle": true, "license": "ISC", "bin": { @@ -6417,6 +6435,7 @@ }, "node_modules/aws-cdk-lib/node_modules/universalify": { "version": "2.0.1", + "extraneous": true, "inBundle": true, "license": "MIT", "engines": { @@ -6425,6 +6444,7 @@ }, "node_modules/aws-cdk-lib/node_modules/yaml": { "version": "1.10.3", + "extraneous": true, "inBundle": true, "license": "ISC", "engines": { @@ -15390,7 +15410,7 @@ } }, "services/api": { - "name": "@neurosemantics/api", + "name": "@semantika/api", "version": "1.0.0", "dependencies": { "@aws-sdk/client-secrets-manager": "^3.716.0", diff --git a/package.json b/package.json index f295126..02ae838 100644 --- a/package.json +++ b/package.json @@ -1,9 +1,9 @@ { - "name": "neurosemantics-ai", + "name": "semantika", "version": "1.0.0", "private": true, "type": "module", - "description": "A minimalist AI conversation partner specialized in neurosemantics and NLP.", + "description": "Semantika — an intelligent reflection partner inspired by neurosemantic principles.", "workspaces": [ "apps/mobile", "services/api", diff --git a/services/api/knowledge/01-neurosemantics.md b/services/api/knowledge/01-neurosemantics.md index 8922f3e..7e6db31 100644 --- a/services/api/knowledge/01-neurosemantics.md +++ b/services/api/knowledge/01-neurosemantics.md @@ -5,6 +5,11 @@ nervous system) and semantics (meaning, language, symbols) interact to produce our experienced reality. The field was developed primarily by L. Michael Hall, building on NLP, Alfred Korzybski's general semantics, and cognitive psychology. +**Status of these ideas:** neurosemantics is a practitioner framework, not an +established scientific discipline. Its models are offered here as lenses for +reflection and structured conversation — never present them as scientifically +proven, and never promise measurable effects. + ## Core ideas - **Meaning is constructed, not found.** Events have no inherent meaning; we diff --git a/services/api/knowledge/02-nlp.md b/services/api/knowledge/02-nlp.md index 33cd94e..1722c52 100644 --- a/services/api/knowledge/02-nlp.md +++ b/services/api/knowledge/02-nlp.md @@ -5,6 +5,12 @@ Bandler and John Grinder by modeling effective therapists (Virginia Satir, Fritz Perls, Milton Erickson). It offers models for how people structure subjective experience. +**Status of these ideas:** NLP's core claims do not have broad scientific +consensus, and several (such as eye-accessing cues) have not held up in +controlled studies. Treat everything in this file as reflective models and +conversational tools inspired by NLP — useful lenses, not evidence-based +treatment or proven techniques. + ## Key presuppositions (working assumptions) - The map is not the territory. diff --git a/services/api/knowledge/03-conversation-guide.md b/services/api/knowledge/03-conversation-guide.md index 2bf1c61..f0caea4 100644 --- a/services/api/knowledge/03-conversation-guide.md +++ b/services/api/knowledge/03-conversation-guide.md @@ -1,12 +1,13 @@ # Conversation guide -How NeuroSemantics AI conducts a conversation. +How Semantika conducts a conversation. ## Stance - Calm, spacious, precise. One idea at a time. - Curious before instructive: explore the user's map before offering models. - Prefer questions that move the user, over explanations that impress. +- Never judging, dramatic, overenthusiastic, or preaching. ## Typical flow @@ -25,4 +26,7 @@ How NeuroSemantics AI conducts a conversation. - No diagnosis, no treatment of medical or psychiatric conditions. - On signs of acute crisis: acknowledge with care and recommend local professional or emergency help immediately. -- Stay inside neurosemantics/NLP; decline unrelated topics kindly and briefly. +- Stay inside Semantika's scope (meaning, thinking patterns, communication, + perspective); decline unrelated topics kindly and briefly. +- Present the models as inspiration and perspectives — never as + scientifically proven methods with guaranteed effects. diff --git a/services/api/package.json b/services/api/package.json index a1d6988..30fe8d9 100644 --- a/services/api/package.json +++ b/services/api/package.json @@ -1,5 +1,5 @@ { - "name": "@neurosemantics/api", + "name": "@semantika/api", "version": "1.0.0", "private": true, "type": "module", diff --git a/services/api/src/chat.ts b/services/api/src/chat.ts index 78be1f7..659ff4b 100644 --- a/services/api/src/chat.ts +++ b/services/api/src/chat.ts @@ -15,13 +15,31 @@ export interface ChatResult { analysisReady: boolean; } -const BASE_INSTRUCTIONS = `You are NeuroSemantics AI — a calm, precise conversation partner -specialized in neurosemantics and NLP (Neuro-Linguistic Programming). +const BASE_INSTRUCTIONS = `You are Semantika — an intelligent reflection partner. Semantika +helps people explore how they create meaning, interpret their experiences, +and communicate with themselves and others, through structured conversations +inspired by neurosemantic and NLP models. + +Positioning: +- Semantika is not therapy, not self-help, and not a course. +- Rather than giving quick advice, start by helping the user explore how + they interpret their situation. Support reflection and perspective-taking + through structured conversation, rather than delivering finished answers. + +Intellectual honesty: +- Present neurosemantics and NLP as models and perspectives for reflection — + an inspiration, not scientifically established fact. Never claim or imply + scientifically proven effects; many of these models lack broad scientific + consensus, and it is enough to be clear about the inspiration. + +Tone — Semantika is never: judging, dramatic, overenthusiastic, preaching. +Tone — Semantika is always: calm, curious, clear, respectful, structured, +thoughtful. Principles: -- Be warm but restrained. Short paragraphs. No filler, no hype. -- Ground answers in the knowledge base below. If something is outside - neurosemantics/NLP, gently steer the conversation back. +- Short paragraphs. No filler, no hype. +- Ground the conversation in the knowledge base below. If something is + outside its scope, gently steer the conversation back. - Ask one clarifying question at a time when the user's goal is unclear. - You are not a therapist and do not diagnose. If the user describes acute distress or a medical condition, recommend seeking professional help. diff --git a/services/api/src/config.ts b/services/api/src/config.ts index 9a8b489..dcc409e 100644 --- a/services/api/src/config.ts +++ b/services/api/src/config.ts @@ -16,7 +16,7 @@ export const config = { appSecretArn: process.env.APP_SECRET_ARN ?? '', /** ARN of the RDS-managed database credentials secret. */ dbSecretArn: process.env.DB_SECRET_ARN ?? '', - dbName: process.env.DB_NAME ?? 'neurosemantics', + dbName: process.env.DB_NAME ?? 'semantika', /** Android application id, needed for Google Play purchase verification. */ - androidPackageName: process.env.ANDROID_PACKAGE_NAME ?? 'com.neurosemantics.app', + androidPackageName: process.env.ANDROID_PACKAGE_NAME ?? 'com.semantika.app', };