A Bun-based monorepo for converting JSON Resume format to PDF with the original JSON resume as embedded metadata.
Parts of this project are written with AI tools. Do with that information what you will.
- Complete round-trip: JSON → HTML → PDF → JSON
- Clean separation: Library doesn't depend on heavy browser tools
- Type-safe: Full TypeScript support with JSON Resume schema
- Metadata embedding: Original JSON stored as PDF attachment and extractable
- Professional layouts: Harvard CV format included
- Extensible: Easy to add new templates and formats
This is a monorepo containing four packages:
Lightweight library for generating HTML from JSON Resume data.
- ✅ No browser dependencies
- ✅ Handlebars templating
- ✅ Harvard CV format ( more later, please feel free to contribute)
- ✅ Type-safe with TypeScript
PDF generator using Puppeteer to convert HTML to PDF, plus a web interface.
- ✅ High-quality PDF rendering
- ✅ Embeds JSON Resume as PDF attachment
- ✅ Full CSS support
- ✅ Web UI with live preview
JSON Resume schema validator using AJV.
- ✅ Validates against official JSON Resume schema
- ✅ Detailed error messages with paths
- ✅ CLI tool and programmatic API
- ✅ Format validation (email, URI, dates)
Extract JSON Resume metadata from PDF files.
- ✅ Extracts embedded JSON from PDFs generated by flouka-studio
- ✅ Handles compressed streams (FlateDecode)
- ✅ Type-safe extraction
- ✅ File path or byte array input
# Install dependencies for all packages
bun installYou can run all package commands from the root directory, for example:
You can start the web interface (flouka-studio) perfect for end users by running the following command on your terminal
bun run webValidator:
bun run validate- Run comprehensive validator test suitebun run validator:example- Same as abovebun run validator:validate- Validate a JSON file (with path argument)
Xebec Render (HTML Generator):
bun run example- Generate HTML from example resumebun run xebec:example- Same as abovebun run xebec:test- Test validator integration
Flouka Studio (PDF Generator & Web UI):
bun run web- Start web interface at http://localhost:3001bun run flouka:web- Same as abovebun run flouka:example- Generate PDF from example resume
Extractor (PDF to JSON):
bun run extract- Extract JSON Resume from generated PDFbun run extractor:example- Same as above
Round-Trip Test:
bun run roundtrip- Test complete workflow: JSON → HTML → PDF → JSON
If you prefer working within each package:
# Validate a JSON Resume file
cd packages/validator
bun cli.ts ../../resumes/example_input.json
# Try the xebec-render library (HTML generation only)
cd packages/xebec-render
bun example.ts
# Try the flouka-studio PDF generator
cd packages/flouka-studio
bun example.ts
# Start the web interface
cd packages/flouka-studio
bun --watch web-server.ts
# Open http://localhost:3001 in your browserhammidu-resume/
├── packages/
│ ├── xebec-render/ # HTML rendering library (lightweight)
│ │ ├── src/
│ │ │ ├── index.ts
│ │ │ ├── html-generator.ts
│ │ │ ├── helpers.ts
│ │ │ └── templates/
│ │ │ └── harvard-configurable.hbs
│ │ └── example.ts
│ │
│ ├── flouka-studio/ # PDF generation + Web UI
│ │ ├── src/
│ │ │ └── index.ts
│ │ ├── public/
│ │ │ └── index.html
│ │ ├── web-server.ts
│ │ └── example.ts
│ │
│ ├── validator/ # JSON Resume validator
│ │ ├── src/
│ │ │ └── index.ts
│ │ ├── cli.ts
│ │ └── example.ts
│ │
│ └── extractor/ # PDF to JSON extractor
│ ├── src/
│ │ └── index.ts
│ └── example.ts
│
├── package.json # Monorepo root
└── README.md
Built with Bun