UNPKG

21.4 kBMarkdownView Raw
1HackMyResume
2===
3
4[![Latest release][img-release]][latest-release]
5[![Build status (MASTER)][img-master]][travis-url-master]
6[![Build status (DEV)][img-dev]][travis-url-dev]
7[![Join the chat at https://gitter.im/hacksalot/HackMyResume][badge]][gh]
8
9*Create polished résumés and CVs in multiple formats from your command line or
10shell. Author in clean Markdown and JSON, export to Word, HTML, PDF, LaTeX,
11plain text, and other arbitrary formats. Fight the power, save trees. Compatible
12with [FRESH][fresca] and [JRS][6] resumes.*
13
14![](assets/hmr_build.png)
15
16HackMyResume is a dev-friendly, local-only Swiss Army knife for resumes and CVs.
17Use it to:
18
191. **Generate** HTML, Markdown, LaTeX, MS Word, PDF, plain text, JSON, XML,
20YAML, print, smoke signal, carrier pigeon, and other arbitrary-format resumes
21and CVs, from a single source of truth—without violating DRY.
222. **Analyze** your resume for keyword density, gaps/overlaps, and other
23metrics.
243. **Convert** resumes between [FRESH][fresca] and [JSON Resume][6] formats.
254. **Validate** resumes against either format.
26
27HackMyResume is built with Node.js and runs on recent versions of OS X, Linux,
28or Windows. View the [FAQ](FAQ.md).
29
30![](assets/hmr_analyze.png)
31
32## Features
33
34- OS X, Linux, and Windows.
35- Choose from dozens of FRESH or JSON Resume themes.
36- Private, local-only resume authoring and analysis.
37- Analyze your resume for keywords, gaps, and other metrics.
38- Store your resume data as a durable, versionable JSON or YAML document.
39- Generate polished resumes in multiple formats without violating [DRY][dry].
40- Output to HTML, Markdown, LaTeX, PDF, MS Word, JSON, YAML, plain text, or XML.
41- Validate resumes against the FRESH or JSON Resume schema.
42- Support for multiple input and output resumes.
43- Convert between FRESH and JSON Resume resumes.
44- Use from your command line or [desktop][7].
45- Free and open-source through the MIT license.
46- Updated daily / weekly. Contributions are [welcome](CONTRIBUTING.md).
47
48## Install
49
50Install the latest stable version of HackMyResume with NPM:
51
52```bash
53[sudo] npm install hackmyresume -g
54```
55
56Alternately, install the latest bleeding-edge version (updated daily):
57
58```bash
59[sudo] npm install hacksalot/hackmyresume#dev -g
60```
61
62## Installing PDF Support (optional)
63
64HackMyResume tries not to impose a specific PDF engine requirement on
65the user, but will instead work with whatever PDF engines you have installed.
66
67Currently, HackMyResume's PDF generation requires one of [Phantom.js][2],
68[wkhtmltopdf][3], or [WeasyPrint][11] to be installed on your system and the
69corresponding binary to be accessible on your PATH. This is an optional
70requirement for users who care about PDF formats. If you don't care about PDF
71formats, skip this step.
72
73## Installing Themes
74
75HackMyResume supports both [FRESH][fresh-themes] and [JSON Resume][jrst]-style
76résumé themes.
77
78- FRESH themes currently come preinstalled with HackMyResume.
79- JSON Resume themes can be installed from NPM, GitHub, or manually.
80
81To install a JSON Resume theme, just `cd` to the folder where you want to store
82your themes and run one of:
83
84```bash
85# Install with NPM
86npm install jsonresume-theme-[theme-name]
87
88# Install with GitHub
89git clone https://github.com/[user-or-org]/[repo-name]
90```
91
92Then when you're ready to generate your resume, just reference the location of
93the theme folder as you installed it:
94
95```bash
96hackmyresume build resume.json TO out/resume.all -t node_modules/jsonresume-theme-classy
97```
98
99Note: You can use install themes anywhere on your file system. You don't need a
100package.json or other NPM/Node infrastructure.
101
102## Getting Started
103
104To use HackMyResume you'll need to create a valid resume in either
105[FRESH][fresca] or [JSON Resume][6] format. Then you can start using the command
106line tool. There are five basic commands you should be aware of:
107
108- **build** generates resumes in HTML, Word, Markdown, PDF, and other formats.
109Use it when you need to submit, upload, print, or email resumes in specific
110formats.
111
112 ```bash
113 # hackmyresume build <INPUTS...> TO <OUTPUTS...> [-t THEME]
114 hackmyresume build resume.json TO out/resume.all
115 hackmyresume build r1.json r2.json TO out/rez.html out/rez.md foo/rez.all
116 ```
117
118- **new** creates a new resume in FRESH or JSON Resume format.
119
120 ```bash
121 # hackmyresume new <OUTPUTS...> [-f <FORMAT>]
122 hackmyresume new resume.json
123 hackmyresume new resume.json -f fresh
124 hackmyresume new r1.json r2.json -f jrs
125 ```
126
127- **analyze** inspects your resume for keywords, duration, and other metrics.
128
129 ```bash
130 # hackmyresume analyze <INPUTS...>
131 hackmyresume analyze resume.json
132 hackmyresume analyze r1.json r2.json
133 ```
134
135- **convert** converts your source resume between FRESH and JSON Resume
136formats. Use it to convert between the two formats to take advantage of tools
137and services.
138
139 ```bash
140 # hackmyresume convert <INPUTS...> TO <OUTPUTS...>
141 hackmyresume convert resume.json TO resume-jrs.json
142 hackmyresume convert 1.json 2.json 3.json TO out/1.json out/2.json out/3.json
143 ```
144
145- **validate** validates the specified resume against either the FRESH or JSON
146Resume schema. Use it to make sure your resume data is sufficient and complete.
147
148 ```bash
149 # hackmyresume validate <INPUTS...>
150 hackmyresume validate resume.json
151 hackmyresume validate r1.json r2.json r3.json
152 ```
153
154- **peek** echoes your resume or any field, property, or object path on your
155resume to standard output.
156
157 ```bash
158 # hackmyresume peek <INPUTS...> [OBJECT-PATH]
159 hackmyresume peek rez.json # Echo the whole resume
160 hackmyresume peek rez.json info.brief # Echo the "info.brief" field
161 hackmyresume peek rez.json employment.history[1] # Echo the 1st job
162 hackmyresume peek rez.json rez2.json info.brief # Compare value
163 ```
164
165## Supported Output Formats
166
167HackMyResume supports these output formats:
168
169Output Format | Ext | Notes
170------------- | --- | -----
171HTML | .html | A standard HTML 5 + CSS resume format that can be viewed in a browser, deployed to a website, etc.
172Markdown | .md | A structured Markdown document that can be used as-is or used to generate HTML.
173LaTeX | .tex | A structured LaTeX document (or collection of documents) that can be processed with pdflatex, xelatex, and similar tools.
174MS Word | .doc | A Microsoft Word office document (XML-driven; WordProcessingML).
175Adobe Acrobat (PDF) | .pdf | A binary PDF document driven by an HTML theme (through wkhtmltopdf).
176plain text | .txt | A formatted plain text document appropriate for emails or copy-paste.
177JSON | .json | A JSON representation of the resume.
178YAML | .yml | A YAML representation of the resume.
179RTF | .rtf | Forthcoming.
180Textile | .textile | Forthcoming.
181image | .png, .bmp | Forthcoming.
182
183## Use
184
185Assuming you've got a JSON-formatted resume handy, generating resumes in
186different formats and combinations is easy. Just run:
187
188```bash
189hackmyresume build <inputs> to <outputs> [-t theme].
190```
191
192Where `<INPUTS>` is one or more .json resume files, separated by spaces;
193`<OUTPUTS>` is one or more destination resumes, and `<THEME>` is the desired
194theme (default to Modern). For example:
195
196```bash
197# Generate all resume formats (HTML, PDF, DOC, TXT, YML, etc.)
198hackmyresume build resume.json TO out/resume.all -t modern
199
200# Generate a specific resume format
201hackmyresume build resume.json TO out/resume.html
202hackmyresume build resume.json TO out/resume.pdf
203hackmyresume build resume.json TO out/resume.md
204hackmyresume build resume.json TO out/resume.doc
205hackmyresume build resume.json TO out/resume.json
206hackmyresume build resume.json TO out/resume.txt
207hackmyresume build resume.json TO out/resume.yml
208
209# Specify 2 inputs and 3 outputs
210hackmyresume build in1.json in2.json TO out.html out.doc out.pdf
211```
212
213You should see something to the effect of:
214
215```
216*** HackMyResume v1.4.0 ***
217Reading JSON resume: foo/resume.json
218Applying MODERN Theme (7 formats)
219Generating HTML resume: out/resume.html
220Generating TXT resume: out/resume.txt
221Generating DOC resume: out/resume.doc
222Generating PDF resume: out/resume.pdf
223Generating JSON resume: out/resume.json
224Generating MARKDOWN resume: out/resume.md
225Generating YAML resume: out/resume.yml
226```
227
228## Advanced
229
230### Applying a theme
231
232HackMyResume can work with any FRESH or JSON Resume theme (the latter must be
233installed first). To specify a theme when generating your resume, use the `-t`
234or `--theme` parameter:
235
236```bash
237hackmyresume build resume.json TO out/rez.all -t [theme]
238```
239
240The `[theme]` parameter can be the name of a predefined theme OR the path to any
241FRESH or JSON Resume theme folder:
242
243```bash
244hackmyresume build resume.json TO out/rez.all -t modern
245hackmyresume build resume.json TO OUT.rez.all -t ../some-folder/my-custom-theme/
246hackmyresume build resume.json TO OUT.rez.all -t node_modules/jsonresume-theme-classy
247```
248
249FRESH themes are currently pre-installed with HackMyResume. JSON Resume themes
250can be installed prior to use:
251
252```bash
253# Install a JSON Resume theme into a local node_modules subfolder:
254npm install jsonresume-theme-[name]
255# Use it with HackMyResume
256hackmyresume build resume.json -t node_modules/jsonresume-theme-[name]
257```
258
259As of v1.6.0, available predefined FRESH themes are `positive`, `modern`,
260`compact`, `minimist`, and `hello-world`. For a list of JSON Resume themes,
261check the [NPM Registry](https://www.npmjs.com/search?q=jsonresume-theme).
262
263### Merging resumes
264
265You can **merge multiple resumes together** by specifying them in order from
266most generic to most specific:
267
268```bash
269# Merge specific.json onto base.json and generate all formats
270hackmyresume build base.json specific.json TO resume.all
271```
272
273This can be useful for overriding a base (generic) resume with information from
274a specific (targeted) resume. For example, you might override your generic
275catch-all "software developer" resume with specific details from your targeted
276"game developer" resume, or combine two partial resumes into a "complete"
277resume. Merging follows conventional [extend()][9]-style behavior and there's
278no arbitrary limit to how many resumes you can merge:
279
280```bash
281hackmyresume build in1.json in2.json in3.json in4.json TO out.html out.doc
282Reading JSON resume: in1.json
283Reading JSON resume: in2.json
284Reading JSON resume: in3.json
285Reading JSON resume: in4.json
286Merging in4.json onto in3.json onto in2.json onto in1.json
287Generating HTML resume: out.html
288Generating WORD resume: out.doc
289```
290
291### Multiple targets
292
293You can specify **multiple output targets** and HackMyResume will build them:
294
295```bash
296# Generate out1.doc, out1.pdf, and foo.txt from me.json.
297hackmyresume build me.json TO out1.doc out1.pdf foo.txt
298```
299
300### Using .all
301
302The special `.all` extension tells HackMyResume to generate all supported output
303formats for the given resume. For example, this...
304
305```bash
306# Generate all resume formats (HTML, PDF, DOC, TXT, etc.)
307hackmyresume build me.json TO out/resume.all
308```
309
310..tells HackMyResume to read `me.json` and generate `out/resume.md`,
311`out/resume.doc`, `out/resume.html`, `out/resume.txt`, `out/resume.pdf`, and
312`out/resume.json`.
313
314### Building PDFs
315
316*Users who don't care about PDFs can turn off PDF generation across all themes
317and formats with the `--pdf none` switch.*
318
319HackMyResume takes a unique approach to PDF generation. Instead of enforcing
320a specific PDF engine on users, HackMyResume will attempt to work with whatever
321PDF engine you have installed through the engine's command-line interface (CLI).
322Currently that means any of...
323
324- [wkhtmltopdf][3]
325- [Phantom.js][2]
326- [WeasyPrint][11]
327
328..with support for other engines planned in the future. But for now, **one or
329more of these engines must be installed and accessible on your PATH in order
330to generate PDF resumes with HackMyResume**. That means you should be able to
331invoke either of these tools directly from your shell or terminal without error:
332
333```bash
334wkhtmltopdf input.html output.pdf
335phantomjs script.js input.html output.pdf
336weasyprint input.html output.pdf
337```
338
339Assuming you've installed one or both of these engines on your system, you can
340tell HackMyResume which flavor of PDF generation to use via the `--pdf` option
341(`-p` for short):
342
343```bash
344hackmyresume build resume.json TO out.all --pdf phantom
345hackmyresume build resume.json TO out.all --pdf wkhtmltopdf
346hackmyresume build resume.json TO out.all --pdf weasyprint
347hackmyresume build resume.json TO out.all --pdf none
348```
349
350### Analyzing
351
352HackMyResume can analyze your resume for keywords, employment gaps, and other
353metrics. Run:
354
355```bash
356hackmyresume analyze <my-resume>.json
357```
358
359Depending on the HackMyResume version, you should see output similar to:
360
361
362```
363*** HackMyResume v1.6.0 ***
364Reading resume: resume.json
365Analyzing FRESH resume: resume.json
366
367SECTIONS (10):
368
369 employment: 12
370 education: 2
371 service: 1
372 skills: 8
373 writing: 1
374 recognition: 0
375 social: 4
376 interests: 2
377 references: 1
378 languages: 2
379
380COVERAGE (61.1%):
381
382 Total Days: 6034
383 Employed: 3688
384 Gaps: 8 [31, 1065, 273, 153, 671, 61, 61, 31]
385 Overlaps: 1 [243]
386
387KEYWORDS (61):
388
389 Node.js: 6 mentions
390 JavaScript: 9 mentions
391 SQL Server: 3 mentions
392 Visual Studio: 6 mentions
393 Web API: 1 mentions
394 N-tier / 3-tier: 1 mentions
395 HTML 5: 1 mentions
396 JavaScript: 6 mentions
397 CSS: 2 mentions
398Sass / LESS / SCSS: 1 mentions
399 LAMP: 3 mentions
400 WISC: 1 mentions
401 HTTP: 21 mentions
402 JSON: 1 mentions
403 XML: 2 mentions
404 REST: 1 mentions
405 WebSockets: 2 mentions
406 Backbone.js: 3 mentions
407 Angular.js: 1 mentions
408 Node.js: 4 mentions
409 NPM: 1 mentions
410 Bower: 1 mentions
411 Grunt: 2 mentions
412 Gulp: 1 mentions
413 jQuery: 2 mentions
414 Bootstrap: 3 mentions
415 Underscore.js: 1 mentions
416 PhantomJS: 1 mentions
417 CoffeeScript: 1 mentions
418 Python: 11 mentions
419 Perl: 4 mentions
420 PHP: 7 mentions
421 MySQL: 12 mentions
422 PostgreSQL: 4 mentions
423 NoSQL: 2 mentions
424 Apache: 2 mentions
425 AWS: 2 mentions
426 EC2: 2 mentions
427 RDS: 3 mentions
428 S3: 1 mentions
429 Azure: 1 mentions
430 Rackspace: 1 mentions
431 C++: 23 mentions
432 C++ 11: 1 mentions
433 Boost: 1 mentions
434 Xcode: 2 mentions
435 gcc: 1 mentions
436 OO&AD: 1 mentions
437 .NET: 20 mentions
438 Unity 5: 2 mentions
439 Mono: 3 mentions
440 MonoDevelop: 1 mentions
441 Xamarin: 1 mentions
442 TOTAL: 180 mentions
443```
444
445### Validating
446
447HackMyResume can also validate your resumes against either the [FRESH /
448FRESCA][fresca] or [JSON Resume][6] formats. To validate one or more existing
449resumes, use the `validate` command:
450
451```bash
452# Validate myresume.json against either the FRESH or JSON Resume schema.
453hackmyresume validate resumeA.json resumeB.json
454```
455
456HackMyResume will validate each specified resume in turn:
457
458```bash
459*** HackMyResume v1.6.0 ***
460Validating JSON resume: resumeA.json (INVALID)
461Validating JSON resume: resumeB.json (VALID)
462```
463
464### Converting
465
466HackMyResume can convert between the [FRESH][fresca] and [JSON Resume][6]
467formats. Just run:
468
469```bash
470hackmyresume convert <INPUTS> <OUTPUTS>
471```
472
473where <INPUTS> is one or more resumes in FRESH or JSON Resume format, and
474<OUTPUTS> is a corresponding list of output file names. HackMyResume will
475autodetect the format (FRESH or JRS) of each input resume and convert it to the
476other format (JRS or FRESH).
477
478### File-based Options
479
480You can pass options into HackMyResume via an external options or ".hackmyrc"
481file with the `--options` or `-o` switch:
482
483```bash
484hackmyresume build resume.json -o path/to/options.json
485```
486
487The options file can contain any documented HackMyResume option, including
488`theme`, `silent`, `debug`, `pdf`, `css`, and other settings.
489
490```json
491{
492 "theme": "compact",
493
494 "sectionTitles": {
495 "employment": "Work"
496 },
497
498 "wkhtmltopdf": {
499 "margin-top": "20mm"
500 }
501}
502```
503
504If an option is specified on both the command line and in an external options
505file, the command-line option wins.
506
507```bash
508# path/to/options.json specifes the POSITIVE theme
509# -t parameter specifies the COMPACT theme
510# The -t parameter wins.
511hackmyresume build resume.json -o path/to/options.json -t compact
512> Reading resume: resume.json
513> Applying COMPACT theme (7 formats)
514```
515
516### Prettifying
517
518HackMyResume applies [js-beautify][10]-style HTML prettification by default to
519HTML-formatted resumes. To disable prettification, the `--no-prettify` or `-n`
520flag can be used:
521
522```bash
523hackmyresume build resume.json out.all --no-prettify
524```
525
526### Silent Mode
527
528Use `-s` or `--silent` to run in silent mode:
529
530```bash
531hackmyresume build resume.json -o someFile.all -s
532hackmyresume build resume.json -o someFile.all --silent
533```
534
535### Debug Mode
536
537Use `-d` or `--debug` to force HMR to emit a call stack when errors occur. In
538the future, this option will emit detailed error logging.
539
540```bash
541hackmyresume build resume.json -d
542hackmyresume analyze resume.json --debug
543```
544
545### Disable Encoding
546
547Use the `--no-escape` option to disable encoding in Handlebars themes. Note:
548this option has no effect for non-Handlebars themes.
549
550```bash
551hackmyresume build resume.json --no-escape
552```
553
554### Private Resume Fields
555
556Have a gig, education stint, membership, or other relevant history that you'd
557like to hide from *most* (e.g. public) resumes but sometimes show on others? Tag it with
558`"private": true` to omit it from outbound generated resumes by default.
559
560
561```json
562"employment": {
563 "history": [
564 {
565 "employer": "Acme Real Estate"
566 },
567 {
568 "employer": "Area 51 Alien Research Laboratory",
569 "private": true
570 },
571 {
572 "employer": "H&R Block"
573 }
574 ]
575}
576```
577
578Then, when you want a copy of your resume that includes the private gig / stint
579/ etc., tell HackMyResume that it's OK to emit private fields. The way you do
580that is with the `--private` switch.
581
582```bash
583hackmyresume build resume.json private-resume.all --private
584```
585
586
587### Custom theme helpers
588
589You can attach your own custom Handlebars helpers to a FRESH theme with the
590`helpers` key of your theme's `theme.json` file.
591
592```js
593{
594 "title": "my-cool-theme",
595
596 // ...
597
598 "helpers": [
599 "../path/to/helpers/*.js",
600 "some-other-helper.js"
601 ]
602}
603```
604
605HackMyResume will attempt to load each path or glob and register any specified
606files with [Handlebars.registerHelper][hrh], making them available to your
607theme.
608
609
610## Contributing
611
612HackMyResume is a community-driven free and open source project under the MIT
613License. Contributions are encouraged and we respond to all PRs and issues in
614time. See [CONTRIBUTING.md][contribute] for details.
615
616## License
617
618MIT. Go crazy. See [LICENSE.md][1] for details.
619
620[1]: LICENSE.md
621[2]: http://phantomjs.org/
622[3]: http://wkhtmltopdf.org/
623[4]: https://nodejs.org/
624[5]: https://www.npmjs.com/
625[6]: http://jsonresume.org
626[7]: http://fluentcv.com
627[8]: https://youtu.be/N9wsjroVlu8
628[9]: https://api.jquery.com/jquery.extend/
629[10]: https://github.com/beautify-web/js-beautify
630[11]: http://weasyprint.org/
631[fresh]: https://github.com/fluentdesk/FRESH
632[fresca]: https://github.com/fresh-standard/fresh-resume-schema
633[dry]: https://en.wikipedia.org/wiki/Don%27t_repeat_yourself
634[img-release]: https://img.shields.io/github/release/hacksalot/HackMyResume.svg?label=version
635[img-master]: https://img.shields.io/travis/hacksalot/HackMyResume/master.svg
636[img-dev]: https://img.shields.io/travis/hacksalot/HackMyResume/dev.svg?label=dev
637[travis-url-master]: https://travis-ci.org/hacksalot/HackMyResume?branch=master
638[travis-url-dev]: https://travis-ci.org/hacksalot/HackMyResume?branch=dev
639[latest-release]: https://github.com/hacksalot/HackMyResume/releases/latest
640[contribute]: CONTRIBUTING.md
641[fresh-themes]: https://github.com/fluentdesk/fresh-themes
642[jrst]: https://www.npmjs.com/search?q=jsonresume-theme
643[gh]: https://gitter.im/hacksalot/HackMyResume?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge
644[badge]: https://badges.gitter.im/hacksalot/HackMyResume.svg
645[hrh]: http://handlebarsjs.com/reference.html#base-registerHelper