commit bc51d57fe7873283e2404f9e308af36749407d25 Author: dozens Date: Tue Dec 5 22:51:32 2023 -0700 first commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a3ed5cd --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +resume.toml +resume.pdf diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..e4917a4 --- /dev/null +++ b/LICENSE @@ -0,0 +1,8 @@ +POSTCARD LICENSE + +Copyright 2023-12-05 christopher.p.brown@gmail.com + +You are free to use this software under the following conditions: + +1. SEND THE AUTHOR A NICE POSTCARD + diff --git a/README.md b/README.md new file mode 100644 index 0000000..a6b6bae --- /dev/null +++ b/README.md @@ -0,0 +1,46 @@ +# resume.toml + +## Movitation + +1. Keep your resume in plain, organized, highly-editable text. + +2. Separation of concerns: write content first. worry about formatting later. + +3. Version control: keep your resume text in a git repository. track your changes. create new branches for large edits or for tailoring your resume while applying to a specific role. + +## About + +This is a resume builder. + +Data is stored in `resume.toml`. + +It is validated against jsonresume's [json-schema][4]. + +And it is extracted as json with [taplo][1]. + +[1]: https://taplo.tamasfe.dev/ + +[4]: https://github.com/jsonresume/resume-schema/blob/master/schema.json + +It is converted to [groff][2] markup +via [mustache][3] templates, +and then exported to pdf. + +[2]: https://www.gnu.org/software/groff/manual/groff.html + +[3]: https://mustache.github.io/ + +## You Will Need + +1. GNU groff version 1.23.0: for typesetting and pdf output (with the ms macro package; it *should* be installed anywhere groff is installed) +2. mustache 4.2.0: for templates +3. taplo 0.8.1: toml toolkit. Provides conversion to JSON, formatting, and validation. +4. jq 1.6: json queries +5. (optional) just 1.14.0: just a command runner + +## Frequently Questioned Answers + +Why TOML? +: Because YAML is a drag. +: Because JSON, while highly serializable, is highly annoying to write with its strict, verbose syntax. +: Because while I love GNU Recfiles, they are just a little too annoying to query diff --git a/example.pdf b/example.pdf new file mode 100644 index 0000000..8c30ed9 Binary files /dev/null and b/example.pdf differ diff --git a/example.toml b/example.toml new file mode 100644 index 0000000..e075f07 --- /dev/null +++ b/example.toml @@ -0,0 +1,117 @@ +"$schema" = "https://raw.githubusercontent.com/jsonresume/resume-schema/v1.0.0/schema.json" + +[basics] +name = "Richard Hendriks" +label = "Programmer" +image = "" +email = "richard.hendriks@mail.com" +phone = "(912) 555-4321" +url = "http://richardhendricks.example.com" +summary = 'Richard hails from Tulsa. He has earned degrees from the University of Oklahoma and Stanford. (Go Sooners and Cardinal!) Before starting Pied Piper, he worked for Hooli as a part time software developer. While his work focuses on applied information theory, mostly optimizing lossless compression schema of both the length-limited and adaptive variants, his non-work interests range widely, everything from quantum computing to chaos theory. He could tell you about it, but THAT would NOT be a "length-limited" conversation!' + +[basics.location] +address = "2712 Broadway St" +postalCode = "CA 94115" +city = "San Francisco" +countryCode = "US" +region = "California" + +[[basics.profiles]] +network = "Twitter" +username = "neutralthoughts" +url = "" + +[[basics.profiles]] +network = "SoundCloud" +username = "dandymusicnl" +url = "https://soundcloud.example.com/dandymusicnl" + +[[work]] +name = "Pied Piper" +location = "Palo Alto, CA" +description = "Awesome compression company" +position = "CEO/President" +url = "http://piedpiper.example.com" +startDate = "2013-12-01" +endDate = "2014-12-01" +summary = "Pied Piper is a multi-platform technology based on a proprietary universal compression algorithm that has consistently fielded high Weisman Scores™ that are not merely competitive, but approach the theoretical limit of lossless compression." +highlights = [ + "Build an algorithm for artist to detect if their music was violating copy right infringement laws", + "Successfully won Techcrunch Disrupt", + "Optimized an algorithm that holds the current world record for Weisman Scores", +] + +[[volunteer]] +organization = "CoderDojo" +position = "Teacher" +url = "http://coderdojo.example.com/" +startDate = "2012-01-01" +endDate = "2013-01-01" +summary = "Global movement of free coding clubs for young people." +highlights = ["Awarded 'Teacher of the Month'"] + +[[education]] +institution = "University of Oklahoma" +url = "https://www.ou.edu/" +area = "Information Technology" +studyType = "Bachelor" +startDate = "2011-06-01" +endDate = "2014-01-01" +score = "4.0" +courses = ["DB1101 - Basic SQL", "CS2011 - Java Introduction"] + +[[awards]] +title = "Digital Compression Pioneer Award" +date = "2014-11-01" +awarder = "Techcrunch" +summary = "There is no spoon." + +[[publications]] +name = "Video compression for 3d media" +publisher = "Hooli" +releaseDate = "2014-10-01" +url = "http://en.wikipedia.org/wiki/Silicon_Valley_(TV_series)" +summary = "Innovative middle-out compression algorithm that changes the way we store data." + +[[skills]] +name = "Web Development" +level = "Master" +keywords = ["HTML", "CSS", "Javascript"] + +[[skills]] +name = "Compression" +level = "Master" +keywords = ["Mpeg", "MP4", "GIF"] + +[[languages]] +language = "English" +fluency = "Native speaker" + +[[interests]] +name = "Wildlife" +keywords = ["Ferrets", "Unicorns"] + +[[references]] +name = "Erlich Bachman" +reference = "It is my pleasure to recommend Richard, his performance working as a consultant for Main St. Company proved that he will be a valuable addition to any company." + +[[projects]] +name = "Miss Direction" +description = "A mapping engine that misguides you" +highlights = [ + "Won award at AIHacks 2016", + "Built by all women team of newbie programmers", + "Using modern technologies such as GoogleMaps, Chrome Extension and Javascript", +] +keywords = ["GoogleMaps", "Chrome Extension", "Javascript"] +startDate = "2016-08-24" +endDate = "2016-08-24" +url = "missdirection.example.com" +roles = ["Team lead", "Designer"] +entity = "Smoogle" +type = "application" + +[meta] +canonical = "https://raw.githubusercontent.com/jsonresume/resume-schema/master/sample.resume.json" +version = "v1.0.0" +lastModified = "2017-12-24T15:53:00" diff --git a/justfile b/justfile new file mode 100644 index 0000000..3a40867 --- /dev/null +++ b/justfile @@ -0,0 +1,30 @@ +# show all recipes +default: + just --list --unsorted + +# convert to json +json: + taplo get -f resume.toml -o json + +# format toml +fmt: + taplo fmt resume.toml + +# validate toml +validate: + taplo lint resume.toml + +# make groff +groff: + just json | mustache - resume.template + +# make pdf +pdf: + just groff | groff -ms -t -Tpdf > resume.pdf + +# example +example: + taplo get -f example.toml -o json \ + | mustache - resume.template \ + | groff -ms -t -Tpdf \ + > example.pdf diff --git a/resume.template b/resume.template new file mode 100644 index 0000000..640e51c --- /dev/null +++ b/resume.template @@ -0,0 +1,130 @@ +.EH '''' +.OH '''' +.nr HM .5i +.nr FM .5i +.TS H +center tab(;); +cbx s +c s +c s +cfI s. +.TH +./" ============ +./" == HEADER == +./" ============ +{{#basics}} +{{name}} +{{email}} - {{phone}} +{{#profiles}} {{{url}}} {{/profiles}} +.sp 1 +T{ +{{{summary}}} +T} +{{/basics}} +.sp 1 +. +. +. +./" ========== +./" == WORK == +./" ========== +.T& +lbv1 s +- - +{{#work}} +lb r +l r +{{#highlights}} +l s +{{/highlights}} +{{/work}} +l l. +Experience +.ds +{{#work}} +{{{name}}};{{{location}}} +{{{position}}};{{startDate}}-{{endDate}} +{{#highlights}} +T{ +.IP \(bu +{{{.}}} +T} +{{/highlights}} +.de +.sp 1 +{{/work}} +; +. +. +. +.\" ============ +.\" == SKILLS == +.\" ============ +.T& +lb s +- - +{{#skills}} +l s +{{/skills}} +l s. +Skills +{{#skills}} +{{{name}}}: {{#keywords}} {{{.}}} {{/keywords}} +{{/skills}} +; +. +. +. +.\" ============ +.\" == AWARDS == +.\" ============ +.T& +lb s +- - +{{#awards}} +l r +{{/awards}} +l r. +Awards +{{#awards}} +{{title}}, {{awarder}};{{date}} +{{/awards}} +; +. +. +. +.\" =============== +.\" == EDUCATION == +.\" =============== +.T& +lb s +- - +{{#education}} +l r +{{/education}} +l l. +Education +{{#education}} +{{institution}}, {{area}};{{startDate}}-{{endDate}} +{{/education}} +; +. +. +. +.\" =============== +.\" == INTERESTS == +.\" =============== +.T& +lb s +- - +{{#interests}} +l s +{{/interests}} +l s. +Interests +{{#interests}} +{{name}}: {{#keywords}} {{{.}}} {{/keywords}} +{{/interests}} +; +.TE + diff --git a/schema.json b/schema.json new file mode 100644 index 0000000..75e7a56 --- /dev/null +++ b/schema.json @@ -0,0 +1,498 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "additionalProperties": false, + "definitions": { + "iso8601": { + "type": "string", + "description": "Similar to the standard date type, but each section after the year is optional. e.g. 2014-06-29 or 2023-04", + "pattern": "^([1-2][0-9]{3}-[0-1][0-9]-[0-3][0-9]|[1-2][0-9]{3}-[0-1][0-9]|[1-2][0-9]{3})$" + } + }, + "properties": { + "$schema": { + "type": "string", + "description": "link to the version of the schema that can validate the resume", + "format": "uri" + }, + "basics": { + "type": "object", + "additionalProperties": true, + "properties": { + "name": { + "type": "string" + }, + "label": { + "type": "string", + "description": "e.g. Web Developer" + }, + "image": { + "type": "string", + "description": "URL (as per RFC 3986) to a image in JPEG or PNG format" + }, + "email": { + "type": "string", + "description": "e.g. thomas@gmail.com", + "format": "email" + }, + "phone": { + "type": "string", + "description": "Phone numbers are stored as strings so use any format you like, e.g. 712-117-2923" + }, + "url": { + "type": "string", + "description": "URL (as per RFC 3986) to your website, e.g. personal homepage", + "format": "uri" + }, + "summary": { + "type": "string", + "description": "Write a short 2-3 sentence biography about yourself" + }, + "location": { + "type": "object", + "additionalProperties": true, + "properties": { + "address": { + "type": "string", + "description": "To add multiple address lines, use \n. For example, 1234 Glücklichkeit Straße\nHinterhaus 5. Etage li." + }, + "postalCode": { + "type": "string" + }, + "city": { + "type": "string" + }, + "countryCode": { + "type": "string", + "description": "code as per ISO-3166-1 ALPHA-2, e.g. US, AU, IN" + }, + "region": { + "type": "string", + "description": "The general region where you live. Can be a US state, or a province, for instance." + } + } + }, + "profiles": { + "type": "array", + "description": "Specify any number of social networks that you participate in", + "additionalItems": false, + "items": { + "type": "object", + "additionalProperties": true, + "properties": { + "network": { + "type": "string", + "description": "e.g. Facebook or Twitter" + }, + "username": { + "type": "string", + "description": "e.g. neutralthoughts" + }, + "url": { + "type": "string", + "description": "e.g. http://twitter.example.com/neutralthoughts", + "format": "uri" + } + } + } + } + } + }, + "work": { + "type": "array", + "additionalItems": false, + "items": { + "type": "object", + "additionalProperties": true, + "properties": { + "name": { + "type": "string", + "description": "e.g. Facebook" + }, + "location": { + "type": "string", + "description": "e.g. Menlo Park, CA" + }, + "description": { + "type": "string", + "description": "e.g. Social Media Company" + }, + "position": { + "type": "string", + "description": "e.g. Software Engineer" + }, + "url": { + "type": "string", + "description": "e.g. http://facebook.example.com", + "format": "uri" + }, + "startDate": { + "$ref": "#/definitions/iso8601" + }, + "endDate": { + "$ref": "#/definitions/iso8601" + }, + "summary": { + "type": "string", + "description": "Give an overview of your responsibilities at the company" + }, + "highlights": { + "type": "array", + "description": "Specify multiple accomplishments", + "additionalItems": false, + "items": { + "type": "string", + "description": "e.g. Increased profits by 20% from 2011-2012 through viral advertising" + } + } + } + } + }, + "volunteer": { + "type": "array", + "additionalItems": false, + "items": { + "type": "object", + "additionalProperties": true, + "properties": { + "organization": { + "type": "string", + "description": "e.g. Facebook" + }, + "position": { + "type": "string", + "description": "e.g. Software Engineer" + }, + "url": { + "type": "string", + "description": "e.g. http://facebook.example.com", + "format": "uri" + }, + "startDate": { + "$ref": "#/definitions/iso8601" + }, + "endDate": { + "$ref": "#/definitions/iso8601" + }, + "summary": { + "type": "string", + "description": "Give an overview of your responsibilities at the company" + }, + "highlights": { + "type": "array", + "description": "Specify accomplishments and achievements", + "additionalItems": false, + "items": { + "type": "string", + "description": "e.g. Increased profits by 20% from 2011-2012 through viral advertising" + } + } + } + } + }, + "education": { + "type": "array", + "additionalItems": false, + "items": { + "type": "object", + "additionalProperties": true, + "properties": { + "institution": { + "type": "string", + "description": "e.g. Massachusetts Institute of Technology" + }, + "url": { + "type": "string", + "description": "e.g. http://facebook.example.com", + "format": "uri" + }, + "area": { + "type": "string", + "description": "e.g. Arts" + }, + "studyType": { + "type": "string", + "description": "e.g. Bachelor" + }, + "startDate": { + "$ref": "#/definitions/iso8601" + }, + "endDate": { + "$ref": "#/definitions/iso8601" + }, + "score": { + "type": "string", + "description": "grade point average, e.g. 3.67/4.0" + }, + "courses": { + "type": "array", + "description": "List notable courses/subjects", + "additionalItems": false, + "items": { + "type": "string", + "description": "e.g. H1302 - Introduction to American history" + } + } + } + } + }, + "awards": { + "type": "array", + "description": "Specify any awards you have received throughout your professional career", + "additionalItems": false, + "items": { + "type": "object", + "additionalProperties": true, + "properties": { + "title": { + "type": "string", + "description": "e.g. One of the 100 greatest minds of the century" + }, + "date": { + "$ref": "#/definitions/iso8601" + }, + "awarder": { + "type": "string", + "description": "e.g. Time Magazine" + }, + "summary": { + "type": "string", + "description": "e.g. Received for my work with Quantum Physics" + } + } + } + }, + "certificates": { + "type": "array", + "description": "Specify any certificates you have received throughout your professional career", + "additionalItems": false, + "items": { + "type": "object", + "additionalProperties": true, + "properties": { + "name": { + "type": "string", + "description": "e.g. Certified Kubernetes Administrator" + }, + "date": { + "$ref": "#/definitions/iso8601" + }, + "url": { + "type": "string", + "description": "e.g. http://example.com", + "format": "uri" + }, + "issuer": { + "type": "string", + "description": "e.g. CNCF" + } + } + } + }, + "publications": { + "type": "array", + "description": "Specify your publications through your career", + "additionalItems": false, + "items": { + "type": "object", + "additionalProperties": true, + "properties": { + "name": { + "type": "string", + "description": "e.g. The World Wide Web" + }, + "publisher": { + "type": "string", + "description": "e.g. IEEE, Computer Magazine" + }, + "releaseDate": { + "$ref": "#/definitions/iso8601" + }, + "url": { + "type": "string", + "description": "e.g. http://www.computer.org.example.com/csdl/mags/co/1996/10/rx069-abs.html", + "format": "uri" + }, + "summary": { + "type": "string", + "description": "Short summary of publication. e.g. Discussion of the World Wide Web, HTTP, HTML." + } + } + } + }, + "skills": { + "type": "array", + "description": "List out your professional skill-set", + "additionalItems": false, + "items": { + "type": "object", + "additionalProperties": true, + "properties": { + "name": { + "type": "string", + "description": "e.g. Web Development" + }, + "level": { + "type": "string", + "description": "e.g. Master" + }, + "keywords": { + "type": "array", + "description": "List some keywords pertaining to this skill", + "additionalItems": false, + "items": { + "type": "string", + "description": "e.g. HTML" + } + } + } + } + }, + "languages": { + "type": "array", + "description": "List any other languages you speak", + "additionalItems": false, + "items": { + "type": "object", + "additionalProperties": true, + "properties": { + "language": { + "type": "string", + "description": "e.g. English, Spanish" + }, + "fluency": { + "type": "string", + "description": "e.g. Fluent, Beginner" + } + } + } + }, + "interests": { + "type": "array", + "additionalItems": false, + "items": { + "type": "object", + "additionalProperties": true, + "properties": { + "name": { + "type": "string", + "description": "e.g. Philosophy" + }, + "keywords": { + "type": "array", + "additionalItems": false, + "items": { + "type": "string", + "description": "e.g. Friedrich Nietzsche" + } + } + } + } + }, + "references": { + "type": "array", + "description": "List references you have received", + "additionalItems": false, + "items": { + "type": "object", + "additionalProperties": true, + "properties": { + "name": { + "type": "string", + "description": "e.g. Timothy Cook" + }, + "reference": { + "type": "string", + "description": "e.g. Joe blogs was a great employee, who turned up to work at least once a week. He exceeded my expectations when it came to doing nothing." + } + } + } + }, + "projects": { + "type": "array", + "description": "Specify career projects", + "additionalItems": false, + "items": { + "type": "object", + "additionalProperties": true, + "properties": { + "name": { + "type": "string", + "description": "e.g. The World Wide Web" + }, + "description": { + "type": "string", + "description": "Short summary of project. e.g. Collated works of 2017." + }, + "highlights": { + "type": "array", + "description": "Specify multiple features", + "additionalItems": false, + "items": { + "type": "string", + "description": "e.g. Directs you close but not quite there" + } + }, + "keywords": { + "type": "array", + "description": "Specify special elements involved", + "additionalItems": false, + "items": { + "type": "string", + "description": "e.g. AngularJS" + } + }, + "startDate": { + "$ref": "#/definitions/iso8601" + }, + "endDate": { + "$ref": "#/definitions/iso8601" + }, + "url": { + "type": "string", + "format": "uri", + "description": "e.g. http://www.computer.org/csdl/mags/co/1996/10/rx069-abs.html" + }, + "roles": { + "type": "array", + "description": "Specify your role on this project or in company", + "additionalItems": false, + "items": { + "type": "string", + "description": "e.g. Team Lead, Speaker, Writer" + } + }, + "entity": { + "type": "string", + "description": "Specify the relevant company/entity affiliations e.g. 'greenpeace', 'corporationXYZ'" + }, + "type": { + "type": "string", + "description": " e.g. 'volunteering', 'presentation', 'talk', 'application', 'conference'" + } + } + } + }, + "meta": { + "type": "object", + "description": "The schema version and any other tooling configuration lives here", + "additionalProperties": true, + "properties": { + "canonical": { + "type": "string", + "description": "URL (as per RFC 3986) to latest version of this document", + "format": "uri" + }, + "version": { + "type": "string", + "description": "A version field which follows semver - e.g. v1.0.0" + }, + "lastModified": { + "type": "string", + "description": "Using ISO 8601 with YYYY-MM-DDThh:mm:ss" + } + } + } + }, + "title": "Resume Schema", + "type": "object" +}