Package: ancv
ancvGetting your resume akaan CV(ANSI-v🤡) straight to your and anyone else's terminals:Be warned though, for this is kinda useless and just for fun:Getting startedCreate your resume according to theJSON Resume Schema(see also theschema specification) either:manually (seetheheyhosamplefor a possible starting point),exporting fromLinkedInusingJoshua Tzucker's LinkedIn exporter(repo)[^1], orexporting from one of the platforms advertised as offeringJSON resume integration.Create apublicgistnamedresume.jsonwith your resume contents.You're now the proud owner of an ancv.
Time to try it out.The following examples work out-of-the-box.Replaceheyhowith your GitHub usernameonce you're all set up.curl:curl-Lancv.io/heyhowith-Lbeing shorthand for--location, allowing you to follow the redirect fromhttp://ancv.iothrough tohttps://ancv.io.
It's shorter than its also perfectly viable alternative:curlhttps://ancv.io/heyhoLastly, you might want to page the output for easiest reading, top-to-bottom:curl-sLancv.io/heyho|lessIf that garbles the rendered output, tryless -raka--raw-control-chars.wget:wget-O---quietancv.io/heyhowhere-Ois short for--output-document, used here to redirect to stdout.PowerShell 7:(iwrancv.io/heyho).Contentwhereiwris an alias forInvoke-Webrequest, returning an object whoseContentwe access.PowerShell 5:(iwr-UseBasicParsingancv.io/heyho).Contentwhere-UseBasicParsingisonlyrequired 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).ConfigurationAll configuration is optional.The CV is constructed as follows:In summary:you control:thetemplate.Essentially the order of items, indentations, text alignment, position of dates and more.
Templates are like layouts/skeletons.thetheme.This controls colors, italics, boldface, underlining, blinking (yes, really) and more.
A couple themes exist but you can easily add your own one.thelanguageto use.Pre-set strings like section titles (Education, ...), names of months etc. are governed bytranslations, of which there are a couple available already.
All other text is free-form.text content like emojis and newlines to control paragraph breaks.Emojis are user-controlled: if you want them, use them in yourresume.json; in the future, there might betemplateswith emojis baked in, but you'd have to actively opt into using one.date formatting, in a limited fashion through a specialdec31_as_yeartoggle.
If that toggle istrue, dates in the formatYYYY-12-31will be displayed asYYYYonly.lastly, there's a toggle for ASCII-only output.It only concerns thetemplateand controls the drawing of boxes and such (e.g.,-versus─: only the latter will produce gapless rules).
If you yourself use non-ASCII characters in your texts, use alanguagecontaining non-ASCII characters (Spanish, French, ...) or athemewith non-ASCII characters (e.g., a theme might use the•character to print bullet points), non-ASCII Unicode will still occur.
As such, this toggle currently isn't very powerful, but with some care itdoesultimately allow you to be ASCII-only.If you come up with new templates, themes or translations, a PR would be highly appreciated.youdo notcontrol:anything about a viewer's terminal!Any recent terminal will support a baseline of features (e.g., colors), but large parts of the functionalities depend on thefontused: proper Unicode support is needed for pretty output (seeascii_only), and ideally emojis if you're into that (although it's easy to pick an emoji-free template).
Many themes leverage Unicode characters as well.access to your CV: like the gist itself, it will be publicly available on GitHub.How to configureConfiguringancvrequires going beyond the vanilla JSON Resume schema.
You will need to add an (entirely optional)$.meta.ancvfield to yourresume.json.
Theprovided schemawill be of help here:
an editor capable of providing auto-completion based on it, likeVisual 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, avalid JSON resume(without anancvsection) is valid forancvuse as well.InstallationAs a libraryInstall the package as usual:pipinstallancvThis 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 containerSee also the availablepackages aka images:dockerpullghcr.io/alexpovel/ancvVersioned tags (so you can pin a major) are available.Local usageOnce installed, you could for example check whether yourresume.jsonis valid at all (validate) or get a glimpse at the final product (render):# pip route:$ancvrenderresume.json# container route:$dockerrun-v$(pwd)/resume.json:/app/resume.jsonghcr.io/alexpovel/ancvrenderSelf-hostingSelf-hosting is a first-class citizen here.Context: Cloud HostingThehttps://ancv.iosite is hosted onGoogle Cloud Run(serverless) and deployed thereautomatically, 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 aresume.jsongist 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 ithasto 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.SetupFor simplicity, using Docker Compose (with Docker's recentCompose CLI plugin):Clone this repository onto your server (or fork it, make your edits and clone that)cd self-hostingEditCaddy's config file(more info) to contain your own domain namePlace yourresume.jsoninto the directoryRundocker compose upCaddy (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 recommendqmcgaw/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 singleDockerfilemight suffice (adjusted to your needs).
Trueserverlessis also a possibility and an excellent fit here.
For example, one could useDigital Ocean'sFunctions.
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.)[^1]: The exporter has a couple caveats.
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 localancv render your-file.jsonwill printpydanticvalidation errors, which might be helpful in debugging.
For example, the exporter might leave$.basics.urlan empty string, which isn't a valid URI and therefore fails the schema and, by extension,ancv.
Similarly,endDatekeys might get empty string values.Remove these entriesentirely to stay conformant to the JSON Resume Schema (to whichancvstays conformant).