Levofron/NotionLingo
45.6
Weak · 21 September 2026
42.4k
lines of production code
JavaScript
with TypeScript
4
measurements over time
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.