Work Experience

Display work experiences with role details, company logos, and durations.

Virallens

I build complete digital products end to end, where AI meets polished software people use every day.

  • Citera: Built the pipeline that extracts factual claims from any text, link, or file and verifies each one against trusted sources with word-for-word evidence.
  • L-K Drop Analysis: Built the front-end over the analysis engine, with hover-to-source citations and a live AI chat that streams its reasoning.
  • Perssonify Website 3: Shipped a responsive, animated site for four brands from one codebase with a shared design system.
  • TypeScript
  • React 19
  • Next.js 16
  • Tailwind CSS
  • shadcn/ui
  • Framer Motion
  • Node.js
  • Vercel AI SDK
  • Turborepo

Education

  • C++
  • Python
  • Control Systems
  • Embedded Systems

Features

  • Supports multiple positions per company.
  • Markdown in position descriptions: paragraphs, lists, bold, code, and links.
  • Company logos, employment type, period, and a calculated duration.
  • Positions with a description expand and collapse; positions without one stay static.
  • No markdown, date, or icon libraries required.

Installation

Cortexcn
pnpm dlx shadcn@latest add @cortexcn/work-experience

The CLI also installs the shadcn/ui Collapsible and Separator components.

Usage

import { WorkExperience } from "@/components/work-experience";
import type { ExperienceItemType } from "@/components/work-experience";
const experiences: ExperienceItemType[] = [
  {
    id: "acme",
    companyName: "Acme",
    companyWebsite: "https://acme.com",
    isCurrentEmployer: true,
    positions: [
      {
        id: "engineer",
        title: "Software Engineer",
        employmentPeriod: { start: "03.2024" },
        employmentType: "Full-time",
        description:
          "- Shipped the new billing flow.\n- Led the design system.",
        skills: ["React", "TypeScript"],
      },
    ],
  },
];

<WorkExperience experiences={experiences} />;

Dates use MM.YYYY or YYYY. Leave end out for a current role; the period then ends with an infinity sign and the duration counts up to today. icon accepts any element, so you can use whichever icon set your project already has.

API reference

WorkExperience

PropTypeDefaultDescription
experiencesExperienceItemType[]requiredCompanies to list, in order
classNamestring-Extra classes for the root div

ExperienceItemType

PropertyTypeDescription
idstringUnique identifier for the experience item
companyNamestringName of the company
companyLogostring?URL or path to the company's logo image
companyWebsitestring?URL to the company's website
positionsExperiencePositionItemType[]Positions held at the company
isCurrentEmployerboolean?Shows a live indicator next to the company

ExperiencePositionItemType

PropertyTypeDescription
idstringUnique identifier for the position
titlestringThe job title or position name
employmentPeriod{ start: string; end?: string }MM.YYYY or YYYY. Omit end for current roles
employmentTypestring?For example "Full-time", "Part-time", or "Contract"
descriptionstring?Markdown description; the position collapses when it is set
iconReactElement?Icon for the position. Defaults to a briefcase
skillsstring[]?Skills shown as tags under the position
isExpandedboolean?Whether the description starts expanded