yangshun/tech-interview-handbook
42.6
Weak · 22 September 2026
34.1k
lines of production code
TypeScript
with JavaScript
5
measurements over time
What this system is
This system is a monorepo containing a career preparation portal and a static documentation website. The portal enables users to submit and analyze tech job offers with compensation benchmarking, browse and review resumes with community feedback, and contribute to a structured question bank for interview preparation. The accompanying website serves as a public-facing handbook for coding and behavioral interview guides, supported by ad monetization and static content management.
Features
Add Todo List and Create pages
The portal now includes a new Todo feature, adding a list view at /todos and a creation form at /todos/new. Users can view all todos, create new ones, edit existing items inline, toggle completion status, and delete todos they own.
apps/portal/src/pages/todos · high confidence
Add homepage and advertising page content
The website now includes a dedicated landing page (\index.js\) featuring sections for key features, user testimonials, and success stories, alongside a new \advertise.md\ page that outlines sponsorship opportunities and terms for advertisers.
apps/website/src/pages · high confidence
Add in-document ad component and structured question list UI
The website now includes a new InDocAd component that renders a sidebar ad within document content, and a QuestionList component that displays coding problems organized by week. The question list is driven by a new QuestionGroups.json data file, which structures problems into weekly sections with metadata like difficulty, duration, and topic, rendering them in a table with color-coded difficulty labels and external links to LeetCode.
_apps/website/contents/\components · high confidence
Add offer analysis view with percentile comparison and top offers
Users can now view a detailed analysis of their submitted offer, including its percentile ranking relative to other offers for the same job title and years of experience (YOE) in the same location. The new OfferAnalysis component displays this percentile data and lists the highest comparable offers via OfferProfileCard, which shows profile details, company, location, level, and compensation. Users can switch between an overall view and company-specific views using tabs, and access more offers via a 'View more offers' button. If insufficient data exists, an informational alert is shown.
apps/portal/src/components/offers/offerAnalysis · high confidence
Add offer profile detail page with token-based access and deletion
Users can now view a detailed profile page for a specific offer, displaying background information, job offers, and analysis data fetched via tRPC. Access to edit or delete the profile is gated by a token passed in the URL; if the token is invalid or missing, the user is redirected to the public view. The page also includes a delete function that removes the profile and redirects the user to the home page upon success, providing toast notifications for both success and failure states.
apps/portal/src/pages/offers/profile · high confidence
Add offer profile edit page
A new page at /offers/profile/edit/\[offerProfileId\] has been added, allowing users to edit their existing offer profiles. The page fetches profile data via tRPC, pre-fills the OffersSubmissionForm with existing background and offer details, and redirects users to the profile view if the profile is not currently editable.
apps/portal/src/pages/offers/profile/edit · high confidence
Add success stories data source
Added a new data file containing testimonials from users who successfully landed jobs at major tech companies, providing social proof for the handbook's effectiveness.
apps/website/src/data · high confidence
Added submission guidelines component to resume form
A new 'ResumeSubmissionGuidelines' component has been introduced in the resume submission form area. This component displays a bordered panel containing specific instructions for users, including warnings against sharing personal particulars or proprietary company information, and a reminder to proofread for errors, ensuring users are aware of these requirements before submitting their resumes.
apps/portal/src/components/resumes/submit-form · high confidence
Added utility modules for job experience levels, Supabase client, and tRPC helpers
This change introduces three new utility files to the portal application. JobExperienceLevel.ts provides a function to map years of experience to standardized job levels (Entry, Mid, Senior). supabase.ts initializes a singleton Supabase client for file storage interactions using environment variables. trpc.ts sets up tRPC React Query hooks and helper types for inferring procedure inputs and outputs from the application router.
apps/portal/src/utils · high confidence
Admin offers table with sorting, filtering, and pagination
The admin offers interface now includes a fully interactive table component that allows administrators to view, sort, and paginate through offer data. Users can sort columns such as company, job title, years of experience, and compensation in ascending or descending order, with sort state persisted in URL search parameters. The table supports filtering by years-of-experience categories (e.g., Fresh Grad, Mid, Senior, Intern) and job type (Full-time vs. Intern), with distinct column layouts for each job type. Pagination is implemented with a configurable page size, and the last column (Actions) is sticky for better usability on wide screens. Each row displays company details, job title, compensation breakdowns, and a link to the editable profile, along with a count of other offers received by the candidate.
apps/portal/src/components/offers/admin · high confidence
Database schema expansion for offers, resumes, and questions with location support
The Prisma database schema has been significantly expanded to support new features across the portal. A comprehensive company seed file (companies.csv) was added to populate the Company model. The Offers module now includes a full schema for profiles, experiences, salaries, and analysis units, allowing for detailed compensation tracking and multi-company analysis. The Resumes module introduced a new schema for storing resume data, comments, and votes, initially using a profile abstraction that was later simplified to link directly to users, and migrated location data from free-text to a structured Country/State/City hierarchy. The Questions module gained support for question encounters, sorting, and user-curated lists. Additionally, ranking capabilities were added to Countries, Cities, and Companies to improve search and discovery.
apps/portal/prisma · high confidence
Database schema for questions, answers, and voting system
The portal database now supports a Q&A feature with tables for questions, answers, comments, and encounters, including upvote/downvote functionality. The schema includes a QuestionsVote enum (later simplified to Vote) and specific question types (Coding, System Design, Behavioral). Encounters are tracked with company, location, and role details.
(repo-wide) · high confidence
Initial API scaffolding for authentication, file storage, and tRPC
This change introduces the foundational API routes for the portal application. It configures NextAuth with GitHub provider and Prisma adapter, setting the sign-in page to /login. It adds a file-storage endpoint supporting POST (upload to Supabase) and DELETE operations. It includes a restricted endpoint example requiring authentication via getServerAuthSession. Finally, it sets up the tRPC handler at /api/trpc/\[trpc\] using the appRouter and context.
apps/portal/src/pages/api · high confidence
Initial database schema and global styles added
The portal application now includes the foundational database schema for user authentication, featuring tables for Users, Accounts, Sessions, and Verification Tokens with necessary unique constraints and foreign key relationships. Additionally, global CSS styles have been initialized to support Tailwind CSS utility classes.
_apps/portal/prisma/migrations/20220928103800\init, apps/portal/src/styles · high confidence
Initial scaffold of the portal application with T3 Stack and core data models
The portal application has been initialized as part of the monorepo, bootstrapped with the T3 Stack (Next.js, Prisma, TailwindCSS, tRPC, and Next-Auth). This change introduces the foundational configuration files, including environment variable templates for database and GitHub authentication, and sets up Tailwind CSS to extend a shared configuration while explicitly including styles from the local UI package to resolve style ordering issues. It also establishes the initial database schema via Prisma migrations, defining a 'Todo' model (replacing a placeholder Example model) and a 'Company' model with a unique slug index, alongside a constant for resume file storage keys.
apps/portal · high confidence
Initial server-side API layer with tRPC, Prisma, and NextAuth integration
This change introduces the foundational server infrastructure for the portal, establishing a tRPC-based API layer backed by Prisma and secured with NextAuth. It includes the database client configuration, an authentication session wrapper, and a router context that injects the Prisma client and user session into API resolvers. The entry point merges numerous feature-specific routers—covering offers (profiles, analysis, comments, admin), resumes (CRUD, comments, votes, starring), questions (answers, comments, lists, encounters), companies, locations, and todos—making these capabilities available to the client via strongly typed endpoints.
apps/portal/src/server · high confidence
Interactive comment management for resume reviews
Users can now fully manage their feedback on resume reviews by adding, editing, and deleting comments, as well as replying to existing ones. The update introduces upvote and downvote functionality with visual feedback, and ensures that unauthenticated users are redirected to the login page when attempting to vote.
apps/portal/src/components/resumes/comments/comment · high confidence
Introduce Tech Offers Repo portal with offer browsing, submission, and profile management
The portal now includes a dedicated offers section featuring a public landing page, an offer browsing table with filters for company, job title, and country, and an admin dashboard for authorized users to view and filter all submissions. Users can now save offer profiles to a personal dashboard, submit new offers via a dedicated form, and view an about page detailing the team and privacy features. The implementation includes server-side rendering for country preferences, Google Analytics event tracking for user interactions, and integration with Clearbit for company logos.
apps/portal/src/pages/offers · high confidence
Introduce TypeScript type definitions for portal domain models
This change adds a new set of TypeScript declaration files to the portal application, establishing the frontend's type contract for core domain entities. It defines structures for Offers (including Profile, DashboardOffer, Valuation, and Analysis units), Questions (Question, Answer, Comment, and Encounter types with sorting enums), Resumes (Resume and ResumeComment types), and extends Next-Auth's Session type to include a user ID. Additionally, it declares the global \gtag\ interface for Google Analytics integration. These types provide compile-time safety for the portal's UI components interacting with the backend APIs.
apps/portal/src/types · high confidence
Introduce dedicated Resume Review navigation and PDF viewing component
The portal now includes a dedicated navigation configuration for the Resumes section, featuring links to Submit for review, Features, About Us, and an external Resume Guide, along with a specific logo. Additionally, a new ResumePdf component has been added to render PDF documents with zoom controls (in/out buttons), pagination, and responsive width adjustments, replacing or supplementing previous PDF display logic.
apps/portal/src/components/resumes · high confidence
Introduce dedicated comment list items with upvote/downvote support
Added three new components in the questions comments area: \CommentListItem\ renders a comment with author details, timestamp, and voting buttons; \AnswerCommentListItem\ and \QuestionCommentListItem\ wrap \CommentListItem\ to handle upvote/downvote actions for answer and question comments respectively, using dedicated vote hooks.
apps/portal/src/components/questions/comments · high confidence
Introduce offers submission workflow with structured UI components and data models
The offers section now includes a dedicated submission experience, anchored by a new Breadcrumbs component that guides users through multi-stage offer analysis. This workflow is supported by a suite of new UI controls and configuration files: JobTypeTabs for switching between full-time and internship roles, and dedicated constants files (EducationFields, EducationLevels, InternshipCycles, Years) that provide standardized dropdown options for background data entry. The navigation structure has been updated to include an 'Analyze your offers' entry point, and comprehensive TypeScript types (types.ts) and constants (constants.ts) define the data shapes for offers profiles, including background, experience, and compensation details, ensuring consistent form handling and validation across the new submission interface.
apps/portal/src/components/offers · high confidence
Introduce portal application shell and core pages
The portal now includes a foundational application structure with a global layout (\\app.tsx\) that integrates Next-Auth for session management, tRPC for API communication, and a toast notification system. This shell wraps all pages in a consistent \AppShell\ and \ProtectedContextProvider\. New pages have been added to support core user flows: a public homepage (\index.tsx\) showcasing the platform's features, a custom login/signup page (\login.tsx\) supporting GitHub authentication, a user profile view (\profile.tsx\), and a settings page (\settings.tsx\) allowing users to update their name and email. Additionally, a 404 page (\404.tsx\) provides navigation links to the main sections, and a test page (\test\\_.tsx\) exposes internal UI components like typeaheads and pickers for development verification.
apps/portal/src/pages · high confidence
Introduce question lists, contribution workflow, and voting UI
The Questions section now supports organizing content into user-created lists via the AddToListDropdown and CreateListDialog components, allowing users to add, remove, and manage questions. A new contribution flow enables users to submit questions through the ContributeQuestionCard and ContributeQuestionDialog, with draft handling via DiscardDraftDialog. Additionally, backend-integrated voting is available through VotingButtons, and the LandingComponent provides a redesigned entry point with company, location, and type filters.
apps/portal/src/components/questions · high confidence
Introduce shared Tailwind CSS configuration package
A new centralized Tailwind configuration has been added to the \packages/tailwind-config\ directory, establishing a common design system across the application. This configuration defines a unified color palette using indigo, rose, sky, emerald, and amber for primary, danger, info, success, and warning states respectively, and sets Inter as the default sans-serif font. It also integrates several Tailwind plugins including aspect-ratio, forms, line-clamp, typography, and scrollbar-hide, ensuring consistent styling utilities are available to consuming packages.
packages/tailwind-config · high confidence
Introduce specialized typeahead components for company, location, and role fields
The portal now includes dedicated typeahead components (CompanyTypeahead, LocationTypeahead, RoleTypeahead) that wrap a new ExpandedTypeahead base component. This change adds support for displaying clickable suggestions alongside standard search results, allows filtering of options via a custom filter function, and manages loading states for asynchronous data fetching in these specific question fields.
apps/portal/src/components/questions/typeahead · high confidence
Introduce structured resume review comments with section-based organization
Users can now submit and view resume reviews organized by specific sections (General, Education, Experience, Projects, Skills). The new comments interface includes a form for submitting multi-section feedback, a list view that groups comments by section with distinct icons, and individual comment cards that support upvoting, replying, editing, and deleting. Additionally, resumes are automatically marked as resolved once the total comment count reaches five or fifteen, and submission events are tracked via Google Analytics.
apps/portal/src/components/resumes/comments · high confidence
Introduce unified application shell with global navigation and analytics
The portal now wraps pages in a new AppShell component that provides a consistent layout, including a global sidebar for switching between Offers, Questions, and Resumes, and a product-specific top navigation bar. This shell also introduces a user profile menu for signed-in users (with links to Settings and Sign Out) and integrates Google Analytics (measurement ID G-DBLZDQ2ZZN) to automatically track page views across the application.
apps/portal/src/components/global · high confidence
Introduces server-side aggregation for question encounter data
A new utility function has been added to aggregate raw question encounter data (including user location, company, and role) into a structured summary. This allows the portal to display consolidated statistics about where and by whom questions have been seen, rather than exposing individual encounter records.
apps/portal/src/utils/questions/server · high confidence
Launch of the Resume Review Portal
The portal now includes a complete set of pages for managing and reviewing resumes. Users can browse resumes with dynamic filtering, sorting, and search capabilities on the home page, and view individual resume details including PDF previews, comments, and actions like starring, resolving, or deleting. The submission flow allows users to upload PDFs, add metadata, and edit or delete their own submissions. Additionally, a landing page highlights key features, and an About Us page introduces the team behind the project.
apps/portal/src/pages/resumes · high confidence
New Question Bank portal pages and features
The portal now includes dedicated pages for the Question Bank feature: a home landing page that guides users to filtered searches, a browse page with advanced filtering (company, location, role, question type, age) and sorting, a lists page for creating and managing custom question collections, an about page introducing the team, and placeholder pages for history and my questions.
apps/portal/src/pages/questions · high confidence
New answer card components with integrated voting
The questions section now features dedicated components for displaying answers: AnswerCard renders an answer with author details, content, and integrated upvote/downvote buttons; FullAnswerCard provides a standard-sized view, while QuestionAnswerCard offers a compact version with hover effects and navigation. These components replace previous implementations to provide a consistent, interactive UI for answer content and engagement.
apps/portal/src/components/questions/card · high confidence
New collapsible filter section component for questions
A new FilterSection component has been introduced in the questions filter area to provide a reusable UI for filtering question lists. This component supports both single-select (radio) and multi-select (checkbox) modes, features a collapsible header that dynamically displays the count of selected options, and includes an integrated search input for filtering available choices. It leverages react-hook-form for state management and the internal UI library for rendering interactive elements.
apps/portal/src/components/questions/filter · high confidence
New comment and reply UI components for offer profiles
The portal now includes dedicated components for displaying and interacting with comments on offer profiles. Users can view individual comments with author details and relative timestamps, reply to existing comments (requiring authentication if not the original author), and delete their own comments via a confirmation dialog. The new ExpandableCommentCard component supports threaded replies, allowing users to expand and view nested responses within a comment thread.
apps/portal/src/components/offers/profile/comments · high confidence
New currency utilities and selector for the offers module
The offers module now includes a dedicated currency utility layer. A comprehensive \Currency\ enum and a \CurrencySelector\ UI component have been added to allow users to select from a wide range of global currencies. The system can automatically determine the appropriate currency based on a country code and provides functions to format monetary values as strings. Additionally, a new \currencyExchange\ module integrates the \@fawazahmed0/currency-api\ to convert values between currencies, though historical date conversion is currently limited to the latest rates.
apps/portal/src/utils/offers/currency · high confidence
New dashboard cards for viewing saved offer profiles
The offers dashboard now displays saved user profiles using two new components: DashboardProfileCard and DashboardOfferCard. Each profile card shows the profile name, creation date, and a list of associated offers, with each offer displaying the company logo, job title, job type, location, level, compensation (annual or monthly), and date received. Users can remove a profile directly from the dashboard, which triggers a toast notification on success or failure, and can click a 'Read full profile' button to navigate to the detailed profile view, an action that is tracked via Google Analytics.
apps/portal/src/components/offers/dashboard · high confidence
New dedicated pages for viewing individual questions and answers with sorting and commenting
The portal now includes dedicated routes for viewing a specific question and its answers, as well as a specific answer and its comments. These pages allow users to view the full content, post new answers or comments, and sort existing answers and comments by type (e.g., new, upvotes) and order (ascending/descending). The UI includes a back button to navigate to the previous page, a form for submitting new content, and infinite scrolling for loading more comments or answers. The pages also track user engagement via Google Analytics events for actions like adding an answer or comment.
apps/portal/src/pages/questions/\[questionId\] · high confidence
New dedicated result page for offer submissions
A new page at /offers/submit/result/\[offerProfileId\] has been introduced to display the outcome of an offer submission. This page validates access via a specific token and profile ID, then presents a two-step interface: first allowing the user to save their profile, and second showing the analysis results. It includes navigation breadcrumbs, loading states, and error handling for permission or data issues.
apps/portal/src/pages/offers/submit/result · high confidence
New feature page card components for offer details
Added LeftTextCard and RightTextCard components to the offers features section, providing reusable UI layouts that display an icon, title, description, and call-to-action button alongside a large image. These components support both left-aligned and right-aligned text/image arrangements, enabling consistent presentation of offer details on the feature page.
apps/portal/src/components/offers/features · high confidence
New form input components for the offers submission workflow
This change introduces a suite of new React components in the offers forms directory (FormCitiesTypeahead, FormCompaniesTypeahead, FormJobTitlesTypeahead, FormMonthYearPicker, FormRadioList, FormSection, FormSelect, FormTextArea, and FormTextInput) that wrap existing UI primitives with react-hook-form integration. These components provide standardized handling for form state management, allowing users to interact with typeaheads, date pickers, and standard inputs within the offers submission process while maintaining consistent styling and validation hooks.
apps/portal/src/components/offers/forms · high confidence
New forms for contributing questions and recording encounters
Added ContributeQuestionForm and CreateQuestionEncounterForm to the questions module. The contribution form allows users to submit new questions with type, content, location, company, role, and date details, including a check for similar existing questions. The encounter form provides a step-by-step interface for users to record when and where they encountered a question, capturing company, location, role, and date information.
apps/portal/src/components/questions/forms · high confidence
New offer analysis generation logic and data inclusion schemas
This change introduces the core logic for generating offer analyses, including calculating percentiles, identifying similar offers, and determining overall and company-specific benchmarks. The new \analysisGeneration.ts\ module handles the computation of these metrics, while \analysisInclusion.ts\ defines the Prisma query structures required to fetch the necessary offer, company, location, and profile data. This enables the portal to provide users with detailed insights into how their offers compare to others in the market.
apps/portal/src/utils/offers/analysis · high confidence
New offer profile submission and analysis workflow
The offer submission process has been restructured into a multi-step form that collects offer details and background information, followed by a dedicated step to save the profile. Users can now save their offer anonymously via a unique edit link or associate it with their user account for future access. Upon submission, the system generates an offer analysis, which is displayed on a dedicated results page.
apps/portal/src/components/offers/offersSubmission · high confidence
New offer submission forms for background and offer details
The offer submission workflow now includes dedicated forms for capturing candidate background information and specific offer details. The BackgroundForm allows users to input years of experience (including specific domain breakdowns) and past employment history, such as job title, company, location, compensation, and duration. The OfferDetailsForm enables the entry of current offer specifics, including job title, level, company, city, date received, and a detailed compensation breakdown (base salary, bonus, stocks, and total compensation) with automatic currency synchronization across compensation fields.
apps/portal/src/components/offers/offersSubmission/submissionForm · high confidence
New offers data mapping layer for analysis and dashboard views
The portal now includes a dedicated mapper module (\offers-mappers.ts\) that translates Prisma database entities into frontend-facing DTOs. This change introduces structured mapping for \AnalysisOffer\ and \AnalysisUnit\, ensuring that offer details such as company, location, job type, and compensation (including base currency/value for both full-time and intern roles) are correctly formatted for the dashboard and analysis features. It also handles the extraction of previous companies from user background experiences and manages the mapping of top similar offers for comparative analysis.
apps/portal/src/mappers · high confidence
New offers profile view with discussion, analysis, and save capabilities
The offers profile page now features a dedicated UI for viewing submitted offers, including an OfferCard that displays company logos (via Clearbit), job details, compensation, and internship cycles, alongside an EducationCard for background info. Users can engage with the profile through a new discussion section that supports commenting and replies, with authentication checks and toast notifications. The profile header includes actions to save/remove the profile from the user's dashboard, edit the profile via a token-based link, and delete the profile. Additionally, an analysis tab allows users to view and regenerate offer analysis data.
apps/portal/src/components/offers/profile · high confidence
New offers submission page with server-side country detection
A new offers submission page has been added at the root of the offers/submit route. It retrieves the user's country from a server-side cookie and passes it to the OffersSubmissionForm component, enabling the form to tailor its behavior or display based on the detected region. The page also sets the browser tab title to 'Analyze your offers'.
apps/portal/src/pages/offers/submit · high confidence
New portal UI component library added
The portal now includes a comprehensive set of reusable UI components in the \apps/portal/src/ui\ directory, providing a consistent design system for the application. This addition introduces form controls such as \TextInput\, \TextArea\, \CheckboxInput\, \Select\, \RadioList\, and \CheckboxList\, alongside layout and navigation elements like \Button\, \Tabs\, \Pagination\, \DropdownMenu\, and \Collapsible\. It also adds feedback and overlay components including \Alert\, \Badge\, \Banner\, \Dialog\, \SlideOut\, \Toast\ (with a \ToastsProvider\ for global state), and \Spinner\. These components are built using Tailwind CSS for styling and \@headlessui/react\ for accessibility and interaction logic, enabling developers to quickly assemble consistent user interfaces.
apps/portal/src/ui · high confidence
New resume badge icons added
The portal now includes a set of new SVG icon components for resume badges, located in the \apps/portal/src/components/resumes/badgeIcons\ directory. These new assets include \ResumeBadgeCoolIcon\, \ResumeBadgeRocketIcon\, and \ResumeBadgeTreasureIcon\ for popular resumes; \ResumeBadgeDetectiveIcon\, \ResumeBadgeEagleIcon\, and \ResumeBadgeSuperheroIcon\ for reviewers; and \ResumeBadgeBookIcon\, \ResumeBadgeOwlIcon\, and \ResumeBadgeSageIcon\ for top comments. A shared TypeScript type definition (\ResumeBadgeProps\) is also introduced to standardize the \className\ prop across these new badge components.
apps/portal/src/components/resumes/badgeIcons · high confidence
New resume browsing UI with filtering, sorting, and interaction tracking
The resume browse page now features a redesigned list view that includes filter pills for narrowing down results, detailed list items displaying resume metadata (title, role, experience, comments, stars, upload time, location), and support for user-specific interactions such as starring resumes. The new components also integrate Google Analytics event tracking for list item clicks to monitor engagement.
apps/portal/src/components/resumes/browse · high confidence
New shared UI components and login routing logic
The portal now includes a suite of new shared components: typeahead inputs for cities, companies, countries, and job titles (with job title ranking data), a month/year picker, a company profile image component with fallback handling, a responsive container, and a GitHub icon. Additionally, a new utility function configures the login redirect to point to a custom /login page, supporting callback URL preservation.
apps/portal/src/components/shared · high confidence
New shared resume UI components for text expansion, experience selection, and sign-in prompts
This change introduces three new shared components in the resumes module to enhance the user interface for resume editing and viewing. The ResumeExpandableText component allows users to toggle the visibility of long text descriptions with a 'See More'/'See Less' button, improving readability on resume review pages. The ResumeExperienceTypeahead component provides a searchable dropdown for selecting job experiences, filtering out already-selected options to prevent duplicates. Additionally, the ResumeSignInButton component offers a standardized way to prompt unauthenticated users to sign in, linking to the login page. These components support the broader resume management feature by providing reusable, consistent UI elements for text handling, data entry, and authentication flows.
apps/portal/src/components/resumes/shared · high confidence
New sidebar ad component with context-aware ad rotation
A new SidebarAd component has been added to the website, introducing a system for displaying rotating advertisements in the sidebar. The component dynamically selects which ad to show based on the current page content: it displays GreatFrontEnd ads for software engineering and coding interview guides, FAANGTechLeads for resume pages, and alternates between ByteByteGo and DesignGurus for system design content. Ads refresh every 20 seconds and include click tracking via Google Analytics.
apps/website/src/components · high confidence
New utility functions for offers form validation, data cleaning, and URL handling
This change introduces a suite of new utility modules in \apps/portal/src/utils/offers\ to support the offers feature. Key additions include \form.tsx\ for cleaning objects and validating positive numbers, \link.tsx\ for generating and copying profile edit links, \randomGenerator.ts\ and \randomNameGenerator.ts\ for creating unique profile names and tokens using the \unique-names-generator\ library, \string.tsx\ for formatting job and location display text, \time.tsx\ for date formatting and duration calculations, \useSearchParam.ts\ for managing URL query parameters in React, and \zodRegex.ts\ for creating validation regex patterns. These utilities provide the foundational logic for form handling, data presentation, and navigation within the offers section.
apps/portal/src/utils/offers · high confidence
New utility infrastructure for the Questions feature
This change introduces a suite of new utility modules in the Questions area to support upcoming UI and logic enhancements. It adds a \RequireAllOrNone\ TypeScript type for stricter validation, slug-generation helpers for companies and locations, and constants defining filter options (companies, question types, ages) and sort configurations. It also provides React hooks for managing search parameters with local storage fallback (\useSearchParam\), handling default company and location selections, registering form fields with \react-hook-form\, and protecting callbacks behind authentication checks (\useProtectedCallback\). Additionally, it includes mutations for question list management (create, delete, add/remove entries) with Google Analytics integration, a helper to relabel question aggregates by job title, and a \withHref\ higher-order component for consistent link styling.
apps/portal/src/utils/questions · high confidence
Offers table gains sorting, filtering, pagination, and location-aware currency
The offers table now supports column sorting (by company, title, YOE, compensation, and date) with visual indicators, and allows filtering by years of experience (entry, intern, mid, senior) and company. Pagination is implemented with a 20-offers-per-page limit and a loading spinner. The table displays company logos, location (city and country code), and income figures converted to the currency appropriate for the offer's country, which is detected via a new Next.js middleware that sets a country cookie from the request's geo data. Filter and sort states are persisted in URL query parameters, and the table includes a sticky 'Actions' column with a link to the user's profile.
apps/portal/src/components/offers/table · high confidence
Optimistic voting for questions, answers, and comments
The portal now supports optimistic upvoting and downvoting for questions, answers, and their respective comments. This change introduces a shared \useVote\ hook and specific implementations (\useQuestionVote\, \useAnswerVote\, \useQuestionCommentVote\, \useAnswerCommentVote\) that immediately update the local UI state upon interaction. The system intelligently manages the vote toggle (upvote to no vote, or vice versa) and reverts the local cache to its previous state if the backend mutation fails, ensuring a responsive and consistent user experience without requiring a full page refresh.
apps/portal/src/utils/questions/vote · high confidence
Resume user badges for review and engagement milestones
The resume review interface now displays achievement badges on user profiles to recognize activity. These badges are earned by reviewing resumes (at 5, 10, and 20 reviews), receiving upvotes on a single resume (at 1, 10, and 20 upvotes), or having top upvoted comments (at 1, 10, and 20). The component fetches the necessary counts via tRPC queries and renders the corresponding icons and titles when thresholds are met.
apps/portal/src/components/resumes/badges · high confidence
Removals
Removal of domain example files and documentation
Deleted several example files and documentation from the domain directory, including the async-loading HTML demo, the pagination-sorting HTML demo and its data source, the tic-tac-toe HTML demo, and markdown files covering databases, networking, security, snake game design, and software engineering concepts.
domain · high confidence
Removal of utility scripts for binary search, Dijkstra, and Rabin-Karp
The repository has removed three utility files: \binary\_search.py\, \graph\_dijkstra.py\, and \string\_rabin\_karp.py\. This eliminates the standalone binary search implementation (including its embedded test prints) and removes placeholder files for Dijkstra's algorithm and the Rabin-Karp string matching algorithm that previously contained only TODO comments.
utilities · high confidence
Behavioural changes
Added Vite pre-commit hook
A new pre-commit hook has been added to the .vite-hooks directory, configured to run the 'vp staged' command. This change integrates Vite-specific validation or processing into the Git commit workflow, ensuring that staged files are checked before commits are finalized.
.vite-hooks · high confidence
Currency values now support decimal precision
The OffersCurrency table has been updated to store currency values with decimal precision. Initially, baseValue was added as an integer, but a subsequent migration changed both the value and baseValue columns to DOUBLE PRECISION. This allows the system to handle fractional currency amounts accurately, which is essential for precise financial calculations and exchange rate representations.
apps/portal/prisma/migrations/20221021231817\, apps/portal/prisma/migrations/20221021233952\_change\_currency\_values\_to\float · high confidence
Custom website styling and font configuration
The website now applies a custom CSS theme that sets the primary color to a purple shade (\#6565d5) and uses the 'Inter var' font family for the base text. This change introduces specific styling for navigation items, footers, and markdown content (headings, blockquotes, and admonitions), including adjustments to font sizes and spacing for both light and dark modes.
apps/website/src/css · high confidence
Customized documentation layout with integrated ads and sidebar components
The documentation theme has been customized to include a GitHub star button and a LinkedIn shoutout within the document content, while a new SidebarAd component is injected into the desktop table of contents, the bottom of the document layout, and the mobile sidebar menu. Additionally, the desktop layout now reserves 75% of the width for the main content with increased horizontal padding, and the table of contents is made sticky with a maximum height constraint.
apps/website/src/theme · high confidence
Database schema updated to support upvotes on questions and comments
The portal database schema now includes an 'upvotes' integer column on the QuestionsAnswer, QuestionsAnswerComment, and QuestionsQuestionComment tables. Existing records in QuestionsAnswer and QuestionsQuestionComment are initialized with a default value of 0, while QuestionsAnswerComment records are also set to default to 0 to ensure data integrity for existing entries.
_apps/portal/prisma/migrations/20221024123252\_add\_upvotes\_to\_schema, apps/portal/prisma/migrations/20221024123849\_add\_upvotes\_default\value · high confidence
Database schema updates for location tracking and question types
The database schema has been updated to support more granular location tracking and new question categories. The \QuestionsQuestionEncounter\ table now uses separate foreign keys for city, state, and country instead of a single location column, allowing for structured geographic data. Additionally, a new 'THEORY' value has been added to the \QuestionsQuestionType\ enum, enabling the system to categorize questions as theoretical.
_apps/portal/prisma/migrations/20221030121147\_use\_roles\_and\_location\_table, apps/portal/prisma/migrations/20221030133638\_add\_theory\enum · high confidence
Environment variable validation and schema enforcement
The portal application now enforces strict validation of environment variables at build time using Zod schemas. Server-side variables (such as database URLs, GitHub credentials, and Supabase keys) are validated against a defined schema, and the system prevents sensitive server-side variables from being accidentally exposed to the client by throwing errors if they are prefixed with NEXT\PUBLIC\. Client-side variables are similarly validated to ensure they meet expected formats, improving reliability and security by catching configuration errors early.
apps/portal/src/env · high confidence
Redesigned resumes landing page with marketing video and feature showcase
The resumes landing page has been rebuilt with a new visual design and content structure. It now features a hero section with a walkthrough video, a call-to-action section highlighting a specific user case study with an embedded video, and a tabbed feature showcase displaying screenshots for browsing, submitting, and reviewing resumes.
apps/portal/src/components/resumes/landing · high confidence
Redirect Grind 75 requests to Cloudflare Pages
A new serverless function at \apps/website/functions/grind75/\[\[catchall\]\].js\ now handles all requests under the \/grind75\ path. Instead of serving content directly, the website proxies these requests to the new \grind75.pages.dev\ domain, preserving the original path and query strings. This change ensures that users accessing Grind 75 resources are seamlessly forwarded to the new Cloudflare-hosted location.
apps/website/functions · high confidence
Refactor question cards into a shared base component with specialized variants
The question card UI has been restructured to use a new \BaseQuestionCard\ component that centralizes rendering logic for votes, statistics, and actions. This base component is now extended by five specialized variants—\FullQuestionCard\, \QuestionListCard\, \QuestionOverviewCard\, \SimilarQuestionCard\, and \QuestionListCard\ (wrapped with navigation)—each configured to show or hide specific features like voting buttons, aggregate statistics, and delete actions. This change standardizes the visual presentation of questions across different contexts (such as list views, overview pages, and similar question suggestions) while allowing each context to display only the relevant interactive elements.
apps/portal/src/components/questions/card/question · high confidence
Restructures offers database schema and relationships
This migration updates the offers data model by removing the \isAttending\ column from \OffersEducation\ and replacing the \offerId\ columns in \OffersFullTime\ and \OffersIntern\ with direct primary keys (\id\). It introduces a new \OffersOffer\ table that links profiles to specific full-time or intern offers via unique foreign keys, while also enforcing a unique constraint on \profileName\ in the \OffersProfile\ table. These changes reorganize how offer details and user profiles are related in the database.
apps/portal/prisma/migrations/20221011042156\ · high confidence_
Resume browsing now supports URL-based filtering, sorting, and dynamic shortcuts
The resume browsing interface now persists filter state (experience, location, role), sort order (Latest, Popular, Most Comments), and custom shortcuts (General, Unreviewed, Top 10, Fresh Grad, US Only) directly in the URL query parameters. This allows users to bookmark or share specific filtered views, ensures filters survive page refreshes, and enables dynamic filter count updates based on the current dataset.
apps/portal/src/utils/resumes · high confidence
Updated question tracking and sorting capabilities
The Questions module now tracks when a question was last seen and counts upvotes, enabling users to sort or filter questions based on recency and popularity. The database schema was adjusted to add \lastSeenAt\ and \upvotes\ columns to the Questions table, while removing the temporary \netVotes\ field from encounters and adding database indexes to optimize queries for these new sorting fields.
_apps/portal/prisma/migrations/20221021150358\_add\_vote\_count\_and\_last\_seen, apps/portal/prisma/migrations/20221021151424\_delete\_extra\_encounter\_fields, apps/portal/prisma/migrations/20221021155717\_add\_sorting\index · high confidence
Website navigation and sidebar structure updated
The website's navigation and content organization have been updated. The sidebar now includes new sections for 'Coding interview preparation' (with rubrics and study plans) and 'Behavioral interview preparation' (with questions and senior candidate guides). The footer links have been reorganized into General, Interviews, Community, and More categories, and the announcement banner now promotes GreatFrontEnd.
apps/website · high confidence
Website static assets and redirect configuration added
The website now includes a Cloudflare redirects file (\\_redirects\) that maps legacy URL paths (such as \/behavioral-questions\ and \/cheatsheet\) to their updated locations, ensuring old links continue to work. A \CNAME\ file is added to configure the \techinterviewhandbook.org\ domain, and an \ads.txt\ file is included to authorize Google AdSense ad serving. Additionally, static assets like the site logo and Discord icons have been added to support the site's visual identity.
apps/website/static · high confidence
Fixes
Add resolved status to resumes
The database schema for resumes has been updated to include a new 'isResolved' boolean field, which defaults to false. This change enables the system to track whether a resume has been resolved, supporting the new resolve functionality.
_apps/portal/prisma/migrations/20221027052436\_resumes\_add\_is\_resolved\status · high confidence
Fix expanded typeaheads by adding shared option hooks
This fix introduces three new shared utility hooks in the portal's utils directory to support expanded typeahead functionality. \useCompanyOptions\ fetches and formats company data via tRPC for dropdown selection. \useCountryOptions\ retrieves country data, applying a custom client-side sort that prioritizes results where the query string appears earlier in the country name or code. \useJobTitleOptions\ filters and sorts a static list of job titles based on a predefined ranking and label matching. These hooks provide the necessary data structures and sorting logic for typeahead components.
apps/portal/src/utils/shared · high confidence
Fix offer deletion by enabling cascade deletes in analysis relationships
Resolves a bug where offers could not be deleted because they were blocked by foreign key constraints in the analysis data. The database schema has been updated to enforce cascade deletion on the relationship between Offers and AnalysisUnits, as well as between AnalysisUnits and OverallAnalyses, ensuring that deleting an offer automatically removes associated analysis records.
_apps/portal/prisma/migrations/20221104084342\_add\_cascade\_delete\_to\_analysed\_offer\_in\_analysis\_unit, apps/portal/prisma/migrations/20221104084451\_add\_cascade\_delete\_to\_overall\_analysis\_in\_offers\analysis · high confidence
Remove specialization field and make compensation fields optional in offer records
The database schema for offer records has been updated to remove the 'specialization' column from the OffersExperience, OffersFullTime, and OffersIntern tables, effectively discarding this data. Additionally, for full-time offers, the base salary, bonus, and stocks fields are now optional rather than required, allowing for more flexible offer configurations where these compensation components may not be specified.
_apps/portal/prisma/migrations/20221024154046\_remove\_specialization\_and\_make\_base\_bonus\_and\_stocks\optional · high confidence
Removes default value for locationId in ResumesResume table
The database migration for the ResumesResume table has been updated to remove the default value constraint from the locationId column. This change ensures that new resume records will no longer automatically inherit a default location, requiring the field to be explicitly set or left null as appropriate.
_apps/portal/prisma/migrations/20221105140124\_revert\_default\location · high confidence
Resume comment vote type changed to enum
The \value\ column in the \ResumesCommentVote\ table has been migrated from its previous type to the \Vote\ enum. This change ensures that resume comment votes are strictly validated against the defined enum values, preventing invalid data entries.
_apps/portal/prisma/migrations/20221013032033\_update\_resume\_vote\_to\enum · high confidence
Updated OffersAnalysis foreign key constraints to cascade deletes
The database migration for the OffersAnalysis table now enforces cascading deletes on both the profileId and offerId foreign keys. This ensures that when an associated OffersProfile or OffersOffer is deleted, the corresponding analysis records are automatically removed, preventing orphaned data and maintaining referential integrity.
apps/portal/prisma/migrations/20221014211740\ · high confidence_
Dependencies
Initialize monorepo with pnpm workspaces and Vite+
The project has been restructured into a monorepo using pnpm workspaces, introducing new packages for shared Tailwind CSS configuration and TypeScript settings. The root package.json now defines the workspace structure and specifies pnpm 10.32.1 as the package manager, while also integrating Vite+ as a build tool. Application-specific dependencies are now managed within their respective app directories, such as the portal app which includes Next.js, Prisma, and tRPC, and the website app which uses Docusaurus.
(dependencies) · high 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 39 → 43 (+3.5)
- Rubric changed (rubric-2026.08.19 → rubric-2026.09.15) — scores are not directly comparable.
Lenses
- Code Health 79 → 76 (-3.1)
- Architecture 80 → 87 (+6.6)
- Maturity 58 → 52 (-5.5)
- Readiness 24 → 28 (+3.7)
- Security 41 → 61 (+20.2)
- Accessibility 49 → 48 (-0.4)
Resolved (60)
- Critical CVE: [GHSA redacted] (pnpm-lock.yaml)
- Critical CVE: [GHSA redacted] (pnpm-lock.yaml)
- Critical CVE: [GHSA redacted] (pnpm-lock.yaml)
- Critical CVE: [GHSA redacted] (pnpm-lock.yaml)
- Critical CVE: [GHSA redacted] (pnpm-lock.yaml)
- Critical vulnerability: [GHSA redacted] (pnpm-lock.yaml)
- Dependency hygiene not measured — dependency manifest found but not parsed for hygiene
- High CVE: [GHSA redacted] (pnpm-lock.yaml)
- High CVE: [GHSA redacted] (pnpm-lock.yaml)
- High CVE: [GHSA redacted] (pnpm-lock.yaml)
- High CVE: [GHSA redacted] (pnpm-lock.yaml)
- High CVE: [GHSA redacted] (pnpm-lock.yaml)
- High CVE: [GHSA redacted] (pnpm-lock.yaml)
- High CVE: [GHSA redacted] (pnpm-lock.yaml)
- High CVE: [GHSA redacted] (pnpm-lock.yaml)
- High CVE: [GHSA redacted] (pnpm-lock.yaml)
- High CVE: [GHSA redacted] (pnpm-lock.yaml)
- High CVE: [GHSA redacted] (pnpm-lock.yaml)
- High CVE: [GHSA redacted] (pnpm-lock.yaml)
- High CVE: [GHSA redacted] (pnpm-lock.yaml)
- …and 40 more
New (213)
- BaseQuestionCard.BaseQuestionCard (cognitive 17) (apps/portal/src/components/questions/card/question/BaseQuestionCard.tsx)
- BaseQuestionCard.BaseQuestionCard (cyclomatic 21) (apps/portal/src/components/questions/card/question/BaseQuestionCard.tsx)
- Button.Button (cognitive 18) (apps/portal/src/ui/Button/Button.tsx)
- Button.Button (cyclomatic 17) (apps/portal/src/ui/Button/Button.tsx)
- CommentCard.CommentCard (cognitive 17) (apps/portal/src/components/offers/profile/comments/CommentCard.tsx)
- CommentCard.CommentCard (cyclomatic 21) (apps/portal/src/components/offers/profile/comments/CommentCard.tsx)
- CreateQuestionEncounterForm.CreateQuestionEncounterForm (cyclomatic 19) (apps/portal/src/components/questions/forms/CreateQuestionEncounterForm.tsx)
- Critical CVE: [GHSA redacted] (pnpm-lock.yaml)
- Critical CVE: [GHSA redacted] (pnpm-lock.yaml)
- Critical CVE: [GHSA redacted] (pnpm-lock.yaml)
- Critical CVE: [GHSA redacted] (pnpm-lock.yaml)
- Critical CVE: [GHSA redacted] (pnpm-lock.yaml)
- Critical vulnerability: [GHSA redacted] (pnpm-lock.yaml)
- Documentation: contradicts the code (apps/website/experimental/front-end/README.md)
- FileTooLong: mappers/offers-mappers.ts (apps/portal/src/mappers/offers-mappers.ts)
- FileTooLong: pages/index.js (apps/website/src/pages/index.js)
- FileTooLong: resumes/index.tsx (apps/portal/src/pages/resumes/index.tsx)
- FunctionTooLong: AddToListDropdown.AddToListDropdown (apps/portal/src/components/questions/AddToListDropdown.tsx)
- FunctionTooLong: AppShell.AppShell (apps/portal/src/components/global/AppShell.tsx)
- FunctionTooLong: BaseQuestionCard.BaseQuestionCard (apps/portal/src/components/questions/card/question/BaseQuestionCard.tsx)
- …and 193 more
Changes since last survey
- 1 commits — 1 feature/other, 0 fixes
By area
- apps/website — 1 commit
Notable commits
- change: contents: fix typos
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
Survey your own repository
yangshun/tech-interview-handbook 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 22 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 e1d28e8886c0b6ff3e50da991ce0e895134ddc59 — 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-d1b85ed16f44.