├── .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 | 50 |
51 |
52 | 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 | 72 | 73 | {% endfor %} 74 | 75 |

Service and Honors

76 | 77 | 83 | 84 |

Open Source

85 | 86 | 91 | 92 |

Education

93 | 94 | 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 | } --------------------------------------------------------------------------------