ancv

Getting your resume aka an CV (ANSI-v 🤡) straight to your and anyone else’s terminals:

showcase cv terminal output


Be warned though, for this is kinda useless and just for fun:

users venn diagram

Getting started

  1. Create your resume according to the JSON Resume Schema (see also the schema specification) either:

    • use ChatGPT (or another LLM) with the following prompt (you need to fill in the spaces for [resume] and [json_schema]):
       Resume:[resume]
      
       JSON Resume Schema:[json_schema]
      
       Provide JSON data structure of the resume, formatted according to the JSON Resume Schema
            
       Output json, no yapping
      

      Note: for json_schema you can just use the example from here

    • manually (see the heyho sample for a possible starting point),
    • exporting from LinkedIn using Joshua Tzucker’s LinkedIn exporter (repo)1, or
    • exporting from one of the platforms advertised as offering JSON resume integration.
  2. Create a public gist named resume.json with your resume contents.
  3. You’re now the proud owner of an ancv. Time to try it out.

    The following examples work out-of-the-box. Replace heyho with your GitHub username once you’re all set up.

    • curl:

       curl -L ancv.io/heyho
      

      with -L being shorthand for --location, allowing you to follow the redirect from http://ancv.io through to https://ancv.io. It’s shorter than its also perfectly viable alternative:

       curl https://ancv.io/heyho
      

      Lastly, you might want to page the output for easiest reading, top-to-bottom:

       curl -sL ancv.io/heyho | less
      

      If that garbles the rendered output, try less -r aka --raw-control-chars.

    • wget:

      wget -O - --quiet ancv.io/heyho
      

      where -O is short for --output-document, used here to redirect to stdout.

    • PowerShell 7:

      (iwr ancv.io/heyho).Content
      

      where iwr is an alias for Invoke-Webrequest, returning an object whose Content we access.

    • PowerShell 5:

      (iwr -UseBasicParsing ancv.io/heyho).Content
      

      where -UseBasicParsing is only required if you haven’t set up Internet Explorer yet (yes, really). If you have, then it works as PowerShell 7 (where that flag is deprecated and the default anyway).

Configuration

All configuration is optional.

The CV is constructed as follows:

conceptual flow chart

In summary:

How to configure

Configuring ancv requires going beyond the vanilla JSON Resume schema. You will need to add an (entirely optional) $.meta.ancv field to your resume.json. The provided schema will be of help here: an editor capable of providing auto-completion based on it, like Visual Studio Code, will make filling out the additional configuration a breeze.

The schema will further inform you of the default values (used for unspecified fields). Since everything is optional, a valid JSON resume (without an ancv section) is valid for ancv use as well.

Installation

As a library

Install the package as usual:

pip install ancv

This also allows you to import whatever you could want or need from the package, if anything. Note that it’s pretty heavy on the dependencies.

As a container

See also the available packages aka images:

docker pull ghcr.io/alexpovel/ancv

Versioned tags (so you can pin a major) are available.

Local usage

Once installed, you could for example check whether your resume.json is valid at all (validate) or get a glimpse at the final product (render):

# pip route:
$ ancv render resume.json
# container route:
$ docker run -v $(pwd)/resume.json:/app/resume.json ghcr.io/alexpovel/ancv render

Self-hosting

Self-hosting is a first-class citizen here.

Context: Cloud Hosting

The https://ancv.io site is hosted on Google Cloud Run (serverless) and deployed there automatically, such that the latest release you see here is also the code executing in that cloud environment. That’s convenient to get started: simply create a resume.json gist and you’re good to go within minutes. It can also be used for debugging and playing around; it’s a playground of sorts.

You’re invited to use this service for as much and as long as you’d like. However, obviously, as an individual I cannot guarantee its availability in perpetuity. You might also feel uncomfortable uploading your CV onto GitHub, since it has to be public for this whole exercise to work. Lastly, you might also be suspicious of me inserting funny business into your CV before serving it out. If this is you, self-hosting is for you.

Setup

For simplicity, using Docker Compose (with Docker’s recent Compose CLI plugin):

  1. Clone this repository onto your server (or fork it, make your edits and clone that)
  2. cd self-hosting
  3. Edit Caddy’s config file (more info) to contain your own domain name
  4. Place your resume.json into the directory
  5. Run docker compose up

Caddy (chosen here for simplicity) will handle HTTPS automatically for you, but will of course require domain names to be set up correctly to answer ACME challenges. Handling DNS is up to you; for dynamic DNS, I can recommend qmcgaw/ddns-updater.

If you self-host in the cloud, the server infrastructure might be taken care of for you by your provider already (as is the case for Google Cloud Run). In these cases, a dedicated proxy is unnecessary and a single Dockerfile might suffice (adjusted to your needs). True serverless is also a possibility and an excellent fit here. For example, one could use Digital Ocean’s Functions. If you go that route and succeed, please let me know! (I had given up with how depressingly hard dependency management was, as opposed to tried-and-tested container images.)


github logo

You will probably not be able to paste its result into a gist and have it work out of the box. It is recommended to paste the export into an editor capable of helping you find errors against the contained $schema, like VS Code. Alternatively, a local ancv render your-file.json will print pydantic validation errors, which might be helpful in debugging. For example, the exporter might leave $.basics.url an empty string, which isn’t a valid URI and therefore fails the schema and, by extension, ancv. Similarly, endDate keys might get empty string values. Remove these entries entirely to stay conformant to the JSON Resume Schema (to which ancv stays conformant).

  1. The exporter has a couple caveats.Â