├── .envrc
├── .gitignore
├── content
└── resume.md
├── static
├── fonts
│ ├── Charter-Bold.otf
│ ├── Charter-Italic.otf
│ ├── Charter-Regular.otf
│ ├── Charter-BoldItalic.otf
│ └── LICENSE.txt
└── resume.css
├── .github
└── workflows
│ └── render.yaml
├── flake.nix
├── config.toml
├── justfile
├── LICENSE
├── flake.lock
├── resume.yaml
└── templates
└── resume.html
/.envrc:
--------------------------------------------------------------------------------
1 | use_flake
2 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | public
2 | *.pdf
3 | .direnv
4 |
--------------------------------------------------------------------------------
/content/resume.md:
--------------------------------------------------------------------------------
1 | +++
2 | title="Resume"
3 | template="resume.html"
4 | [extra]
5 | resume_data="resume.yaml"
6 | +++
7 |
--------------------------------------------------------------------------------
/static/fonts/Charter-Bold.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/davidmreed/resume-template/HEAD/static/fonts/Charter-Bold.otf
--------------------------------------------------------------------------------
/static/fonts/Charter-Italic.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/davidmreed/resume-template/HEAD/static/fonts/Charter-Italic.otf
--------------------------------------------------------------------------------
/static/fonts/Charter-Regular.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/davidmreed/resume-template/HEAD/static/fonts/Charter-Regular.otf
--------------------------------------------------------------------------------
/static/fonts/Charter-BoldItalic.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/davidmreed/resume-template/HEAD/static/fonts/Charter-BoldItalic.otf
--------------------------------------------------------------------------------
/.github/workflows/render.yaml:
--------------------------------------------------------------------------------
1 | name: "Render Resume"
2 | on:
3 | push:
4 | branches:
5 | - main
6 | jobs:
7 | render:
8 | runs-on: ubuntu-latest
9 | steps:
10 | - uses: actions/checkout@v3
11 | - uses: cachix/install-nix-action@v23
12 | with:
13 | nix_path: nixpkgs=channel:nixos-unstable
14 | - uses: DeterminateSystems/magic-nix-cache-action@v2
15 | - run: nix-shell --run "just pdf"
16 | - uses: actions/upload-artifact@v3
17 | with:
18 | path: "*.pdf"
19 |
--------------------------------------------------------------------------------
/flake.nix:
--------------------------------------------------------------------------------
1 | {
2 | inputs = {
3 | nixpkgs.url = "github:nixos/nixpkgs/nixpkgs-unstable";
4 | flake-utils.url = "github:numtide/flake-utils";
5 | };
6 |
7 | outputs = { nixpkgs, flake-utils, ... }:
8 | flake-utils.lib.eachDefaultSystem (system:
9 | let pkgs = import nixpkgs { system = system; }; in
10 | {
11 | devShells.default = pkgs.mkShell {
12 | packages = with pkgs; [ zola just python313Packages.weasyprint inotify-tools yq ];
13 | };
14 | }
15 | );
16 | }
17 |
--------------------------------------------------------------------------------
/config.toml:
--------------------------------------------------------------------------------
1 | # The URL the site will be built for
2 | base_url = "https://example.com"
3 |
4 | # Whether to automatically compile all Sass files in the sass directory
5 | compile_sass = false
6 |
7 | # Whether to build a search index to be used later on by a JavaScript library
8 | build_search_index = false
9 |
10 | [markdown]
11 | # Whether to do syntax highlighting
12 | # Theme can be customised by setting the `highlight_theme` variable to a theme supported by Zola
13 | highlight_code = false
14 |
15 | [extra]
16 | # Put all your custom variables here
17 |
--------------------------------------------------------------------------------
/justfile:
--------------------------------------------------------------------------------
1 | filename := "resume.yaml"
2 |
3 | build:
4 | zola build
5 |
6 | pdf: build
7 | weasyprint public/resume/index.html \
8 | Resume-$(cat resume.yaml | yq -r '.basics.name | split(" ") | join("-")').pdf
9 |
10 | render: build pdf
11 | xdg-open Resume-$(cat resume.yaml | yq -r '.basics.name | split(" ") | join("-")').pdf &disown
12 |
13 | watch:
14 | #!/usr/bin/env sh
15 | inotifywait -m -r . \
16 | --exclude "(.*\\.pdf$)|public|justfile|\\.git" \
17 | -e close_write,move,create,delete \
18 | | while read -r directory events filename; do
19 | just render
20 | done
--------------------------------------------------------------------------------
/static/fonts/LICENSE.txt:
--------------------------------------------------------------------------------
1 | Charter license
2 |
3 | This is a copy of the Charter fonts which Bitstream contributed to the X consortium. This is the original notice included with the fonts:
4 |
5 | (c) Copyright 1989-1992, Bitstream Inc., Cambridge, MA. You are hereby granted permission under all Bitstream propriety rights to use, copy, modify, sublicense, sell, and redistribute the 4 Bitstream Charter (r) Type 1 outline fonts and the 4 Courier Type 1 outline fonts for any purpose and without restriction; provided, that this notice is left intact on all copies of such fonts and that Bitstream’s trademark is acknowledged as shown below on all unmodified copies of the 4 Charter Type 1 fonts. BITSTREAM CHARTER is a registered trademark of Bitstream Inc.
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2023 David Reed
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/flake.lock:
--------------------------------------------------------------------------------
1 | {
2 | "nodes": {
3 | "flake-utils": {
4 | "inputs": {
5 | "systems": "systems"
6 | },
7 | "locked": {
8 | "lastModified": 1731533236,
9 | "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=",
10 | "owner": "numtide",
11 | "repo": "flake-utils",
12 | "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b",
13 | "type": "github"
14 | },
15 | "original": {
16 | "owner": "numtide",
17 | "repo": "flake-utils",
18 | "type": "github"
19 | }
20 | },
21 | "nixpkgs": {
22 | "locked": {
23 | "lastModified": 1762943920,
24 | "narHash": "sha256-ITeH8GBpQTw9457ICZBddQEBjlXMmilML067q0e6vqY=",
25 | "owner": "nixos",
26 | "repo": "nixpkgs",
27 | "rev": "91c9a64ce2a84e648d0cf9671274bb9c2fb9ba60",
28 | "type": "github"
29 | },
30 | "original": {
31 | "owner": "nixos",
32 | "ref": "nixpkgs-unstable",
33 | "repo": "nixpkgs",
34 | "type": "github"
35 | }
36 | },
37 | "root": {
38 | "inputs": {
39 | "flake-utils": "flake-utils",
40 | "nixpkgs": "nixpkgs"
41 | }
42 | },
43 | "systems": {
44 | "locked": {
45 | "lastModified": 1681028828,
46 | "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
47 | "owner": "nix-systems",
48 | "repo": "default",
49 | "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
50 | "type": "github"
51 | },
52 | "original": {
53 | "owner": "nix-systems",
54 | "repo": "default",
55 | "type": "github"
56 | }
57 | }
58 | },
59 | "root": "root",
60 | "version": 7
61 | }
62 |
--------------------------------------------------------------------------------
/resume.yaml:
--------------------------------------------------------------------------------
1 | # yaml-language-server: $schema=https://raw.githubusercontent.com/jsonresume/resume-schema/master/schema.json
2 | basics:
3 | name: Camina Drummer
4 | label: Pirate queen of the Belt
5 | email: drummer@tynan.opa
6 | url: https://tynan.opa
7 | summary: |
8 | Experienced leader with deep relationships across Earth, Mars, and the Belt.
9 | Demonstrated expertise in managing complex relationships and stakeholder networks.
10 | Qualified starship captain with hands-on approach and close combat skills.
11 |
12 | *This is an example resume template*.
13 | profiles:
14 | - network: BeltaNet
15 | username: camina
16 | work:
17 | - name: Transport Union
18 | position: President
19 | startDate: "2303-01-01"
20 | highlights:
21 | - Founding president of multi-solar-system commerce conglomerate.
22 | - name: Medina Station
23 | position: Captain
24 | startDate: "2277-05-01"
25 | highlights:
26 | - Led Belter and OPA forces in control of OPAS *Behemoth*.
27 | - Established and maintained OPA presence in critical system transfer point.
28 | - name: Tycho Station
29 | position: Assistant Director
30 | startDate: "2276-05-01"
31 | highlights:
32 | - Defended the station from mutineers.
33 | - Appropriated *200* valuable munitions from UNN forces.
34 | education:
35 | - institution: Univ. of Ceres
36 | area: Station Management
37 | studyType: B.A.
38 | startDate: "2262-01-01"
39 | endDate: "2266-01-01"
40 | awards:
41 | - title: Tycho Station handball champion
42 | date: "2023-06-01"
43 | skills:
44 | - name: Starship navigation
45 | - name: Epstein Drive maintenance
46 | - name: Small arms
47 | - name: Piracy
48 | - name: Anti-piracy
49 | keywords:
50 | - break
51 | - name: Conflict resolution
52 | - name: Relationship management
53 | - name: Hostage negotiation
54 | projects:
55 | - name: Nauvoo
56 | description: generation ship built at Tycho Station.
57 |
--------------------------------------------------------------------------------
/templates/resume.html:
--------------------------------------------------------------------------------
1 | {% set resume = load_data(path=page.extra.resume_data) %}
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 | {{ resume.basics.name }}
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 | {{ resume.basics.name }} ∙ {{ resume.basics.label }}
18 |
19 |
20 |
21 | {% if resume.basics.email %}
22 | - email
23 | -
24 |
{{ resume.basics.email }}
25 |
26 | {% endif %}
27 | {% if resume.basics.url %}
28 | - web
29 | {{ resume.basics.url }}
30 | {% endif %}
31 | {% if resume.basics.profiles %}
32 | {% for network in resume.basics.profiles %}
33 | - {{ network.network | lower }}
34 | {{ network.username }}
35 | {% endfor %}
36 | {% endif %}
37 |
38 |
39 | {{ resume.basics.summary | markdown | safe }}
40 |
41 | {% if resume.skills %}
42 | Skills and Competencies
43 |
44 |
45 |
46 | {% for skill in resume.skills %}
47 | - {{ skill.name }}
48 | {% if skill.keywords and "break" in skill.keywords %}
49 |
50 |
51 |
52 |
53 | {% endif %}
54 | {% endfor %}
55 |
56 |
57 |
58 | {% endif %}
59 |
60 | Recent Experience
61 | {% for work in resume.work %}
62 | {{ work.position }}, {{ work.name }} {{ work.startDate | date(format="%Y") }}-{% if
63 | work.endDate
64 | %}{{ work.endDate |
65 | date(format="%Y") }}{% endif %}
66 |
67 |
68 | {% for highlight in work.highlights %}
69 | - {{ highlight | markdown(inline=true) | safe }}
70 | {% endfor %}
71 |
72 |
73 | {% endfor %}
74 |
75 | Service and Honors
76 |
77 |
78 | {% for award in resume.awards %}
79 | - {{ award.title | markdown(inline=true) | safe }} {% if award.date %}{{ award.date |
80 | date(format="%Y") }}{% endif %}
81 | {% endfor %}
82 |
83 |
84 | Open Source
85 |
86 |
87 | {% for project in resume.projects %}
88 | - {{ project.name }}: {{ project.description | markdown(inline=true) | safe }}
89 | {% endfor %}
90 |
91 |
92 | Education
93 |
94 |
95 | {% for education in resume.education %}
96 | - {{ education.studyType }}, {{ education.area }}, {{ education.institution }} {{
97 | education.startDate | date(format="%Y") }}-{{ education.endDate | date(format="%Y") }}
98 | {% endfor %}
99 |
100 |
101 |
102 |
103 |
104 |
--------------------------------------------------------------------------------
/static/resume.css:
--------------------------------------------------------------------------------
1 | @media print {
2 | :root {
3 | /* Loosely based on Gruvbox Light */
4 | --accent: #6b0000;
5 | /* red */
6 | --accent-bg: white;
7 | /* bg0_h */
8 | --bg: white;
9 | --text: #3c3836;
10 | /* fg */
11 | --text-light: #7c6f64;
12 | /*fg4 */
13 | --code: #3c3836;
14 | /* blue */
15 | --header: white;
16 | /* bg0_h */
17 | --border: #282828;
18 | /* fg0 */
19 | --preformatted: #458588;
20 | --marked: #ffdd33;
21 | --disabled: #efefef;
22 | }
23 |
24 | header,
25 | footer {
26 | display: none;
27 | }
28 |
29 | h1,
30 | h2,
31 | h3 {
32 | font-family: 'Arial Black';
33 | font-weight: bold;
34 | transform: scaleX(0.85);
35 | text-align: left;
36 | transform-origin: 0 100%;
37 | padding: 0;
38 | line-height: 1.1
39 | }
40 |
41 | h1 {
42 | font-size: 14pt;
43 | }
44 |
45 | h1 span:first-of-type {
46 | font-family: 'Bitstream Charter';
47 | font-weight: normal;
48 | color: var(--accent);
49 | transform: scaleX(100);
50 | }
51 |
52 | h2 {
53 | font-size: 13pt;
54 | margin: 0.9rem 0 0.25rem 0;
55 | }
56 |
57 | h3 {
58 | font-size: 12pt;
59 | margin: 0.5rem 0 0.25rem 0;
60 | }
61 |
62 | p,
63 | li,
64 | ul {
65 | margin: 0;
66 | line-height: 1.3;
67 | padding: 0;
68 | padding-bottom: 0.3rem;
69 | }
70 |
71 |
72 | @font-face {
73 | font-family: 'Bitstream Charter';
74 | font-weight: normal;
75 | src: url("fonts/Charter-Regular.otf");
76 | }
77 |
78 | @font-face {
79 | font-family: 'Bitstream Charter';
80 | font-weight: bold;
81 | src: url("fonts/Charter-Bold.otf");
82 | }
83 |
84 | @font-face {
85 | font-family: 'Bitstream Charter';
86 | font-style: italic;
87 | src: url("fonts/Charter-Italic.otf");
88 | }
89 |
90 | @font-face {
91 | font-family: 'Bitstream Charter';
92 | font-weight: bold;
93 | font-style: italic;
94 | src: url("fonts/Charter-BoldItalic.otf");
95 | }
96 |
97 | @page {
98 | margin: 0.75in;
99 | padding: 0;
100 | size: letter;
101 | }
102 |
103 | html {
104 | margin: 0;
105 | padding: 0;
106 | font-size: 10pt;
107 | font-family: 'Bitstream Charter';
108 | line-height: normal !important;
109 | }
110 |
111 | span.date {
112 | position: absolute;
113 | left: 5.5in;
114 | }
115 |
116 | ul span.date {
117 | /* account for scaleX transform */
118 | position: absolute;
119 | left: 4.675in;
120 | }
121 | }
122 |
123 | @media screen {
124 | span.date {
125 | float: right;
126 | }
127 |
128 | h1 span {
129 | font-size: 50%;
130 | display: block;
131 | }
132 |
133 | h1 span:first-of-type {
134 | display: none;
135 | }
136 |
137 | em {
138 | font-weight: bold;
139 | }
140 | }
141 |
142 | h1 {
143 | border-bottom: 3pt solid;
144 | border-bottom-color: var(--accent);
145 | padding-bottom: 2pt;
146 |
147 | }
148 |
149 | code {
150 | color: var(--text);
151 | }
152 |
153 |
154 | em {
155 | font-style: normal;
156 | color: var(--accent);
157 | }
158 |
159 | .inline-bullets ul {
160 | list-style-type: none;
161 | }
162 |
163 | .inline-bullets ul li:before {
164 | content: "∙ ";
165 | color: var(--accent);
166 | font-weight: bold;
167 | }
168 |
169 | .inline-bullets ul li:first-of-type:before {
170 | content: "";
171 | }
172 |
173 | .inline-bullets ul li {
174 | display: inline;
175 | }
176 |
177 | ul {
178 | padding: 0;
179 | margin: 0;
180 | }
181 |
182 | ul li {
183 | padding-bottom: 0.3rem;
184 | }
185 |
186 | dl {
187 | margin: 0;
188 | padding: 0;
189 | }
190 |
191 | dl dd {
192 | display: inline;
193 | margin: 0;
194 | padding: 0;
195 | margin-right: 2rem;
196 | }
197 |
198 | dl dt {
199 | display: inline;
200 | font-style: italic;
201 | color: inherit;
202 | margin: 0;
203 | padding: 0;
204 | margin-right: 1rem;
205 | }
206 |
207 | abbr {
208 | font-size: 80%;
209 | text-decoration: none !important;
210 | }
211 |
212 | body {
213 | font-size: 1.15rem;
214 | line-height: 1.5;
215 | }
--------------------------------------------------------------------------------