PHPackages                             juststeveking/resume-php - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Parsing &amp; Serialization](/categories/parsing)
4. /
5. juststeveking/resume-php

ActiveLibrary[Parsing &amp; Serialization](/categories/parsing)

juststeveking/resume-php
========================

A PHP library for building and working with the JSON resume schema.

1.0.0(3mo ago)1061.1k8MITPHPPHP ^8.4CI passing

Since Jul 19Pushed 3mo agoCompare

[ Source](https://github.com/JustSteveKing/resume-php)[ Packagist](https://packagist.org/packages/juststeveking/resume-php)[ Docs](https://github.com/juststeveking/resume-php)[ RSS](/packages/juststeveking-resume-php/feed)WikiDiscussions main Synced today

READMEChangelog (3)Dependencies (17)Versions (12)Used By (0)

Resume PHP
==========

[](#resume-php)

A PHP library for building and working with the [JSON Resume](https://jsonresume.org/) schema.

[![Latest Version on Packagist](https://camo.githubusercontent.com/7924be1958261608648c9b87060ec871b9b8dce5d97349076adc3bfb54589a21/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f762f6a75737473746576656b696e672f726573756d652d7068702e7376673f7374796c653d666c61742d737175617265)](https://packagist.org/packages/juststeveking/resume-php)[![Total Downloads](https://camo.githubusercontent.com/5f68982bf14d5e1a28a814e507e97327f55143ab3e2843a54c10dca157ee2caa/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f64742f6a75737473746576656b696e672f726573756d652d7068702e7376673f7374796c653d666c61742d737175617265)](https://packagist.org/packages/juststeveking/resume-php)[![License](https://camo.githubusercontent.com/829e0bef044e6df278a6ca864b4e86cbbd7bda5d23d6593152036d7377593560/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f6c2f6a75737473746576656b696e672f726573756d652d7068702e7376673f7374796c653d666c61742d737175617265)](./LICENSE)[![Tests](https://github.com/juststeveking/resume-php/actions/workflows/tests.yml/badge.svg)](https://github.com/juststeveking/resume-php/actions/workflows/tests.yml)[![Static Analysis](https://github.com/juststeveking/resume-php/actions/workflows/static-analysis.yml/badge.svg)](https://github.com/juststeveking/resume-php/actions/workflows/static-analysis.yml)[![Code Style](https://github.com/juststeveking/resume-php/actions/workflows/code-style.yml/badge.svg)](https://github.com/juststeveking/resume-php/actions/workflows/code-style.yml)

Introduction
------------

[](#introduction)

Resume PHP is a library that provides a type-safe way to build and work with resumes following the [JSON Resume](https://jsonresume.org/) schema. It offers a fluent builder interface, rigorous data validation, and automated serialization to schema-compliant JSON.

Requirements
------------

[](#requirements)

- PHP 8.4 or higher
- Composer

Installation
------------

[](#installation)

You can install the package via composer:

```
composer require juststeveking/resume-php
```

Usage
-----

[](#usage)

### Building a Résumé

[](#building-a-résumé)

The library uses strictly-typed Data Objects and Value Objects to ensure your data is always valid and compliant with the schema.

```
use JustSteveKing\Resume\Builders\ResumeBuilder;
use JustSteveKing\Resume\DataObjects\Basics;
use JustSteveKing\Resume\DataObjects\Location;
use JustSteveKing\Resume\DataObjects\Profile;
use JustSteveKing\Resume\Enums\Network;
use JustSteveKing\Resume\ValueObjects\Email;
use JustSteveKing\Resume\ValueObjects\Url;

// Create the basics section using Value Objects for Email and URL
$basics = new Basics(
    name: 'John Doe',
    label: 'Software Engineer',
    email: new Email('john@example.com'),
    url: new Url('https://johndoe.com'),
    summary: 'Experienced software engineer with 5+ years in web development.',
    location: new Location(
        address: '123 Main St',
        postalCode: '94105',
        city: 'San Francisco',
        countryCode: 'US',
        region: 'CA',
    ),
    profiles: [
        new Profile(Network::GitHub, 'johndoe', new Url('https://github.com/johndoe')),
        new Profile(Network::LinkedIn, 'johndoe', new Url('https://linkedin.com/in/johndoe')),
    ],
);

// Build the résumé fluently
$resume = (new ResumeBuilder())
    ->basics($basics)
    ->addWork(new \JustSteveKing\Resume\DataObjects\Work(
        name: 'Tech Corp',
        position: 'Senior Developer',
        startDate: '2020-01-01',
        summary: 'Led development of core platform features',
        highlights: ['Improved performance by 40%', 'Mentored junior developers'],
    ))
    ->build();

// Validate against the official JSON schema
$isValid = $resume->validate();

// Convert to schema-compliant JSON
$json = json_encode($resume, JSON_PRETTY_PRINT);
```

### Hydrating from Existing Data

[](#hydrating-from-existing-data)

You can easily load an existing JSON or YAML résumé using the `ResumeFactory`.

```
use JustSteveKing\Resume\Factories\ResumeFactory;

// From a JSON string
$resume = ResumeFactory::fromJson($jsonString);

// From a YAML string
$resume = ResumeFactory::fromYaml($yamlString);

// From an associative array
$resume = ResumeFactory::fromArray($data);
```

### Adding Education &amp; Skills

[](#adding-education--skills)

```
use JustSteveKing\Resume\DataObjects\Education;
use JustSteveKing\Resume\DataObjects\Skill;
use JustSteveKing\Resume\Enums\EducationLevel;
use JustSteveKing\Resume\Enums\SkillLevel;

$resumeBuilder = (new ResumeBuilder())->basics($basics);

$resumeBuilder->addEducation(new Education(
    institution: 'University of Technology',
    area: 'Computer Science',
    studyType: EducationLevel::Bachelor,
    startDate: '2014-09-01',
    endDate: '2018-06-01',
));

$resumeBuilder->addSkill(new Skill(
    name: 'PHP',
    level: SkillLevel::Expert,
    keywords: ['Laravel', 'Symfony', 'API Development'],
));

$resume = $resumeBuilder->build();
```

Features
--------

[](#features)

- **Strictly Typed**: Leverages PHP 8.4 features like property promotion and readonly classes for robust data integrity.
- **Value Objects**: Uses `Email` and `Url` value objects to enforce data quality at the point of creation.
- **Fluent Builder**: A developer-friendly interface for constructing complex resumes step-by-step.
- **Schema Validation**: Built-in validation using `opis/json-schema` against the official JSON Resume specification.
- **Career Insights**: Analyze your career data to calculate total experience, skill frequency, and identify work history gaps.
- **Smart Serialization**: Automatically filters out `null` or empty optional fields to keep your JSON output clean.
- **CLI Tooling**: A built-in command-line tool for validation and conversion.
- **Internationalization (i18n)**: Support for localized labels in exports (e.g., English, Welsh).
- **Exporters**: Built-in support for transforming resumes to Markdown, YAML, and JSON-LD (Schema.org).

Exporting &amp; Transformations
-------------------------------

[](#exporting--transformations)

### JSON-LD (Semantic Web)

[](#json-ld-semantic-web)

The `toJsonLd()` method converts your résumé into a structured array following the `schema.org/Person` specification.

```
$jsonLd = $resume->toJsonLd();
echo json_encode($jsonLd, JSON_PRETTY_PRINT);
```

### Markdown Export

[](#markdown-export)

Generate a clean, human-readable Markdown version of your resume.

```
// Basic export (defaults to English)
echo $resume->toMarkdown();

// Custom configuration and Localization
$markdown = $resume->toMarkdown(
    options: [
        'work' => true,
        'education' => true,
    ],
    locale: 'cy' // Welsh
);
```

### Career Insights

[](#career-insights)

The `CareerAnalyzer` service provides deep insights into your résumé data.

```
$insights = $resume->getInsights();

// Calculate total years of experience
echo $insights->getTotalYearsExperience(); // e.g., 8.5

// Identify gaps in work history (greater than 30 days)
$gaps = $insights->getWorkGaps();

// Get skill usage frequency based on mentions in work highlights
$skills = $insights->getSkillFrequency();
```

CLI Tooling
-----------

[](#cli-tooling)

The library includes a `resume` binary for common tasks.

```
# Validate a résumé file
./vendor/bin/resume validate my-resume.json

# Export to different formats
./vendor/bin/resume export my-resume.yaml --format=markdown --locale=en
./vendor/bin/resume export my-resume.json --format=json-ld --output=profile.jsonld
```

Job Description Builder
-----------------------

[](#job-description-builder)

Create structured job descriptions using the same fluent pattern.

```
use JustSteveKing\Resume\Builders\JobDescriptionBuilder;

$jobDescription = (new JobDescriptionBuilder())
    ->name('Senior PHP Developer')
    ->location('Remote')
    ->description('Lead our backend transition to PHP 8.4')
    ->addHighlight('Competitive salary')
    ->addSkill('PHP')
    ->addTool('Docker')
    ->addResponsibility('Code reviews')
    ->build();
```

Development
-----------

[](#development)

The project maintains high standards through automated tools:

- **Testing**: `composer test` (PHPUnit)
- **Static Analysis**: `composer stan` (PHPStan at Level 9)
- **Code Style**: `composer pint` (Laravel Pint)
- **Refactoring**: `composer refactor` (Rector)

License
-------

[](#license)

The MIT License (MIT). Please see [License File](LICENSE) for more information.

Credits
-------

[](#credits)

- [Steve McDougall](https://github.com/juststeveking)
- [All Contributors](../../contributors)

###  Health Score

51

—

FairBetter than 95% of packages

Maintenance81

Actively maintained with recent releases

Popularity36

Limited adoption so far

Community11

Small or concentrated contributor base

Maturity61

Established project with proven stability

 Bus Factor1

Top contributor holds 87.8% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~125 days

Total

3

Last Release

99d ago

Major Versions

0.0.2 → 1.0.02026-03-27

### Community

Maintainers

![](https://www.gravatar.com/avatar/a87fe82b349821ebd49cf57d65c4cd3e33ae0833222a8438d90fe8921ca899ea?d=identicon)[JustSteveKing](/maintainers/JustSteveKing)

---

Top Contributors

[![JustSteveKing](https://avatars.githubusercontent.com/u/6368379?v=4)](https://github.com/JustSteveKing "JustSteveKing (36 commits)")[![BrookeDot](https://avatars.githubusercontent.com/u/150348?v=4)](https://github.com/BrookeDot "BrookeDot (5 commits)")

---

Tags

phpjsonschemalibraryresume

###  Code Quality

TestsPHPUnit

Static AnalysisPHPStan, Rector

Code StyleLaravel Pint

Type Coverage Yes

### Embed Badge

![Health badge](/badges/juststeveking-resume-php/health.svg)

```
[![Health](https://phpackages.com/badges/juststeveking-resume-php/health.svg)](https://phpackages.com/packages/juststeveking-resume-php)
```

###  Alternatives

[friendsoftypo3/content-blocks

TYPO3 CMS Content Blocks - Content Types API | Define reusable components via YAML

103519.9k53](/packages/friendsoftypo3-content-blocks)[easycorp/easyadmin-bundle

Admin generator for Symfony applications

4.3k17.9M388](/packages/easycorp-easyadmin-bundle)[shopware/core

Shopware platform is the core for all Shopware ecommerce products.

585.6M574](/packages/shopware-core)[sylius/sylius

E-Commerce platform for PHP, based on Symfony framework.

8.5k5.9M738](/packages/sylius-sylius)[pimcore/pimcore

Content &amp; Product Management Framework (CMS/PIM/E-Commerce)

3.8k3.8M508](/packages/pimcore-pimcore)[shopware/platform

The Shopware e-commerce core

3.4k1.5M3](/packages/shopware-platform)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
