Skip to content
Merged

V2 #3

Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .github/CODEOWNERS
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
* @lissy93
1 change: 1 addition & 0 deletions .github/FUNDING.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
github: lissy93
90 changes: 73 additions & 17 deletions .github/README.md
Original file line number Diff line number Diff line change
@@ -1,47 +1,62 @@
<h1 align="center">Alicia Sykes - CV</h1>
<p align="center">
<!-- <a href="https://github.com/Lissy93/cv"><img src="https://i.ibb.co/8BV5p7L/CV-Logo-Alicia-Sykes.png" width="128" /><br /></a> -->
<a href="https://github.com/Lissy93/cv"><img src="https://i.ibb.co/G4vGDwtD/cv-logo.png?" width="48" /><br /></a>
<i>This repo contains the source for my personal CV</i>
<br />
<i>A website (Svelte) and PDF (LaTeX) auto-built from jsonresume data</i>
<br />
<b>🌐 <a href="https://cv.aliciasykes.com/">cv.aliciasykes.com</a> | 📄 <a href="https://cv.aliciasykes.com/download"><code>Alicia-Sykes-CV.pdf</code></a></b> <br />
</p>
<br />



## Motive
To automate my CV generation, and make it easier to maintain.
All content defined in YAML, then a script generates a LaTeX PDF and deploy a web version.
I did it this way so that I don't need to f\*\*k around with Microsoft Word.

<details>
<summary>Motive (legacy)</summary>


> **Backstory**<br>
> I've just been made redundant 😢 (Aug '24), which I am gutted about. I've never been laid off before, and I loved my job and the people I worked with. So I'm now on the market, looking for a new role!
> I'm just about to be made redundant 😢 (Aug '24), which I am gutted about. I've never been laid off before, and I loved my job and the people I worked with. So I'm now on the market, looking for a new role!
>
> I've kept my CV/resume **very** brief, in an attempt respect the hiring manager's time. But in short, I'm an experienced, Principle-level full stack engineer with a love for quality, performance, mentoring, tech and open source. The best judge of a developer is their code, and while I cannot share what I've done professional or for private clients, I have got many open source projects on my [GitHub](https://github.com/lissy93) and at [apps.aliciasykes.com](https://apps.aliciasykes.com).


</details>

---

## About

The resume content is defined in [`resume.yml`](/resume.yml) following the [jsonresume.org](https://jsonresume.org/) standard, and validated against [`schema.json`](/schema.json).
A LaTex document is then generated from [`template.jinja`](/template.jinja) formated with [`resume-format.cls`](/tex/resume-format.cls), which is then compiled into a PDF by GitHub Actions, and published under the [Releases](https://github.com/Lissy93/cv/releases) tab.
A markdown version is also generated by [`lib/markdown.py`](/lib/markdown.py), as well as a CV website which is built as a static Svelte site and deployed to GitHub Pages at [cv.aliciasykes.com](https://aliciasykes.com).<br>
...Because why spend 30 minutes writing your CV, when you could spend 30 hours automating it?
A LaTex document is then generated from [`template.jinja`](/template.jinja) formated with [`resume-format.cls`](/tex/resume-format.cls), which is then [compiled into a PDF](https://github.com/Lissy93/cv/actions/workflows/compile.yml) by GitHub Actions, and published under the [Releases](https://github.com/Lissy93/cv/releases) tab.
A markdown version is also generated by [`lib/markdown.py`](/lib/markdown.py), as well as a CV website which is built as a static site with SvelteKit, and deployed to GitHub Pages and Vercel, at [cv.aliciasykes.com](https://aliciasykes.com).

Why? ...Because why spend 30 minutes writing your CV, when you could spend 30 hours automating it, obviously!


---

## Usage

### Option #1 - GitHub
Upon creating a tag (by triggering the [Tag Workflow](/.github/workflows/tag.yml)), a new Release will be drafted with your compiled CV PDF attatched

1. Fork the repo
2. Update resume.json with your own content
3. Trigger the GitHub Action to compile the PDF
3. Create [a tag](/.github/workflows/tag.yml), or trigger the GH actions workflow
4. ....and a PDF and website gets magically generated


<details><summary>Workflows</summary>

- `tag` - Creates a new Git tag. Optionally specify the tag name and description, or by default it will just bump the sem ver patch number by 1
- `generate` - Generates your resume in PDF form as an artifact. If triggered by a tag, then a new release will be created, with the PDF attatched
- `validate` - Validates your resume data against the schema. This will also run whenever a new PR is opened, to ensure it's valid and working
| Workflow | Description | Status |
| :----------- | :--------------- | :------------------------: |
| `tag` | Creates a new Git tag. Optionally specify the tag name and description, or by default it will just bump the sem ver patch number by 1 | [![Tag](https://github.com/Lissy93/cv/actions/workflows/tag.yml/badge.svg)](https://github.com/Lissy93/cv/actions/workflows/tag.yml) |
| `generate` | Generates your resume in PDF form as an artifact. If triggered by a tag, then a new release will be created, with the PDF attatched | [![Generate PDF](https://github.com/Lissy93/cv/actions/workflows/compile.yml/badge.svg)](https://github.com/Lissy93/cv/actions/workflows/compile.yml) |
| `validate` | Validates your resume data against the schema. This will also run whenever a new PR is opened, to ensure it's valid and working | st |

</details>

---
Expand All @@ -51,7 +66,12 @@ See the [`Makefile`](/Makefile) for all the available commands. Or, just run `ma

1. Clone the repo
2. Update resume.json with your own content
3. Run `make` from the root, to install deps, validate content, generate LaTex, and compile PDF
1. Run `make` from the root, to install deps, validate content, generate LaTex, and compile PDF

Or, to deploy the web version
1. Follow steps above (clone, edit, validate)
2. Run `make web` to generate `dist/`
3. upload to any CDN, web server or static hosting provider (I use Vercel)

<details><summary>Commands</summary>

Expand All @@ -64,9 +84,31 @@ See the [`Makefile`](/Makefile) for all the available commands. Or, just run `ma
- `make web` - Launches web version, installs NPM deps, builds and serves the site
</details>

```mermaid
flowchart LR
GA([🤖 GitHub Actions<br><sup>Triggered on <code>resume.yml</code> change</sup>]) --> A3

A1([🚀 Start<br><sup>Clone repo & cd into it</sup>]) --> A2[✏️ Update <code>resume.yml</code><br><sub>Your resume content goes here</sub>]
A2 --> A3[✅ make validate<br><sub>Check for content or schema issues</sub>]

%% PDF PATH
A3 --> PDF[📄 PDF Output]
PDF --> B1[📦 make install<br><sub>Install all dependencies</sub>]
B1 --> B2[🛠 make generate<br><sub>Generate LaTeX from resume.yml</sub>]
B2 --> B3[📄 make compile<br><sub>Compile LaTeX to PDF</sub>]
B3 --> B4([✅ View at <code>out/resume.pdf</code>])

%% WEB PATH
A3 --> Web[🌐 Website Output]
Web --> C1[🌐 make web<br><sub>Build static site into <code>./dist</code></sub>]
Web --> C2[🧪 make web_dev<br><sub>Start local dev server at <code>localhost:5173</code></sub>]
C1 --> C3([🚀 Deploy <code>./dist</code> to your host])
C2 --> C4([🔍 View site locally in browser])
```

---

### Editing
## Editing
Modify data by editing [`resume.yml`](/resume.yml)<br>
If you need to customize the layout, edit [`template.jinja`](/template.jinja)<br>
Or to change the styles and formatting, edit [`resume-format.cls`](/tex/resume-format.cls)<br>
Expand All @@ -78,7 +120,21 @@ The source for the website version is located in [`web/`](/web)

## Screenshot

<p align="center"><a href="https://cv.aliciasykes.com"><img width="650" src="https://i.ibb.co/7NjgmHC/alicia-sykes-cv-mockup.png?" /></a></p>
<h3 align="center">Web 🌐</h3>
<p align="center"><a href="https://cv.aliciasykes.com"><img width="650" src="https://i.ibb.co/7NjgmHC/alicia-sykes-cv-mockup.png" /></a></p>

<h3 align="center">PDF 📄</h3>
<p align="center"><a href="https://cv.aliciasykes.com"><img width="650" src="https://i.ibb.co/ycsHkjdF/screenshot-pdf.png?" /></a></p>

---

## Contributing

### Pull Requests
No point contributing. Just fork the repo and do whatever changes you like there.

### Issues
No point in raising issues here. It works on my machine. Therefore I see no issue, lol

---

Expand All @@ -97,7 +153,7 @@ The source for the website version is located in [`web/`](/web)

## License

> _**[Lissy93/CV](https://github.com/Lissy93/cv)** is licensed under [MIT](https://github.com/Lissy93/cv/blob/HEAD/LICENSE) © [Alicia Sykes](https://aliciasykes.com) 2024._<br>
> _**[Lissy93/CV](https://github.com/Lissy93/cv)** is licensed under [MIT](https://github.com/Lissy93/cv/blob/HEAD/LICENSE) © [Alicia Sykes](https://aliciasykes.com) 2025._<br>
> <sup align="right">For information, see <a href="https://tldrlegal.com/license/mit-license">TLDR Legal > MIT</a></sup>

<details>
Expand Down Expand Up @@ -129,7 +185,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

<!-- License + Copyright -->
<p align="center">
<i>© <a href="https://aliciasykes.com">Alicia Sykes</a> 2024</i><br>
<i>© <a href="https://aliciasykes.com">Alicia Sykes</a> 2025</i><br>
<i>Licensed under <a href="https://gist.github.com/Lissy93/143d2ee01ccc5c052a17">MIT</a></i><br>
<a href="https://github.com/lissy93"><img src="https://i.ibb.co/4KtpYxb/octocat-clean-mini.png" /></a><br>
<sup>Thanks for visiting :)</sup>
Expand Down
Binary file added .github/logo.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added .github/screenshots/screenshot-pdf.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added .github/screenshots/screenshot-web.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 1 addition & 1 deletion .github/workflows/compile.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
name: Generate PDF
name: 🔨 Compile and Generate PDF

on:
workflow_dispatch:
Expand Down
18 changes: 18 additions & 0 deletions .github/workflows/mirror.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# Pushes the contents of the repo to the Codeberg mirror
name: 🪞 Mirror to Codeberg
on:
workflow_dispatch:
schedule:
- cron: '30 0 * * 0'
push:
tags: [ 'v*' ]
jobs:
codeberg:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with: { fetch-depth: 0 }
- uses: pixta-dev/repository-mirroring-action@v1
with:
target_repo_url: git@codeberg.org:alicia/cv.git
ssh_private_key: ${{ secrets.CODEBERG_SSH }}
2 changes: 1 addition & 1 deletion .github/workflows/tag.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
name: Tag
name: 🏷️ Tag

on:
workflow_dispatch:
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/validate.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
name: Validate Resume
name: ☑️ Validate Resume
on:
pull_request:
branches:
Expand Down
7 changes: 4 additions & 3 deletions lib/generate.py
Original file line number Diff line number Diff line change
Expand Up @@ -87,8 +87,8 @@ def render_template(template_path: str, resume_data: dict) -> str:
str: The rendered LaTeX resume.
"""
env = Environment(
loader=FileSystemLoader(os.path.dirname(template_path)),
autoescape=select_autoescape(['html', 'xml', 'tex', 'jinja2'])
loader=FileSystemLoader(os.path.dirname(template_path)),
autoescape=select_autoescape(['html', 'xml'])
)
env.filters['latex_escape'] = latex_escape
env.filters['format_date'] = format_date
Expand All @@ -101,7 +101,8 @@ def render_template(template_path: str, resume_data: dict) -> str:
education=resume_data.get('education', []),
skills=resume_data.get('skills', []),
awards=resume_data.get('awards', []),
achivments=resume_data.get('achivments', []),
achievements=resume_data.get('achievements', []),
projects=resume_data.get('projects', []),
extra_links=resume_data.get('extra-links', {})
)

Expand Down
2 changes: 1 addition & 1 deletion lib/markdown.py
Original file line number Diff line number Diff line change
Expand Up @@ -138,7 +138,7 @@ def generate_markdown(resume: Dict[str, Any]) -> str:
skill_items.append(f"See example projects built with each technology at <a href=\"{extra_links_projects['link']}\">{extra_links_projects['link']}</a>")
md_content.append(format_section('Skills', skill_items))

achievements = resume.get('achivments', [])
achievements = resume.get('achievements', [])
achievement_items = [f"{achievement}\n" for achievement in achievements]
md_content.append(format_section('Achievements', achievement_items))

Expand Down
Binary file added out/Alicia-Sykes-CV.pdf
Binary file not shown.
Loading
Loading