npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@rmdes/indiekit-endpoint-cv

v1.0.13

Published

CV/Resume editor endpoint for Indiekit. Manage work experience, projects, skills, education, and interests from the admin UI.

Readme

CV Endpoint for Indiekit

An Indiekit plugin that provides a CV/resume editor with admin UI, homepage integration, and public JSON API.

Features

  • Structured CV Management: Work experience, projects, skills, education, languages, interests
  • Admin UI: Add, edit, delete, and reorder entries for all CV sections
  • Homepage Integration: Registers 5 homepage sections for dynamic homepage building
  • Eleventy Integration: Writes JSON file that triggers Eleventy rebuilds
  • Public JSON API: Read-only endpoint for frontend consumption

Installation

npm install @rmdes/indiekit-endpoint-cv

Configuration

Add to your indiekit.config.js:

import CvEndpoint from "@rmdes/indiekit-endpoint-cv";

export default {
  plugins: [
    new CvEndpoint({
      mountPath: "/cv"  // Default, can be changed
    })
  ]
};

Requirements

  • Indiekit: >=1.0.0-beta.25
  • MongoDB: Required for data storage
  • Optional: @rmdes/indiekit-endpoint-homepage for homepage builder integration

Usage

Admin UI

Navigate to /cv in your Indiekit instance to access the CV editor. The dashboard shows all sections with inline add/edit/delete/reorder controls.

Sections

  1. Work Experience

    • Title, company, location
    • Start/end dates (YYYY-MM format)
    • Employment type (full-time, part-time, contract, etc.)
    • Description and highlights (bullet points)
  2. Projects

    • Name, URL, description
    • Technologies (comma-separated)
    • Status (active, completed, archived)
    • Project type (personal or work)
    • Start/end dates
  3. Skills

    • Grouped by category
    • Add categories (e.g., "Languages", "Frameworks", "Tools")
    • Each category contains comma-separated skills
  4. Education

    • Degree, institution, location
    • Start/end dates
    • Description
  5. Languages

    • Language name
    • Proficiency level (native, fluent, intermediate, basic)
  6. Interests

    • Simple comma-separated list

Public API

Get Full CV Data

GET /cv/data.json

Returns:

{
  "experience": [...],
  "projects": [...],
  "skills": {
    "Languages": ["JavaScript", "Python"],
    "Frameworks": ["React", "Express"]
  },
  "education": [...],
  "languages": [...],
  "interests": ["Photography", "Hiking"],
  "lastUpdated": "2026-02-13T10:30:00.000Z"
}

Homepage Integration

If you have @rmdes/indiekit-endpoint-homepage installed, the CV plugin registers 5 homepage sections:

  1. Work Experience (cv-experience)

    • Config: Max items, show highlights toggle
  2. Skills (cv-skills)

    • Displays all skill categories
  3. Education & Languages (cv-education)

    • Combined section
  4. Personal Projects (cv-projects-personal)

    • Filters projects where projectType === "personal"
    • Config: Max items, show technologies toggle
  5. Work Projects (cv-projects-work)

    • Filters projects where projectType === "work"
    • Config: Max items, show technologies toggle
  6. Interests (cv-interests)

    • Simple list display

These sections can be added to your homepage via the homepage builder UI and will automatically fetch data from /cv/data.json.

Eleventy Integration

On every save, the plugin writes CV data to:

{contentDir}/.indiekit/cv.json

Your Eleventy site can read this file via _data/cv.js:

import { readFileSync } from "fs";
import { join } from "path";

const cvPath = join(process.cwd(), "content/.indiekit/cv.json");

export default JSON.parse(readFileSync(cvPath, "utf-8"));

Then use in templates:

{% for exp in cv.experience %}
  <h3>{{ exp.title }} at {{ exp.company }}</h3>
  <p>{{ exp.startDate }} - {{ exp.endDate or "Present" }}</p>
  <p>{{ exp.description }}</p>
{% endfor %}

Data Structure

Experience Entry

{
  title: "Senior Developer",
  company: "Acme Inc",
  location: "San Francisco, CA",
  startDate: "2020-01",
  endDate: null,  // null = current
  type: "full-time",
  description: "Building awesome things",
  highlights: [
    "Led team of 5 developers",
    "Reduced build time by 50%"
  ]
}

Project Entry

{
  name: "My Awesome Project",
  url: "https://github.com/user/project",
  description: "A cool open source project",
  technologies: ["Node.js", "React", "MongoDB"],
  status: "active",
  projectType: "personal",
  startDate: "2023-06",
  endDate: null
}

Skills

{
  "Languages": ["JavaScript", "Python", "Go"],
  "Frameworks": ["React", "Express", "Django"],
  "Tools": ["Git", "Docker", "VS Code"]
}

Education Entry

{
  degree: "Bachelor of Science in Computer Science",
  institution: "University of Example",
  location: "Boston, MA",
  startDate: "2016-09",
  endDate: "2020-05",
  description: "Focus on distributed systems"
}

Language Entry

{
  name: "English",
  level: "native"
}

Operations

Adding Entries

  • Use the "Add" buttons in each section
  • Fill out the form
  • Submit to save

Editing Entries

  • Click the "Edit" button next to any entry
  • Modify fields in the form
  • Submit to save changes

Deleting Entries

  • Click the "Delete" button next to any entry
  • Confirm deletion (if prompt exists)

Reordering Entries

  • Use "Move Up" / "Move Down" buttons
  • Changes save immediately

Skills Management

  • Add new skill categories with the "Add Category" button
  • Edit categories to rename or modify skills
  • Delete entire categories

File Writing

The plugin writes CV data to a JSON file for Eleventy integration:

Location: {contentDir}/.indiekit/cv.json

When: After every save operation

Purpose: Triggers Eleventy's file watcher to rebuild the site with updated CV data

Navigation

The plugin adds itself to Indiekit's admin navigation:

  • Menu Item: "CV" (requires database)
  • Shortcut Icon: Briefcase in admin dashboard

Security

  • Admin UI: All CRUD operations require authentication
  • Public API: /cv/data.json is publicly accessible (read-only)
  • No User Accounts: One CV per Indiekit instance (not multi-tenant)

Common Use Cases

Portfolio Site

Display your work experience and projects on your personal site using the public API and Eleventy integration.

Dynamic Homepage

Use the homepage plugin to add CV sections to your homepage. Configure which sections to show and in what order.

JSON Resume Format

Use the public API endpoint to generate a JSON Resume compatible format (may require transformation).

Troubleshooting

CV Data Not Appearing in Eleventy

  1. Check that {contentDir}/.indiekit/cv.json exists and has data
  2. Verify Eleventy's _data/cv.js is reading from the correct path
  3. Restart Eleventy's dev server if file watcher didn't trigger

Form Submission Loses Data

  • Ensure you're using the latest version
  • Check that hidden inputs don't use | dump | safe filter (causes issues with single quotes)
  • Verify parseArrayField() handles JSON strings

Homepage Sections Not Appearing

  • Confirm @rmdes/indiekit-endpoint-homepage is installed and loaded
  • Check plugin load order (CV plugin should load before homepage plugin uses it)
  • Verify /cv/data.json is accessible

Contributing

Report issues at: https://github.com/rmdes/indiekit-endpoint-cv/issues

License

MIT