A standard file format for resume / cv source data
I am tired of entering the same information, again and again, into a variety of sites and profiles and docs, all with the same goal: to apply for some position via resume / cv.
Instead, I want to have the latest version of that info in one file.
That's .xp. It's not really a new file format (just json under the nonexistant hood), but I hope it could:
- lay the groundwork for a common format that can be imported to or exported from sites that have experience profiles
- be used as the data source to generate a resume/cv PDF (via typst, for example)
- be used to apply for a role/opportunity by simply submitting an .xp file
Read more about my thought process here ///blog wip///
.xpis a.jsonfile, and follows the same syntax rules- It is a single top-level object. Here’s the most minimal possible structure:
{
"personal_info": {
"name": "Anonymous Human"
},
"links": [],
"work": [],
"skill_categories": [],
"education": []
}- Any text editor or json viewer should work
- For proper syntax highlighting, either add
.jsonto the end of your.xpfilename to make your editor treat it as a.jsonfile, or see Editor Support for ways to use.xpdirectly
If your project uses Rust, you can simply add xp as a cargo dependency, and then encode/decode to/from the Xp type via serde.
.xp files conform to the JSON Standard, so we just need to configure the editor to treat .xp like .json files to get all the .json features and syntax highlighting offered by that editor
in your .vimrc
autocmd BufRead,BufNewFile *.xp set filetype=jsonin your init.lua
vim.filetype.add({
extension = {
xp = "json",
},
}){
// other settings ...
"files.associations": {
"*.xp": "json"
}
// ... other settings
}- For project-level support, add to
.vscode/settings.json: - For user-level support, add to your User Settings json (
⌘+⇧+P, "Use.." should autocomplete to it). You won’t need the top level brackets there.
cargo install xp
Run the above command to globally install the xp binary.
Then, you can:
- Validate a
.xpfile to determine if it matches the expected format - Generate a JSON schema based on the models as they are defined currently. This is mainly for the development of this library.
cargo add xp
Run the above Cargo command in your project directory.
Then, you can:
- Use the
Xpmodel and its sub-models in your project, which allows you to encode, decode, and manipulate experience data
- xp.schema.json — a JSON Schema representing the
Xpmodel
- encode/decode docs/support/packages for other languages
I haven't decided on a proper contribution policy, but for now all issues and PRs are okay. I have common goals that will guide the review process, and will be codified as needed:
- I am using this myself, so its capabilities will likely adapt to my needs, but I only want to add things to the spec that seem like they could also be broadly applicable to others.
- I specifically do not want to add bloat or complexity for something I think is very simple, so any complexity increases will need good justification
- At the same time, I do not want decoding to be too rigid, so additional fields should be allowed, meaning you can add your own fields without impacting validation. It's not guaranteed that other implementers of this format will be okay with these extra fields, but this library always will.
- At first, I am not focusing on migration, since I do not believe this to be any sort of runtime / load-bearing format. It is for storing your own information, and importing/exporting. It will have a clear version history here on GitHub.
This format is for humans. Files in this format represent the experiences, education, and skills of real human beings. As a result, I believe a human should be in the loop for any interaction with this format. That being said, I know AI will be used to interact with this, and that's unavoidable. Because of this, consumers of this format must do their own KYC / IDV to ensure they are dealing with a real person. That should always be required for acceptance anyways, so I don't believe this to be a huge issue, but it needed mentioning. If you are using AI to create fake experience files, I am disappointed in you. If you are trying to use this format to represent capabilities or experiences of an AI agent, I am even more disappointed in you.
- install needed crates
cargo install cargo-msrv --locked
cargo install cargo-license
cargo install cargo-release- run lints:
cargo fmt
- verify msrv:
cargo msrv find - verify licences of deps:
cargo license - check Rust API Guidelines
- check docs:
cargo doc --open --all-features - dry run release process:
cargo release patch(or a different release level)
- commit any uncommitted changes (should only be schema if anything)
- once all ok, release for real:
cargo release --execute