Skip to content
CAI
Software that uses CAICheck a score

Levofron/NotionLingo

45.6

Weak · 21 September 2026

42.4k

lines of production code

JavaScript

with TypeScript

4

measurements over time

CAI band scale
CAI trend line
CAI lens gauges

What this system is

Notionlingo is a Next.js-based web application that helps users manage vocabulary by syncing with their Notion databases. It provides a full-stack architecture featuring REST and Supabase authentication, alongside server-side scraping for dictionary definitions. The system supports user profiles, learning streaks, and text-to-speech functionality, all structured within a modular, testable codebase.

How it got here

2022 — Project scaffolding and architecture setup

15 changes.

This period focused on establishing the project's foundational structure, renaming it to 'notionlingo' and upgrading to Next.js 13.3 with a comprehensive set of development tools, including ESLint, Prettier, and Yarn PnP. The work involved creating robust scaffolding templates for components, functions, and hooks, while simultaneously refactoring the application's page structure and API routes to support a clean, modular architecture. Additionally, new API endpoints were introduced to handle user profiles and integrate with Notion, marking the beginning of core feature development.

2023 — client-side architecture and UI layer

17 changes.

This period focused on establishing a structured client-side architecture, introducing domain and repository layers for Supabase, REST, and local storage, alongside a comprehensive new UI component library. The work also centralized configuration, added server-side middleware, and implemented core pages and onboarding flows.

Features

Add Notion integration endpoints for managing and syncing user data

Added new API endpoints to manage Notion integration: set-api-token and set-database-id allow users to configure their Notion credentials and select a database; available-databases and table-columns retrieve metadata about the user's Notion setup; create, update, and random-words endpoints enable creating, modifying, and retrieving random word records from the connected Notion database, with caching and validation middleware applied to all routes.

pages/api/notion · high confidence

Add dictionary lookup via web scraping

The dictionary API endpoint now fetches word definitions and examples by scraping content from Cambridge Dictionary and Merriam-Webster. The implementation uses the \node-fetch\ library to retrieve HTML from both sources, parses the content using \cheerio\, and combines the results to provide comprehensive word meanings and usage examples.

pages/api/dictionary · high confidence

Add presentation layer components and higher-order components

Introduced a suite of new presentation components in the client/presentation/molecules directory, including UI elements like the header, footer, FAQ, testimonials, and various form controls (input, select, slider, textarea). The update also adds a full-screen loader, a confirmation modal, and a navigation item component. Additionally, a higher-order component (HOC) named withCheckIfUserLogged is added to handle user authentication and redirection logic, while an index file centralizes the exports for all these new modules.

client/presentation/molecules · high confidence

Added Supabase API abstraction for authentication

Introduced a new Supabase API wrapper that encapsulates authentication operations, including signing in, logging out, retrieving the current user and session, and listening for authentication state changes. This provides a consistent interface for managing user sessions and auth state across the application.

client/api/supabase · high confidence

Added build scripts for sitemap and routes generation

New Node.js scripts have been added to automate the generation of the site's sitemap and the conversion of the pages directory into a routes enum. The sitemap script scans the pages directory for valid routes and outputs an XML sitemap, while the routes script converts page filenames into a TypeScript enum for type-safe routing.

scripts/node · high confidence

Added component scaffolding template for new UI components

A new Plop generator has been added to the build tooling, allowing developers to scaffold new React components or pages. This includes a TypeScript interface template and a functional component template that automatically handles naming conventions and file placement within the client UI directory.

scripts/plop/create-component · high confidence

Added function and spec templates for new functions

Added new Handlebars templates for generating function files and their corresponding unit tests. The function template provides a basic export structure, while the spec template includes an import for a shared testing utility and a test suite that utilizes this utility to verify the function.

scripts/plop/create-function/templates · high confidence

Added plop generator for creating new functions

A new plop generator named 'function' has been added to the project's scaffolding tooling. This generator allows users to create new functions by specifying a name and a destination path, automatically generating the necessary template files from the project's templates directory.

scripts/plop/create-function · high confidence

Added plop generator for creating new hooks

A new plop generator has been added to the project, enabling developers to scaffold new hooks with a single command. This tool prompts for the hook's name, file extension (TypeScript or TSX), and target directory, then generates the corresponding hook implementation and its associated unit test file from provided templates.

scripts/plop/create-hook · high confidence

Introduce adapter layer modules for REST, local storage, speech synthesis, and Supabase

The client/adapter directory now exposes structured modules (restModule, localStorageModule, speechSynthesisModule, supabaseModule) that encapsulate API calls, repository interactions, and domain use cases. Each module provides a consistent interface for client-side operations such as fetching data, managing local storage, handling speech synthesis, and managing Supabase authentication states. Corresponding unit tests verify that each module exports the expected set of functions.

client/adapter · high confidence

Introduce client-side providers for state, layout, and UI theming

The application now wraps its components with several new context providers: a Chakra UI theme provider that applies custom gray colors and Montserrat/Raleway fonts; a layout provider that handles scroll-to-top behavior and global styles; a router provider that tracks current and previous paths in local storage; a user provider that manages Supabase authentication state and profile data; and a wrap-balancer provider for text balancing. These providers are exported from the new \client/presentation/providers\ directory, centralizing client-side state and UI configuration.

client/presentation/providers · high confidence

Introduce server-side utility functions and middleware for API routes

The server directory now includes a comprehensive set of utility functions and middleware to support API route logic. This includes a new \HttpStatusCode\ enum, a \withMiddleware\ wrapper for handling errors and executing middleware chains, and specific middleware functions for validating request methods, route secrets, user login status, and required parameters. Additionally, new utilities handle Supabase session assignment, user retrieval, profile fetching, and Notion API interactions (client creation, database retrieval, and schema validation). The diff also adds encryption/decryption helpers, text-to-IPA conversion, and a dictionary response formatter that limits suggestions to 10 items.

server · high confidence

Introduce shared client utilities and hooks

Added a suite of reusable client-side utilities and React hooks to the shared module. This includes an Axios instance for API configuration and error handling, context providers for router and user state, and hooks for managing toast notifications, window size, countdown timers, and key press mapping. The update also introduces helper functions for string manipulation and object guarding, alongside a centralized routes enum to standardize navigation paths.

client/shared · high confidence

Introduced new presentation templates for account, dashboard, and other core pages

Added new React components for the account settings, dashboard, add word, find word, home, login, not found, offline, onboarding, privacy policy, and terms & conditions pages. These templates define the structure and behavior for user-facing views, including form handling for login and word addition, card animations for the dashboard, and static content for legal pages.

client/presentation/templates · high confidence

Introduces domain layer with use cases and repositories for local storage, REST API, speech synthesis, and Supabase authentication

The domain layer now includes structured use cases and repositories for managing local storage operations, REST API interactions (including Notion word management and profile handling), speech synthesis controls, and Supabase authentication flows. This introduces a new architecture where business logic is encapsulated in use cases that interact with specific repositories, enabling better separation of concerns and testability for features like text-to-speech, user profile management, and API data fetching.

client/domain · high confidence

Introduces new client-side API wrappers for local storage, REST, and speech synthesis

The client/api directory now includes dedicated API wrapper modules for local storage, REST interactions, and speech synthesis, each accompanied by corresponding type definitions and unit tests. The REST API module exposes endpoints for profile management, Notion integration, dictionary suggestions, and health checks, while the local storage and speech synthesis modules provide browser-native functionality wrappers with support checks and test coverage.

client/api/rest · high confidence

New UI component library in the presentation layer

The \client/presentation/atoms\ directory now contains a comprehensive set of new UI components, including Accordion, Alert Dialog, Avatar, Box, Button, Card, ChakraNextLink, Container, Counter, Divider, Flex, FormControl, Heading, Highlight, IconButton, Icon, Input, Link, Modal, Select, SEO, SimpleGrid, Slider, Spinner, and Stack. These components wrap Chakra UI elements with consistent styling, support dark/light modes, and include specific behaviors such as the Counter's animated number transition, the Heading's optional text balancing, and the Card's responsive shadow adjustments.

client/presentation/atoms · high confidence

New pages for account management, word addition, and dashboard

The application now includes dedicated pages for managing user accounts (including profile deletion and integration resets), adding new words to the dictionary, viewing a dashboard of learned words, and accessing the onboarding flow. These pages implement the core user interactions for account settings, word management, and initial setup, all protected by authentication checks and connected to the shared hooks and templates.

client/presentation/pages · high confidence

New presentation layer components and utilities

The client/presentation/organisms area now includes a suite of new React components and supporting utilities. This includes the main App wrapper, a BackToTopButton, a ContactForm with spam protection, an AddWordForm for user input, and a full onboarding flow (steps one through five) guiding users through Notion integration setup. Additionally, the NotionWordCard components (front, back, and animation wrapper) provide the core vocabulary card interface with speech synthesis and drag interactions. Supporting utilities handle dev tools initialization, local storage field population, and column name mapping.

client/presentation/organisms · high confidence

New repository implementations for local storage, REST, speech synthesis, and Supabase

The client/repository area introduces new repository implementations and their associated operations and tests. A local storage repository is added to manage browser storage operations. A REST repository is introduced to handle API interactions, including fetching and formatting notion words, dictionary suggestions, and user data. A speech synthesis repository is added to manage text-to-speech settings and voice selection. Additionally, a Supabase repository is implemented to handle authentication and user session management. Each repository is accompanied by comprehensive unit tests.

client/repository · high confidence

New shell scripts for Git workflow and release automation

Added a suite of shell scripts in the scripts/shell directory to streamline development and release workflows. These include helpers for Git operations such as checking out and pulling the develop branch, creating and managing branches, pushing changes, and resetting local changes. Additionally, a comprehensive release script automates the process of preparing a release by updating branches, bumping the version, creating a release branch, and opening pull requests to both the main and develop branches via the GitHub API. Other scripts handle reinstalling Node modules and removing local Git branches.

scripts/shell · high confidence

Project scaffolding and tooling configuration

The repository now includes comprehensive configuration files that establish the project's development environment and architecture. This includes a dependency-cruiser configuration to enforce clean architecture rules and prevent circular dependencies, an ESLint setup with strict TypeScript and React rules, and a Prettier configuration for code formatting. Additionally, the project defines TypeScript path aliases for modular layers (presentation, adapter, domain, etc.), sets up Jest for testing, and configures Next.js with PWA support, bundle analysis, and Axiom integration. The inclusion of .env.example and types.d.ts provides a template for required environment variables and global type definitions, while .gitignore and .yarnrc.yml standardize the development workflow.

(repo-wide) · high confidence

Behavioural changes

Centralized configuration and test setup

The application's configuration has been consolidated into a new 'config' directory. This includes a 'constants.ts' file that centralizes environment variables (such as Supabase credentials and API keys), static content like FAQ questions, and social media links. Additionally, a 'supabase.instance.ts' file has been added to manage the Supabase client initialization. For testing purposes, Jest configuration files and mocks for browser APIs and environment variables have also been moved into the 'config/jest' subdirectory.

config · high confidence

Enforce commit message and pre-commit linting via Husky

The repository now enforces commit message formatting and pre-commit linting through Husky. A new commit-msg hook runs commitlint to validate messages, while a pre-commit hook runs lint-staged to check staged files, ensuring code quality and consistent commit history.

.husky · medium confidence

New profile management endpoints for deletion, retrieval, streak tracking, and Notion integration

The API now exposes five new endpoints under /profile: a DELETE route to soft-delete a user's profile and clear associated caches, a GET route to retrieve full profile and user metadata, a GET route to update daily learning streaks, a GET route to return the currently logged-in user's profile data, and a GET route to reset Notion integration settings. These changes introduce new capabilities for managing user profiles, tracking activity, and handling third-party integrations.

pages/api/profile · high confidence

Refactored API routes with new middleware and server utilities

The API routes in the 'pages/api' directory have been restructured to use a new middleware system and server-side utilities. New endpoints for contact form submission, health checks, and Supabase cookie management now utilize shared middleware for request validation, route secret verification, and method checking. The previous 'hello' route was removed, and the codebase now imports from '@server/utils' and '@config/supabase.instance' instead of local or generic imports, indicating a move towards a more modular and secure API structure.

pages/api · high confidence

Removal of legacy CSS stylesheets

The project has removed the legacy CSS files (styles/Home.module.css and styles/globals.css) that previously defined the visual styling for the home page and global elements. This change likely accompanies a shift away from traditional CSS modules and global stylesheets, potentially in favor of a different styling approach (such as Tailwind, as suggested by the commit message, though the diff only confirms the deletion of these specific CSS files).

styles · medium confidence

Restructure pages to follow atomic design and update home page content

The application's page structure has been refactored to adhere to the atomic design methodology, with new page components (such as 404, login, dashboard, and others) now acting as thin wrappers that import and render specific presentation-layer components from '@presentation/pages'. The home page (index.tsx) has been significantly updated to replace the default Next.js template with actual application content, including SEO metadata, JSON-LD structured data for logos and social profiles, and a FAQ section. Additionally, the root app component (\_app.tsx) has been simplified to import the App from '@presentation', and the document (\_document.tsx) has been created to configure the HTML head and viewport settings.

pages · high confidence

Updated Yarn binary to version 3.2.4

The project's bundled Yarn executable has been updated to version 3.2.4. This change ensures compatibility with the project's PnP (Plug'n'Play) configuration, resolving issues where TypeScript support was previously broken under this mode. Users will benefit from improved package resolution and type checking in PnP environments.

.yarn · high confidence

Updated Yarn interactive tools plugin

The Yarn interactive tools plugin has been updated to version 4.17.21 of the underlying Lodash library, which includes various internal improvements and bug fixes.

.yarn/plugins/@yarnpkg · medium confidence

Fixes

Fix TypeScript and ESLint SDKs for Yarn PnP compatibility

Added new SDK wrapper scripts for ESLint and TypeScript (including tsc, tsserver, tsserverlibrary, and typescript.js) that automatically configure the Yarn PnP environment before delegating to the actual tools. This ensures that ESLint and TypeScript commands work correctly in projects using Yarn's Plug'n'Play resolution, fixing issues where these tools would fail to resolve dependencies or interact with the virtual file system.

.yarn/sdks/eslint, .yarn/sdks/typescript · high confidence

Dependencies

Project renamed to notionlingo and upgraded to Next.js 13.3 with expanded dependencies

The project has been renamed to 'notionlingo' and upgraded to Next.js 13.3. This change introduces a broader set of dependencies, including Chakra UI, Framer Motion, Supabase, Formik, and various linting and testing tools. The package manager is configured for Yarn Plug'n'Play (PnP) mode, and new scripts have been added for architecture checks, code generation, and testing. The lockfile has been updated to reflect these dependency changes.

(dependencies) · medium confidence

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

How this codebase got here

Score

  • CAI 44 → 46 (+1.5)
  • Rubric changed (rubric-2026.08.19 → rubric-2026.09.15) — scores are not directly comparable.

Lenses

  • Code Health 94 → 91 (-2.9)
  • Architecture 91 → 78 (-13.4)
  • Maturity 51 → 53 (+2.1)
  • Readiness 45 → 53 (+8.4)
  • Security 54 → 60 (+5.3)
  • Accessibility 31 → 31 (+0.0)

Resolved (65)

  • Boundary-crossing change coupling: set-api-token.ts ↔ validate-if-user-is-logged-in-middleware.function.ts (pages/api/notion/set-api-token.ts)
  • Change coupling clique: onboarding-step-four.component.tsx, onboarding-step-one.component.tsx, onboarding-step-three.component.tsx, onboarding-step-two.component.tsx (client/presentation/organisms/onboarding-step-four/onboarding-step-four.component.tsx)
  • Change coupling: available-databases.ts ↔ random-words.ts (pages/api/notion/available-databases.ts)
  • Change coupling: rest.api.ts ↔ rest.repository.ts (client/api/rest/rest.api.ts)
  • Change coupling: rest.api.ts ↔ rest.use-cases.ts (client/api/rest/rest.api.ts)
  • Change coupling: supabase.api.ts ↔ supabase.repository.ts (client/api/supabase/supabase.api.ts)
  • Change coupling: supabase.api.ts ↔ supabase.use-cases.ts (client/api/supabase/supabase.api.ts)
  • Coverage not included — suite not readable by the collector
  • Critical CVE: [GHSA redacted] (yarn.lock)
  • Critical CVE: [GHSA redacted] (yarn.lock)
  • Critical CVE: [GHSA redacted] (yarn.lock)
  • Critical CVE: [GHSA redacted] (yarn.lock)
  • Critical CVE: [GHSA redacted] (yarn.lock)
  • Critical CVE: [GHSA redacted] (yarn.lock)
  • Critical CVE: [GHSA redacted] (yarn.lock)
  • Critical CVE: [GHSA redacted] (yarn.lock)
  • Dependency hygiene not measured — dependency manifest found but not parsed for hygiene
  • High CVE: [GHSA redacted] (yarn.lock)
  • High CVE: [GHSA redacted] (yarn.lock)
  • High CVE: [GHSA redacted] (yarn.lock)
  • …and 45 more

New (124)

  • Change coupling clique: getting-started.component.tsx, home-hero.component.tsx, try-it-now.component.tsx (client/presentation/molecules/getting-started/getting-started.component.tsx)
  • Change coupling clique: rest.api.ts, rest.repository.ts, rest.use-cases.ts, create-dev-tools-client.function.ts (client/api/rest/rest.api.ts)
  • Change coupling: account-settings.component.tsx ↔ donate.component.tsx (client/presentation/templates/account-settings/account-settings.component.tsx)
  • Change coupling: dashboard.page.tsx ↔ onboarding.page.tsx (client/presentation/pages/dashboard/dashboard.page.tsx)
  • Change coupling: header.component.tsx ↔ navigation-item.component.tsx (client/presentation/molecules/header/header.component.tsx)
  • Change coupling: onboarding-step-five.component.tsx ↔ onboarding-step-four.component.tsx (client/presentation/organisms/onboarding-step-five/onboarding-step-five.component.tsx)
  • Change coupling: onboarding-step-four.component.tsx ↔ onboarding-step-one.component.tsx (client/presentation/organisms/onboarding-step-four/onboarding-step-four.component.tsx)
  • Change coupling: onboarding-step-one.component.tsx ↔ onboarding.page.tsx (client/presentation/organisms/onboarding-step-one/onboarding-step-one.component.tsx)
  • Change coupling: random-words.ts ↔ set-api-token.ts (pages/api/notion/random-words.ts)
  • Change coupling: random-words.ts ↔ set-database-id.ts (pages/api/notion/random-words.ts)
  • Change coupling: set-api-token.ts ↔ set-database-id.ts (pages/api/notion/set-api-token.ts)
  • Change-coupling hub: available-databases.ts → random-words.ts, set-api-token.ts, set-database-id.ts, logged.ts (pages/api/notion/available-databases.ts)
  • Change-coupling hub: donate.page.tsx → add-word.page.tsx, dashboard.page.tsx, onboarding.page.tsx (client/presentation/pages/donate/donate.page.tsx)
  • Change-coupling hub: offline.component.tsx → onboarding-step-five.component.tsx, add-word.page.tsx, account-settings.component.tsx, dashboard.component.tsx (client/presentation/templates/offline/offline.component.tsx)
  • Change-coupling hub: onboarding-step-three.component.tsx → onboarding-step-five.component.tsx, onboarding-step-four.component.tsx, onboarding-step-one.component.tsx, onboarding-step-two.component.tsx, onboarding.page.tsx (client/presentation/organisms/onboarding-step-three/onboarding-step-three.component.tsx)
  • Change-coupling hub: onboarding-step-two.component.tsx → onboarding-step-five.component.tsx, onboarding-step-four.component.tsx, onboarding-step-one.component.tsx, onboarding.page.tsx (client/presentation/organisms/onboarding-step-two/onboarding-step-two.component.tsx)
  • Critical CVE: [GHSA redacted] (yarn.lock)
  • Critical CVE: [GHSA redacted] (yarn.lock)
  • Critical CVE: [GHSA redacted] (yarn.lock)
  • Critical CVE: [GHSA redacted] (yarn.lock)
  • …and 104 more

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

Survey your own repository

Levofron/NotionLingo was measured the same way every project in this corpus was: the same rubric, at a pinned commit, with the result published in full. Point a surveyor at a repository you know and see whether you agree with it.

About this page

  • The score is its most recent published measurement, taken on 21 September 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
  • Measured at commit 25c8f63b3fffee8b620c3449cba793d1234d19c8 — the exact code this score is about.
  • Scored under rubric-2026.09.15 — the same rubric and the same method as every other entry in this index.
  • Measured by watchdog.canine.dev using codehealth-analyzer preprod-b84573e22831.