This repository was archived by the owner on May 16, 2026. It is now read-only.

Latest commit

History

125 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

warm welcome

A first-of-its-kind free educational tool, UX Core quickly spread through global product management communities after its release in 2020.

Contains 1,000+ practical examples of cognitive biases applied to product design, software development, and team management.

Widely recognized by leading scholars in cognitive science and behavioral economics (Duke University, Harvard Business School, AUD, and others).

Actively used by managers, designers, and educators worldwide.


🛠 Tech stack

The project is built using:

  • React (via Next.js)

  • TypeScript

  • SCSS modules

  • Node.js version: 18.18.0

Additional tooling:

  • ESLint – for consistent code quality

  • Prettier – for automatic code formatting

  • Husky – used to run npx lint-staged on pre-commit


⚙️ Install dependencies:

In this project we use Yarn, so make sure you have it installed.

yarn install

Run the app locally:

yarn dev

App runs at http://localhost:3005


🔐 Environment variables

Copy the example file before your first run:

cp .env.example .env.local

The defaults in .env.example point at our public staging Strapi and UX Cat APIs, so most UI and feature work runs without any extra setup. Optional integrations (Mixpanel, Google Analytics, Ahrefs, OAuth providers) are left empty — the app no-ops when their keys aren't set.

If you want to work on authentication, you'll need your own OAuth apps and a real NEXTAUTH_SECRET (the example ships a clearly-labelled dev placeholder). Setup links for each provider are in the comments inside .env.example; generate a secret with:

openssl rand -base64 32

Never commit .env.local — it's gitignored on purpose.


✍️ Commit Rules & Branch Naming

We use Conventional Commits to keep our history clean and readable.

Commit prefixes and branch names should be in the following format:

  • feat: - ✨ A new feature
  • hotfix: - 🚑 A critical fix
  • docs: - 📝 Documentation only changes
  • style: - 💅 Changes that do not affect the meaning of the code (white-space, formatting, missing semi-colons, etc)
  • refactor: - 🔨 A code change that neither fixes a bug nor adds a feature
  • chore: - 👷Dev setup, tooling, config or just some random task
  • bugfix: - 🐛 A bug fix

Example commit message:

feat: added new button component

Example commit message with emoji, to make life easier and more fun:

✨ feat: added new button component

🌿 Branch Naming Rules

There are two ways of creating a branch:

CaseRuleExample
From an Issue (preferred if Issue exists)GitHub auto-adds the Issue number. Always use this when related Issue exists.feat/123-add-new-button-component
Without an IssueUse standard format with type/purpose.feat/add-new-button-component
hotfix/fix-login-crash
bugfix/button-alignment

📝Folder Structure and Naming Conventions

  • cypress - contains all the e2e tests
  • public - contains static assets like images, icons, etc.
  • src - contains the main application code
    • api - contains API requests and related code
    • data - contains static data in Russian, English and Armenian languages
    • assets - contains static assets like images, icons, etc.
    • components - reusable components
    • hooks - custom React hooks
    • layouts - layout components
    • lib - utility functions and libraries
    • local-types - local shareable types used in the project
    • pages - Next.js pages
    • styles - global styles and variables

📦 Import Order Guidelines

To keep the project structure consistent, please follow this import order in files:

  • Third-party libraries (e.g., React, Next.js, lodash)

  • Global styles (/src/styles)

  • Constants (/src/constants)

  • Helpers (/src/helpers)

  • Types (/src/types)

  • Hooks (/src/hooks)

  • Lib (/src/lib)

  • Api (/src/api)

  • Components (/src/components)

  • Layouts (/src/layouts)

  • Features (/src/features)

  • Assets (/public/images, SVGs, icons) - *But in general we will be using Icon component

  • Local styles


⚙️ Component Files

Each Component have its own folder with the following structure:
src/components/ComponentName/
src/components/ComponentName/index.tsx
src/components/ComponentName/ComponentName.tsx
src/components/ComponentName/ComponentName.module.scss
src/components/ComponentName/ComponentName.types.ts
Same approach applies to Layouts.

❗️Some components don't have separate types, instead types are defined directly in the component file. That's an old approach, but we will be moving to the new one gradually.


Thank you for reading! Be Kind. Do Good. 🍃

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content
This repository was archived by the owner on May 16, 2026. It is now read-only.

Latest commit

History

125 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

warm welcome

A first-of-its-kind free educational tool, UX Core quickly spread through global product management communities after its release in 2020.

Contains 1,000+ practical examples of cognitive biases applied to product design, software development, and team management.

Widely recognized by leading scholars in cognitive science and behavioral economics (Duke University, Harvard Business School, AUD, and others).

Actively used by managers, designers, and educators worldwide.


🛠 Tech stack

The project is built using:

  • React (via Next.js)

  • TypeScript

  • SCSS modules

  • Node.js version: 18.18.0

Additional tooling:

  • ESLint – for consistent code quality

  • Prettier – for automatic code formatting

  • Husky – used to run npx lint-staged on pre-commit


⚙️ Install dependencies:

In this project we use Yarn, so make sure you have it installed.

yarn install

Run the app locally:

yarn dev

App runs at http://localhost:3005


🔐 Environment variables

Copy the example file before your first run:

cp .env.example .env.local

The defaults in .env.example point at our public staging Strapi and UX Cat APIs, so most UI and feature work runs without any extra setup. Optional integrations (Mixpanel, Google Analytics, Ahrefs, OAuth providers) are left empty — the app no-ops when their keys aren't set.

If you want to work on authentication, you'll need your own OAuth apps and a real NEXTAUTH_SECRET (the example ships a clearly-labelled dev placeholder). Setup links for each provider are in the comments inside .env.example; generate a secret with:

openssl rand -base64 32

Never commit .env.local — it's gitignored on purpose.


✍️ Commit Rules & Branch Naming

We use Conventional Commits to keep our history clean and readable.

Commit prefixes and branch names should be in the following format:

  • feat: - ✨ A new feature
  • hotfix: - 🚑 A critical fix
  • docs: - 📝 Documentation only changes
  • style: - 💅 Changes that do not affect the meaning of the code (white-space, formatting, missing semi-colons, etc)
  • refactor: - 🔨 A code change that neither fixes a bug nor adds a feature
  • chore: - 👷Dev setup, tooling, config or just some random task
  • bugfix: - 🐛 A bug fix

Example commit message:

feat: added new button component

Example commit message with emoji, to make life easier and more fun:

✨ feat: added new button component

🌿 Branch Naming Rules

There are two ways of creating a branch:

CaseRuleExample
From an Issue (preferred if Issue exists)GitHub auto-adds the Issue number. Always use this when related Issue exists.feat/123-add-new-button-component
Without an IssueUse standard format with type/purpose.feat/add-new-button-component
hotfix/fix-login-crash
bugfix/button-alignment

📝Folder Structure and Naming Conventions

  • cypress - contains all the e2e tests
  • public - contains static assets like images, icons, etc.
  • src - contains the main application code
    • api - contains API requests and related code
    • data - contains static data in Russian, English and Armenian languages
    • assets - contains static assets like images, icons, etc.
    • components - reusable components
    • hooks - custom React hooks
    • layouts - layout components
    • lib - utility functions and libraries
    • local-types - local shareable types used in the project
    • pages - Next.js pages
    • styles - global styles and variables

📦 Import Order Guidelines

To keep the project structure consistent, please follow this import order in files:

  • Third-party libraries (e.g., React, Next.js, lodash)

  • Global styles (/src/styles)

  • Constants (/src/constants)

  • Helpers (/src/helpers)

  • Types (/src/types)

  • Hooks (/src/hooks)

  • Lib (/src/lib)

  • Api (/src/api)

  • Components (/src/components)

  • Layouts (/src/layouts)

  • Features (/src/features)

  • Assets (/public/images, SVGs, icons) - *But in general we will be using Icon component

  • Local styles


⚙️ Component Files

Each Component have its own folder with the following structure:
src/components/ComponentName/
src/components/ComponentName/index.tsx
src/components/ComponentName/ComponentName.tsx
src/components/ComponentName/ComponentName.module.scss
src/components/ComponentName/ComponentName.types.ts
Same approach applies to Layouts.

❗️Some components don't have separate types, instead types are defined directly in the component file. That's an old approach, but we will be moving to the new one gradually.


Thank you for reading! Be Kind. Do Good. 🍃

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on May 16, 2026. It is now read-only.

Latest commit

History

125 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

warm welcome

A first-of-its-kind free educational tool, UX Core quickly spread through global product management communities after its release in 2020.

Contains 1,000+ practical examples of cognitive biases applied to product design, software development, and team management.

Widely recognized by leading scholars in cognitive science and behavioral economics (Duke University, Harvard Business School, AUD, and others).

Actively used by managers, designers, and educators worldwide.


🛠 Tech stack

The project is built using:

  • React (via Next.js)

  • TypeScript

  • SCSS modules

  • Node.js version: 18.18.0

Additional tooling:

  • ESLint – for consistent code quality

  • Prettier – for automatic code formatting

  • Husky – used to run npx lint-staged on pre-commit


⚙️ Install dependencies:

In this project we use Yarn, so make sure you have it installed.

yarn install

Run the app locally:

yarn dev

App runs at http://localhost:3005


🔐 Environment variables

Copy the example file before your first run:

cp .env.example .env.local

The defaults in .env.example point at our public staging Strapi and UX Cat APIs, so most UI and feature work runs without any extra setup. Optional integrations (Mixpanel, Google Analytics, Ahrefs, OAuth providers) are left empty — the app no-ops when their keys aren't set.

If you want to work on authentication, you'll need your own OAuth apps and a real NEXTAUTH_SECRET (the example ships a clearly-labelled dev placeholder). Setup links for each provider are in the comments inside .env.example; generate a secret with:

openssl rand -base64 32

Never commit .env.local — it's gitignored on purpose.


✍️ Commit Rules & Branch Naming

We use Conventional Commits to keep our history clean and readable.

Commit prefixes and branch names should be in the following format:

  • feat: - ✨ A new feature
  • hotfix: - 🚑 A critical fix
  • docs: - 📝 Documentation only changes
  • style: - 💅 Changes that do not affect the meaning of the code (white-space, formatting, missing semi-colons, etc)
  • refactor: - 🔨 A code change that neither fixes a bug nor adds a feature
  • chore: - 👷Dev setup, tooling, config or just some random task
  • bugfix: - 🐛 A bug fix

Example commit message:

feat: added new button component

Example commit message with emoji, to make life easier and more fun:

✨ feat: added new button component

🌿 Branch Naming Rules

There are two ways of creating a branch:

CaseRuleExample
From an Issue (preferred if Issue exists)GitHub auto-adds the Issue number. Always use this when related Issue exists.feat/123-add-new-button-component
Without an IssueUse standard format with type/purpose.feat/add-new-button-component
hotfix/fix-login-crash
bugfix/button-alignment

📝Folder Structure and Naming Conventions

  • cypress - contains all the e2e tests
  • public - contains static assets like images, icons, etc.
  • src - contains the main application code
    • api - contains API requests and related code
    • data - contains static data in Russian, English and Armenian languages
    • assets - contains static assets like images, icons, etc.
    • components - reusable components
    • hooks - custom React hooks
    • layouts - layout components
    • lib - utility functions and libraries
    • local-types - local shareable types used in the project
    • pages - Next.js pages
    • styles - global styles and variables

📦 Import Order Guidelines

To keep the project structure consistent, please follow this import order in files:

  • Third-party libraries (e.g., React, Next.js, lodash)

  • Global styles (/src/styles)

  • Constants (/src/constants)

  • Helpers (/src/helpers)

  • Types (/src/types)

  • Hooks (/src/hooks)

  • Lib (/src/lib)

  • Api (/src/api)

  • Components (/src/components)

  • Layouts (/src/layouts)

  • Features (/src/features)

  • Assets (/public/images, SVGs, icons) - *But in general we will be using Icon component

  • Local styles


⚙️ Component Files

Each Component have its own folder with the following structure:
src/components/ComponentName/
src/components/ComponentName/index.tsx
src/components/ComponentName/ComponentName.tsx
src/components/ComponentName/ComponentName.module.scss
src/components/ComponentName/ComponentName.types.ts
Same approach applies to Layouts.

❗️Some components don't have separate types, instead types are defined directly in the component file. That's an old approach, but we will be moving to the new one gradually.


Thank you for reading! Be Kind. Do Good. 🍃

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on May 16, 2026. It is now read-only.

Latest commit

History

125 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

warm welcome

A first-of-its-kind free educational tool, UX Core quickly spread through global product management communities after its release in 2020.

Contains 1,000+ practical examples of cognitive biases applied to product design, software development, and team management.

Widely recognized by leading scholars in cognitive science and behavioral economics (Duke University, Harvard Business School, AUD, and others).

Actively used by managers, designers, and educators worldwide.


🛠 Tech stack

The project is built using:

  • React (via Next.js)

  • TypeScript

  • SCSS modules

  • Node.js version: 18.18.0

Additional tooling:

  • ESLint – for consistent code quality

  • Prettier – for automatic code formatting

  • Husky – used to run npx lint-staged on pre-commit


⚙️ Install dependencies:

In this project we use Yarn, so make sure you have it installed.

yarn install

Run the app locally:

yarn dev

App runs at http://localhost:3005


🔐 Environment variables

Copy the example file before your first run:

cp .env.example .env.local

The defaults in .env.example point at our public staging Strapi and UX Cat APIs, so most UI and feature work runs without any extra setup. Optional integrations (Mixpanel, Google Analytics, Ahrefs, OAuth providers) are left empty — the app no-ops when their keys aren't set.

If you want to work on authentication, you'll need your own OAuth apps and a real NEXTAUTH_SECRET (the example ships a clearly-labelled dev placeholder). Setup links for each provider are in the comments inside .env.example; generate a secret with:

openssl rand -base64 32

Never commit .env.local — it's gitignored on purpose.


✍️ Commit Rules & Branch Naming

We use Conventional Commits to keep our history clean and readable.

Commit prefixes and branch names should be in the following format:

  • feat: - ✨ A new feature
  • hotfix: - 🚑 A critical fix
  • docs: - 📝 Documentation only changes
  • style: - 💅 Changes that do not affect the meaning of the code (white-space, formatting, missing semi-colons, etc)
  • refactor: - 🔨 A code change that neither fixes a bug nor adds a feature
  • chore: - 👷Dev setup, tooling, config or just some random task
  • bugfix: - 🐛 A bug fix

Example commit message:

feat: added new button component

Example commit message with emoji, to make life easier and more fun:

✨ feat: added new button component

🌿 Branch Naming Rules

There are two ways of creating a branch:

CaseRuleExample
From an Issue (preferred if Issue exists)GitHub auto-adds the Issue number. Always use this when related Issue exists.feat/123-add-new-button-component
Without an IssueUse standard format with type/purpose.feat/add-new-button-component
hotfix/fix-login-crash
bugfix/button-alignment

📝Folder Structure and Naming Conventions

  • cypress - contains all the e2e tests
  • public - contains static assets like images, icons, etc.
  • src - contains the main application code
    • api - contains API requests and related code
    • data - contains static data in Russian, English and Armenian languages
    • assets - contains static assets like images, icons, etc.
    • components - reusable components
    • hooks - custom React hooks
    • layouts - layout components
    • lib - utility functions and libraries
    • local-types - local shareable types used in the project
    • pages - Next.js pages
    • styles - global styles and variables

📦 Import Order Guidelines

To keep the project structure consistent, please follow this import order in files:

  • Third-party libraries (e.g., React, Next.js, lodash)

  • Global styles (/src/styles)

  • Constants (/src/constants)

  • Helpers (/src/helpers)

  • Types (/src/types)

  • Hooks (/src/hooks)

  • Lib (/src/lib)

  • Api (/src/api)

  • Components (/src/components)

  • Layouts (/src/layouts)

  • Features (/src/features)

  • Assets (/public/images, SVGs, icons) - *But in general we will be using Icon component

  • Local styles


⚙️ Component Files

Each Component have its own folder with the following structure:
src/components/ComponentName/
src/components/ComponentName/index.tsx
src/components/ComponentName/ComponentName.tsx
src/components/ComponentName/ComponentName.module.scss
src/components/ComponentName/ComponentName.types.ts
Same approach applies to Layouts.

❗️Some components don't have separate types, instead types are defined directly in the component file. That's an old approach, but we will be moving to the new one gradually.


Thank you for reading! Be Kind. Do Good. 🍃

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content
This repository was archived by the owner on May 16, 2026. It is now read-only.

Latest commit

History

125 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

warm welcome

A first-of-its-kind free educational tool, UX Core quickly spread through global product management communities after its release in 2020.

Contains 1,000+ practical examples of cognitive biases applied to product design, software development, and team management.

Widely recognized by leading scholars in cognitive science and behavioral economics (Duke University, Harvard Business School, AUD, and others).

Actively used by managers, designers, and educators worldwide.


🛠 Tech stack

The project is built using:

  • React (via Next.js)

  • TypeScript

  • SCSS modules

  • Node.js version: 18.18.0

Additional tooling:

  • ESLint – for consistent code quality

  • Prettier – for automatic code formatting

  • Husky – used to run npx lint-staged on pre-commit


⚙️ Install dependencies:

In this project we use Yarn, so make sure you have it installed.

yarn install

Run the app locally:

yarn dev

App runs at http://localhost:3005


🔐 Environment variables

Copy the example file before your first run:

cp .env.example .env.local

The defaults in .env.example point at our public staging Strapi and UX Cat APIs, so most UI and feature work runs without any extra setup. Optional integrations (Mixpanel, Google Analytics, Ahrefs, OAuth providers) are left empty — the app no-ops when their keys aren't set.

If you want to work on authentication, you'll need your own OAuth apps and a real NEXTAUTH_SECRET (the example ships a clearly-labelled dev placeholder). Setup links for each provider are in the comments inside .env.example; generate a secret with:

openssl rand -base64 32

Never commit .env.local — it's gitignored on purpose.


✍️ Commit Rules & Branch Naming

We use Conventional Commits to keep our history clean and readable.

Commit prefixes and branch names should be in the following format:

  • feat: - ✨ A new feature
  • hotfix: - 🚑 A critical fix
  • docs: - 📝 Documentation only changes
  • style: - 💅 Changes that do not affect the meaning of the code (white-space, formatting, missing semi-colons, etc)
  • refactor: - 🔨 A code change that neither fixes a bug nor adds a feature
  • chore: - 👷Dev setup, tooling, config or just some random task
  • bugfix: - 🐛 A bug fix

Example commit message:

feat: added new button component

Example commit message with emoji, to make life easier and more fun:

✨ feat: added new button component

🌿 Branch Naming Rules

There are two ways of creating a branch:

CaseRuleExample
From an Issue (preferred if Issue exists)GitHub auto-adds the Issue number. Always use this when related Issue exists.feat/123-add-new-button-component
Without an IssueUse standard format with type/purpose.feat/add-new-button-component
hotfix/fix-login-crash
bugfix/button-alignment

📝Folder Structure and Naming Conventions

  • cypress - contains all the e2e tests
  • public - contains static assets like images, icons, etc.
  • src - contains the main application code
    • api - contains API requests and related code
    • data - contains static data in Russian, English and Armenian languages
    • assets - contains static assets like images, icons, etc.
    • components - reusable components
    • hooks - custom React hooks
    • layouts - layout components
    • lib - utility functions and libraries
    • local-types - local shareable types used in the project
    • pages - Next.js pages
    • styles - global styles and variables

📦 Import Order Guidelines

To keep the project structure consistent, please follow this import order in files:

  • Third-party libraries (e.g., React, Next.js, lodash)

  • Global styles (/src/styles)

  • Constants (/src/constants)

  • Helpers (/src/helpers)

  • Types (/src/types)

  • Hooks (/src/hooks)

  • Lib (/src/lib)

  • Api (/src/api)

  • Components (/src/components)

  • Layouts (/src/layouts)

  • Features (/src/features)

  • Assets (/public/images, SVGs, icons) - *But in general we will be using Icon component

  • Local styles


⚙️ Component Files

Each Component have its own folder with the following structure:
src/components/ComponentName/
src/components/ComponentName/index.tsx
src/components/ComponentName/ComponentName.tsx
src/components/ComponentName/ComponentName.module.scss
src/components/ComponentName/ComponentName.types.ts
Same approach applies to Layouts.

❗️Some components don't have separate types, instead types are defined directly in the component file. That's an old approach, but we will be moving to the new one gradually.


Thank you for reading! Be Kind. Do Good. 🍃

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on May 16, 2026. It is now read-only.

Latest commit

History

125 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

warm welcome

A first-of-its-kind free educational tool, UX Core quickly spread through global product management communities after its release in 2020.

Contains 1,000+ practical examples of cognitive biases applied to product design, software development, and team management.

Widely recognized by leading scholars in cognitive science and behavioral economics (Duke University, Harvard Business School, AUD, and others).

Actively used by managers, designers, and educators worldwide.


🛠 Tech stack

The project is built using:

  • React (via Next.js)

  • TypeScript

  • SCSS modules

  • Node.js version: 18.18.0

Additional tooling:

  • ESLint – for consistent code quality

  • Prettier – for automatic code formatting

  • Husky – used to run npx lint-staged on pre-commit


⚙️ Install dependencies:

In this project we use Yarn, so make sure you have it installed.

yarn install

Run the app locally:

yarn dev

App runs at http://localhost:3005


🔐 Environment variables

Copy the example file before your first run:

cp .env.example .env.local

The defaults in .env.example point at our public staging Strapi and UX Cat APIs, so most UI and feature work runs without any extra setup. Optional integrations (Mixpanel, Google Analytics, Ahrefs, OAuth providers) are left empty — the app no-ops when their keys aren't set.

If you want to work on authentication, you'll need your own OAuth apps and a real NEXTAUTH_SECRET (the example ships a clearly-labelled dev placeholder). Setup links for each provider are in the comments inside .env.example; generate a secret with:

openssl rand -base64 32

Never commit .env.local — it's gitignored on purpose.


✍️ Commit Rules & Branch Naming

We use Conventional Commits to keep our history clean and readable.

Commit prefixes and branch names should be in the following format:

  • feat: - ✨ A new feature
  • hotfix: - 🚑 A critical fix
  • docs: - 📝 Documentation only changes
  • style: - 💅 Changes that do not affect the meaning of the code (white-space, formatting, missing semi-colons, etc)
  • refactor: - 🔨 A code change that neither fixes a bug nor adds a feature
  • chore: - 👷Dev setup, tooling, config or just some random task
  • bugfix: - 🐛 A bug fix

Example commit message:

feat: added new button component

Example commit message with emoji, to make life easier and more fun:

✨ feat: added new button component

🌿 Branch Naming Rules

There are two ways of creating a branch:

CaseRuleExample
From an Issue (preferred if Issue exists)GitHub auto-adds the Issue number. Always use this when related Issue exists.feat/123-add-new-button-component
Without an IssueUse standard format with type/purpose.feat/add-new-button-component
hotfix/fix-login-crash
bugfix/button-alignment

📝Folder Structure and Naming Conventions

  • cypress - contains all the e2e tests
  • public - contains static assets like images, icons, etc.
  • src - contains the main application code
    • api - contains API requests and related code
    • data - contains static data in Russian, English and Armenian languages
    • assets - contains static assets like images, icons, etc.
    • components - reusable components
    • hooks - custom React hooks
    • layouts - layout components
    • lib - utility functions and libraries
    • local-types - local shareable types used in the project
    • pages - Next.js pages
    • styles - global styles and variables

📦 Import Order Guidelines

To keep the project structure consistent, please follow this import order in files:

  • Third-party libraries (e.g., React, Next.js, lodash)

  • Global styles (/src/styles)

  • Constants (/src/constants)

  • Helpers (/src/helpers)

  • Types (/src/types)

  • Hooks (/src/hooks)

  • Lib (/src/lib)

  • Api (/src/api)

  • Components (/src/components)

  • Layouts (/src/layouts)

  • Features (/src/features)

  • Assets (/public/images, SVGs, icons) - *But in general we will be using Icon component

  • Local styles


⚙️ Component Files

Each Component have its own folder with the following structure:
src/components/ComponentName/
src/components/ComponentName/index.tsx
src/components/ComponentName/ComponentName.tsx
src/components/ComponentName/ComponentName.module.scss
src/components/ComponentName/ComponentName.types.ts
Same approach applies to Layouts.

❗️Some components don't have separate types, instead types are defined directly in the component file. That's an old approach, but we will be moving to the new one gradually.


Thank you for reading! Be Kind. Do Good. 🍃

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on May 16, 2026. It is now read-only.

Latest commit

History

125 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

warm welcome

A first-of-its-kind free educational tool, UX Core quickly spread through global product management communities after its release in 2020.

Contains 1,000+ practical examples of cognitive biases applied to product design, software development, and team management.

Widely recognized by leading scholars in cognitive science and behavioral economics (Duke University, Harvard Business School, AUD, and others).

Actively used by managers, designers, and educators worldwide.


🛠 Tech stack

The project is built using:

  • React (via Next.js)

  • TypeScript

  • SCSS modules

  • Node.js version: 18.18.0

Additional tooling:

  • ESLint – for consistent code quality

  • Prettier – for automatic code formatting

  • Husky – used to run npx lint-staged on pre-commit


⚙️ Install dependencies:

In this project we use Yarn, so make sure you have it installed.

yarn install

Run the app locally:

yarn dev

App runs at http://localhost:3005


🔐 Environment variables

Copy the example file before your first run:

cp .env.example .env.local

The defaults in .env.example point at our public staging Strapi and UX Cat APIs, so most UI and feature work runs without any extra setup. Optional integrations (Mixpanel, Google Analytics, Ahrefs, OAuth providers) are left empty — the app no-ops when their keys aren't set.

If you want to work on authentication, you'll need your own OAuth apps and a real NEXTAUTH_SECRET (the example ships a clearly-labelled dev placeholder). Setup links for each provider are in the comments inside .env.example; generate a secret with:

openssl rand -base64 32

Never commit .env.local — it's gitignored on purpose.


✍️ Commit Rules & Branch Naming

We use Conventional Commits to keep our history clean and readable.

Commit prefixes and branch names should be in the following format:

  • feat: - ✨ A new feature
  • hotfix: - 🚑 A critical fix
  • docs: - 📝 Documentation only changes
  • style: - 💅 Changes that do not affect the meaning of the code (white-space, formatting, missing semi-colons, etc)
  • refactor: - 🔨 A code change that neither fixes a bug nor adds a feature
  • chore: - 👷Dev setup, tooling, config or just some random task
  • bugfix: - 🐛 A bug fix

Example commit message:

feat: added new button component

Example commit message with emoji, to make life easier and more fun:

✨ feat: added new button component

🌿 Branch Naming Rules

There are two ways of creating a branch:

CaseRuleExample
From an Issue (preferred if Issue exists)GitHub auto-adds the Issue number. Always use this when related Issue exists.feat/123-add-new-button-component
Without an IssueUse standard format with type/purpose.feat/add-new-button-component
hotfix/fix-login-crash
bugfix/button-alignment

📝Folder Structure and Naming Conventions

  • cypress - contains all the e2e tests
  • public - contains static assets like images, icons, etc.
  • src - contains the main application code
    • api - contains API requests and related code
    • data - contains static data in Russian, English and Armenian languages
    • assets - contains static assets like images, icons, etc.
    • components - reusable components
    • hooks - custom React hooks
    • layouts - layout components
    • lib - utility functions and libraries
    • local-types - local shareable types used in the project
    • pages - Next.js pages
    • styles - global styles and variables

📦 Import Order Guidelines

To keep the project structure consistent, please follow this import order in files:

  • Third-party libraries (e.g., React, Next.js, lodash)

  • Global styles (/src/styles)

  • Constants (/src/constants)

  • Helpers (/src/helpers)

  • Types (/src/types)

  • Hooks (/src/hooks)

  • Lib (/src/lib)

  • Api (/src/api)

  • Components (/src/components)

  • Layouts (/src/layouts)

  • Features (/src/features)

  • Assets (/public/images, SVGs, icons) - *But in general we will be using Icon component

  • Local styles


⚙️ Component Files

Each Component have its own folder with the following structure:
src/components/ComponentName/
src/components/ComponentName/index.tsx
src/components/ComponentName/ComponentName.tsx
src/components/ComponentName/ComponentName.module.scss
src/components/ComponentName/ComponentName.types.ts
Same approach applies to Layouts.

❗️Some components don't have separate types, instead types are defined directly in the component file. That's an old approach, but we will be moving to the new one gradually.


Thank you for reading! Be Kind. Do Good. 🍃

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content
This repository was archived by the owner on May 16, 2026. It is now read-only.

Latest commit

History

125 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

warm welcome

A first-of-its-kind free educational tool, UX Core quickly spread through global product management communities after its release in 2020.

Contains 1,000+ practical examples of cognitive biases applied to product design, software development, and team management.

Widely recognized by leading scholars in cognitive science and behavioral economics (Duke University, Harvard Business School, AUD, and others).

Actively used by managers, designers, and educators worldwide.


🛠 Tech stack

The project is built using:

  • React (via Next.js)

  • TypeScript

  • SCSS modules

  • Node.js version: 18.18.0

Additional tooling:

  • ESLint – for consistent code quality

  • Prettier – for automatic code formatting

  • Husky – used to run npx lint-staged on pre-commit


⚙️ Install dependencies:

In this project we use Yarn, so make sure you have it installed.

yarn install

Run the app locally:

yarn dev

App runs at http://localhost:3005


🔐 Environment variables

Copy the example file before your first run:

cp .env.example .env.local

The defaults in .env.example point at our public staging Strapi and UX Cat APIs, so most UI and feature work runs without any extra setup. Optional integrations (Mixpanel, Google Analytics, Ahrefs, OAuth providers) are left empty — the app no-ops when their keys aren't set.

If you want to work on authentication, you'll need your own OAuth apps and a real NEXTAUTH_SECRET (the example ships a clearly-labelled dev placeholder). Setup links for each provider are in the comments inside .env.example; generate a secret with:

openssl rand -base64 32

Never commit .env.local — it's gitignored on purpose.


✍️ Commit Rules & Branch Naming

We use Conventional Commits to keep our history clean and readable.

Commit prefixes and branch names should be in the following format:

  • feat: - ✨ A new feature
  • hotfix: - 🚑 A critical fix
  • docs: - 📝 Documentation only changes
  • style: - 💅 Changes that do not affect the meaning of the code (white-space, formatting, missing semi-colons, etc)
  • refactor: - 🔨 A code change that neither fixes a bug nor adds a feature
  • chore: - 👷Dev setup, tooling, config or just some random task
  • bugfix: - 🐛 A bug fix

Example commit message:

feat: added new button component

Example commit message with emoji, to make life easier and more fun:

✨ feat: added new button component

🌿 Branch Naming Rules

There are two ways of creating a branch:

CaseRuleExample
From an Issue (preferred if Issue exists)GitHub auto-adds the Issue number. Always use this when related Issue exists.feat/123-add-new-button-component
Without an IssueUse standard format with type/purpose.feat/add-new-button-component
hotfix/fix-login-crash
bugfix/button-alignment

📝Folder Structure and Naming Conventions

  • cypress - contains all the e2e tests
  • public - contains static assets like images, icons, etc.
  • src - contains the main application code
    • api - contains API requests and related code
    • data - contains static data in Russian, English and Armenian languages
    • assets - contains static assets like images, icons, etc.
    • components - reusable components
    • hooks - custom React hooks
    • layouts - layout components
    • lib - utility functions and libraries
    • local-types - local shareable types used in the project
    • pages - Next.js pages
    • styles - global styles and variables

📦 Import Order Guidelines

To keep the project structure consistent, please follow this import order in files:

  • Third-party libraries (e.g., React, Next.js, lodash)

  • Global styles (/src/styles)

  • Constants (/src/constants)

  • Helpers (/src/helpers)

  • Types (/src/types)

  • Hooks (/src/hooks)

  • Lib (/src/lib)

  • Api (/src/api)

  • Components (/src/components)

  • Layouts (/src/layouts)

  • Features (/src/features)

  • Assets (/public/images, SVGs, icons) - *But in general we will be using Icon component

  • Local styles


⚙️ Component Files

Each Component have its own folder with the following structure:
src/components/ComponentName/
src/components/ComponentName/index.tsx
src/components/ComponentName/ComponentName.tsx
src/components/ComponentName/ComponentName.module.scss
src/components/ComponentName/ComponentName.types.ts
Same approach applies to Layouts.

❗️Some components don't have separate types, instead types are defined directly in the component file. That's an old approach, but we will be moving to the new one gradually.


Thank you for reading! Be Kind. Do Good. 🍃

Releases

Packages

Contributors

Languages