Source
This app’s code and revision history are public. Download a copy or explore the files below.
Public
The app’s code and revision history are public.
Run it yourself
Take the whole tree and run it on your own machine. The download needs no account. Cloning needs a sign-in.
Download .zip
bounded clone 70bace54357d4b57b674108f
A copy you download is not bounded. The guarantees this app runs under - declared egress, proven invariants, writes that fail closed - live in the runtime serving this page, not in the files. What you get is auditable source you can read and run, with no runtime guarantees attached.
public/openapi.json
{
"openapi": "3.1.0",
"info": {
"title": "Resume by OpenApps",
"version": "1.1.0",
"summary": "Free resumes with a free PDF download, in JSON Resume.",
"description": "Resume is a free alternative to Zety and Resume.io. No key and no account. Send JSON Resume and get back a link where the resume shows and its PDF downloads. A resume's id lets anyone read it, like its link; changes need the owner key returned at creation, sent as the x-owner-key header. Errors are JSON with a plain error sentence that says what to change. Notes for assistants: https://resume-free.openapps.xyz/llms.txt",
"contact": {
"name": "OpenApps",
"url": "https://free-apps.openapps.xyz/"
}
},
"externalDocs": {
"description": "Notes for assistants (llms.txt)",
"url": "https://resume-free.openapps.xyz/llms.txt"
},
"servers": [
{
"url": "https://functions.bounded.sh/apps/70bace54357d4b57b674108f/api"
}
],
"paths": {
"/": {
"get": {
"operationId": "listRoutes",
"summary": "List the routes",
"responses": {
"200": {
"description": "The routes, one line each.",
"content": {
"application/json": {
"schema": {
"type": "object"
}
}
}
}
}
}
},
"/resumes": {
"post": {
"operationId": "createResume",
"summary": "Create a resume",
"description": "Give the person url. Give adminUrl and ownerKey only to the person the resume is for.",
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/NewResume"
},
"example": {
"basics": {
"name": "Sam Rivera",
"label": "Product designer",
"email": "sam@example.com",
"location": {
"city": "Portland",
"region": "OR"
},
"summary": "Designer with 8 years in fintech and health."
},
"work": [
{
"name": "Acme Inc.",
"position": "Senior product designer",
"startDate": "2021-03",
"highlights": [
"Led the checkout redesign; conversion up 12%"
]
}
],
"education": [
{
"institution": "Portland State University",
"studyType": "BA",
"area": "Graphic Design",
"endDate": "2016"
}
],
"skills": [
{
"name": "Design",
"keywords": [
"Figma",
"Prototyping"
]
}
],
"template": "modern",
"color": "sage"
}
}
}
},
"responses": {
"201": {
"description": "The new resume's links and owner key.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Created"
},
"example": {
"resumeId": "HeUbK2cVRsfjedaMBq7r",
"url": "https://resume-free.openapps.xyz/r/HeUbK2cVRsfjedaMBq7r",
"adminUrl": "https://resume-free.openapps.xyz/r/HeUbK2cVRsfjedaMBq7r/admin#k=s8qFayfkPzqeuMjn6zTdtjUw",
"ownerKey": "s8qFayfkPzqeuMjn6zTdtjUw",
"template": "modern",
"paper": "Letter",
"color": "sage",
"share": "Send url to the person..."
}
}
}
},
"400": {
"description": "Bad input, for example a missing basics.name or a list that is too long.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
}
}
}
},
"/resumes/{resumeId}": {
"parameters": [
{
"name": "resumeId",
"in": "path",
"required": true,
"schema": {
"type": "string",
"pattern": "^[A-Za-z0-9]{8,32}$"
},
"description": "From the create response or the resume's link."
}
],
"get": {
"operationId": "getResume",
"summary": "Read a resume",
"responses": {
"200": {
"description": "The resume as JSON Resume, with its plain text.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/View"
}
}
}
},
"404": {
"description": "No resume with that id.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
}
}
},
"patch": {
"operationId": "updateResume",
"summary": "Change a resume (owner key)",
"description": "Send any field of create. basics and meta merge field by field; each list replaces the whole list.",
"parameters": [
{
"name": "x-owner-key",
"in": "header",
"required": true,
"schema": {
"type": "string"
},
"description": "The ownerKey returned at creation."
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Resume"
},
"example": {
"basics": {
"label": "Lead product designer"
},
"template": "compact"
}
}
}
},
"responses": {
"200": {
"description": "The changed resume, as GET returns it.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/View"
}
}
}
},
"400": {
"description": "Bad input.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"401": {
"description": "No owner key sent.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"403": {
"description": "The owner key does not match this resume.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"404": {
"description": "No resume with that id.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
}
}
}
}
},
"components": {
"schemas": {
"Resume": {
"type": "object",
"properties": {
"basics": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Required on create.",
"maxLength": 120
},
"label": {
"type": "string",
"description": "Job title under the name."
},
"email": {
"type": "string"
},
"phone": {
"type": "string"
},
"url": {
"type": "string",
"description": "Prints in the contact line."
},
"location": {
"oneOf": [
{
"type": "string",
"description": "Portland, OR"
},
{
"type": "object",
"properties": {
"city": {
"type": "string"
},
"region": {
"type": "string"
},
"countryCode": {
"type": "string"
},
"address": {
"type": "string"
}
}
}
]
},
"summary": {
"type": "string",
"maxLength": 4000
},
"profiles": {
"type": "array",
"items": {
"type": "object",
"properties": {
"network": {
"type": "string"
},
"username": {
"type": "string"
},
"url": {
"type": "string"
}
}
},
"description": "At most 8 links in all, with url."
}
}
},
"work": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Company."
},
"position": {
"type": "string"
},
"location": {
"oneOf": [
{
"type": "string",
"description": "Portland, OR"
},
{
"type": "object",
"properties": {
"city": {
"type": "string"
},
"region": {
"type": "string"
},
"countryCode": {
"type": "string"
},
"address": {
"type": "string"
}
}
}
]
},
"startDate": {
"type": "string",
"description": "\"2021-03\" or \"2021-03-15\" prints as \"Mar 2021\"; other text prints as written."
},
"endDate": {
"type": "string",
"description": "\"2021-03\" or \"2021-03-15\" prints as \"Mar 2021\"; other text prints as written."
},
"summary": {
"type": "string",
"maxLength": 4000
},
"highlights": {
"type": "array",
"items": {
"type": "string",
"maxLength": 1000
},
"description": "One result per bullet. At most 40."
}
}
}
},
"education": {
"type": "array",
"items": {
"type": "object",
"properties": {
"institution": {
"type": "string"
},
"studyType": {
"type": "string",
"description": "Degree, like BA."
},
"area": {
"type": "string",
"description": "Field of study."
},
"location": {
"oneOf": [
{
"type": "string",
"description": "Portland, OR"
},
{
"type": "object",
"properties": {
"city": {
"type": "string"
},
"region": {
"type": "string"
},
"countryCode": {
"type": "string"
},
"address": {
"type": "string"
}
}
}
]
},
"startDate": {
"type": "string",
"description": "\"2021-03\" or \"2021-03-15\" prints as \"Mar 2021\"; other text prints as written."
},
"endDate": {
"type": "string",
"description": "\"2021-03\" or \"2021-03-15\" prints as \"Mar 2021\"; other text prints as written."
},
"score": {
"type": "string",
"description": "Grade.",
"maxLength": 60
},
"courses": {
"type": "array",
"items": {
"type": "string",
"maxLength": 1000
},
"description": "One result per bullet. At most 40."
}
}
}
},
"skills": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Group name, optional."
},
"keywords": {
"type": "array",
"items": {
"type": "string"
}
}
}
}
},
"projects": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"url": {
"type": "string"
},
"startDate": {
"type": "string",
"description": "\"2021-03\" or \"2021-03-15\" prints as \"Mar 2021\"; other text prints as written."
},
"endDate": {
"type": "string",
"description": "\"2021-03\" or \"2021-03-15\" prints as \"Mar 2021\"; other text prints as written."
},
"description": {
"type": "string",
"maxLength": 4000
},
"highlights": {
"type": "array",
"items": {
"type": "string",
"maxLength": 1000
},
"description": "One result per bullet. At most 40."
}
}
}
},
"volunteer": {
"type": "array",
"items": {
"type": "object",
"properties": {
"organization": {
"type": "string"
},
"position": {
"type": "string"
},
"startDate": {
"type": "string",
"description": "\"2021-03\" or \"2021-03-15\" prints as \"Mar 2021\"; other text prints as written."
},
"endDate": {
"type": "string",
"description": "\"2021-03\" or \"2021-03-15\" prints as \"Mar 2021\"; other text prints as written."
},
"summary": {
"type": "string",
"maxLength": 4000
},
"highlights": {
"type": "array",
"items": {
"type": "string",
"maxLength": 1000
},
"description": "One result per bullet. At most 40."
}
}
}
},
"awards": {
"type": "array",
"items": {
"type": "object",
"properties": {
"title": {
"type": "string"
},
"awarder": {
"type": "string"
},
"date": {
"type": "string",
"description": "\"2021-03\" or \"2021-03-15\" prints as \"Mar 2021\"; other text prints as written."
},
"summary": {
"type": "string",
"maxLength": 4000
}
}
}
},
"certificates": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"issuer": {
"type": "string"
},
"date": {
"type": "string",
"description": "\"2021-03\" or \"2021-03-15\" prints as \"Mar 2021\"; other text prints as written."
},
"url": {
"type": "string"
}
}
}
},
"publications": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"publisher": {
"type": "string"
},
"releaseDate": {
"type": "string",
"description": "\"2021-03\" or \"2021-03-15\" prints as \"Mar 2021\"; other text prints as written."
},
"url": {
"type": "string"
},
"summary": {
"type": "string",
"maxLength": 4000
}
}
}
},
"languages": {
"type": "array",
"items": {
"type": "object",
"properties": {
"language": {
"type": "string"
},
"fluency": {
"type": "string"
}
}
}
},
"interests": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Group name, optional."
},
"keywords": {
"type": "array",
"items": {
"type": "string"
}
}
}
}
},
"template": {
"type": "string",
"enum": [
"classic",
"modern",
"compact"
],
"description": "Default classic."
},
"paper": {
"type": "string",
"enum": [
"Letter",
"A4"
],
"description": "Default Letter."
},
"color": {
"type": "string",
"enum": [
"ink",
"cobalt",
"navy",
"sage",
"brick",
"plum"
],
"description": "Heading color. Without it, Modern prints cobalt and the others ink."
},
"meta": {
"type": "object",
"properties": {
"template": {
"type": "string",
"enum": [
"classic",
"modern",
"compact"
],
"description": "Default classic."
},
"paper": {
"type": "string",
"enum": [
"Letter",
"A4"
],
"description": "Default Letter."
},
"color": {
"type": "string",
"enum": [
"ink",
"cobalt",
"navy",
"sage",
"brick",
"plum"
],
"description": "Heading color. Without it, Modern prints cobalt and the others ink."
},
"order": {
"type": "array",
"items": {
"type": "string",
"enum": [
"summary",
"work",
"education",
"skills",
"projects",
"volunteer",
"awards",
"certificates",
"publications",
"languages",
"interests"
]
},
"description": "Section order."
},
"titles": {
"type": "object",
"properties": {
"summary": {
"type": "string"
},
"work": {
"type": "string"
},
"education": {
"type": "string"
},
"skills": {
"type": "string"
},
"projects": {
"type": "string"
},
"volunteer": {
"type": "string"
},
"awards": {
"type": "string"
},
"certificates": {
"type": "string"
},
"publications": {
"type": "string"
},
"languages": {
"type": "string"
},
"interests": {
"type": "string"
}
},
"description": "Heading names, for example in another language."
}
}
}
},
"description": "JSON Resume (https://jsonresume.org/schema). Each list holds at most 40 entries; empty entries are dropped. The whole resume stays under 100,000 characters of JSON."
},
"NewResume": {
"type": "object",
"properties": {
"basics": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Required on create.",
"maxLength": 120
},
"label": {
"type": "string",
"description": "Job title under the name."
},
"email": {
"type": "string"
},
"phone": {
"type": "string"
},
"url": {
"type": "string",
"description": "Prints in the contact line."
},
"location": {
"oneOf": [
{
"type": "string",
"description": "Portland, OR"
},
{
"type": "object",
"properties": {
"city": {
"type": "string"
},
"region": {
"type": "string"
},
"countryCode": {
"type": "string"
},
"address": {
"type": "string"
}
}
}
]
},
"summary": {
"type": "string",
"maxLength": 4000
},
"profiles": {
"type": "array",
"items": {
"type": "object",
"properties": {
"network": {
"type": "string"
},
"username": {
"type": "string"
},
"url": {
"type": "string"
}
}
},
"description": "At most 8 links in all, with url."
}
}
},
"work": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Company."
},
"position": {
"type": "string"
},
"location": {
"oneOf": [
{
"type": "string",
"description": "Portland, OR"
},
{
"type": "object",
"properties": {
"city": {
"type": "string"
},
"region": {
"type": "string"
},
"countryCode": {
"type": "string"
},
"address": {
"type": "string"
}
}
}
]
},
"startDate": {
"type": "string",
"description": "\"2021-03\" or \"2021-03-15\" prints as \"Mar 2021\"; other text prints as written."
},
"endDate": {
"type": "string",
"description": "\"2021-03\" or \"2021-03-15\" prints as \"Mar 2021\"; other text prints as written."
},
"summary": {
"type": "string",
"maxLength": 4000
},
"highlights": {
"type": "array",
"items": {
"type": "string",
"maxLength": 1000
},
"description": "One result per bullet. At most 40."
}
}
}
},
"education": {
"type": "array",
"items": {
"type": "object",
"properties": {
"institution": {
"type": "string"
},
"studyType": {
"type": "string",
"description": "Degree, like BA."
},
"area": {
"type": "string",
"description": "Field of study."
},
"location": {
"oneOf": [
{
"type": "string",
"description": "Portland, OR"
},
{
"type": "object",
"properties": {
"city": {
"type": "string"
},
"region": {
"type": "string"
},
"countryCode": {
"type": "string"
},
"address": {
"type": "string"
}
}
}
]
},
"startDate": {
"type": "string",
"description": "\"2021-03\" or \"2021-03-15\" prints as \"Mar 2021\"; other text prints as written."
},
"endDate": {
"type": "string",
"description": "\"2021-03\" or \"2021-03-15\" prints as \"Mar 2021\"; other text prints as written."
},
"score": {
"type": "string",
"description": "Grade.",
"maxLength": 60
},
"courses": {
"type": "array",
"items": {
"type": "string",
"maxLength": 1000
},
"description": "One result per bullet. At most 40."
}
}
}
},
"skills": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Group name, optional."
},
"keywords": {
"type": "array",
"items": {
"type": "string"
}
}
}
}
},
"projects": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"url": {
"type": "string"
},
"startDate": {
"type": "string",
"description": "\"2021-03\" or \"2021-03-15\" prints as \"Mar 2021\"; other text prints as written."
},
"endDate": {
"type": "string",
"description": "\"2021-03\" or \"2021-03-15\" prints as \"Mar 2021\"; other text prints as written."
},
"description": {
"type": "string",
"maxLength": 4000
},
"highlights": {
"type": "array",
"items": {
"type": "string",
"maxLength": 1000
},
"description": "One result per bullet. At most 40."
}
}
}
},
"volunteer": {
"type": "array",
"items": {
"type": "object",
"properties": {
"organization": {
"type": "string"
},
"position": {
"type": "string"
},
"startDate": {
"type": "string",
"description": "\"2021-03\" or \"2021-03-15\" prints as \"Mar 2021\"; other text prints as written."
},
"endDate": {
"type": "string",
"description": "\"2021-03\" or \"2021-03-15\" prints as \"Mar 2021\"; other text prints as written."
},
"summary": {
"type": "string",
"maxLength": 4000
},
"highlights": {
"type": "array",
"items": {
"type": "string",
"maxLength": 1000
},
"description": "One result per bullet. At most 40."
}
}
}
},
"awards": {
"type": "array",
"items": {
"type": "object",
"properties": {
"title": {
"type": "string"
},
"awarder": {
"type": "string"
},
"date": {
"type": "string",
"description": "\"2021-03\" or \"2021-03-15\" prints as \"Mar 2021\"; other text prints as written."
},
"summary": {
"type": "string",
"maxLength": 4000
}
}
}
},
"certificates": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"issuer": {
"type": "string"
},
"date": {
"type": "string",
"description": "\"2021-03\" or \"2021-03-15\" prints as \"Mar 2021\"; other text prints as written."
},
"url": {
"type": "string"
}
}
}
},
"publications": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"publisher": {
"type": "string"
},
"releaseDate": {
"type": "string",
"description": "\"2021-03\" or \"2021-03-15\" prints as \"Mar 2021\"; other text prints as written."
},
"url": {
"type": "string"
},
"summary": {
"type": "string",
"maxLength": 4000
}
}
}
},
"languages": {
"type": "array",
"items": {
"type": "object",
"properties": {
"language": {
"type": "string"
},
"fluency": {
"type": "string"
}
}
}
},
"interests": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Group name, optional."
},
"keywords": {
"type": "array",
"items": {
"type": "string"
}
}
}
}
},
"template": {
"type": "string",
"enum": [
"classic",
"modern",
"compact"
],
"description": "Default classic."
},
"paper": {
"type": "string",
"enum": [
"Letter",
"A4"
],
"description": "Default Letter."
},
"color": {
"type": "string",
"enum": [
"ink",
"cobalt",
"navy",
"sage",
"brick",
"plum"
],
"description": "Heading color. Without it, Modern prints cobalt and the others ink."
},
"meta": {
"type": "object",
"properties": {
"template": {
"type": "string",
"enum": [
"classic",
"modern",
"compact"
],
"description": "Default classic."
},
"paper": {
"type": "string",
"enum": [
"Letter",
"A4"
],
"description": "Default Letter."
},
"color": {
"type": "string",
"enum": [
"ink",
"cobalt",
"navy",
"sage",
"brick",
"plum"
],
"description": "Heading color. Without it, Modern prints cobalt and the others ink."
},
"order": {
"type": "array",
"items": {
"type": "string",
"enum": [
"summary",
"work",
"education",
"skills",
"projects",
"volunteer",
"awards",
"certificates",
"publications",
"languages",
"interests"
]
},
"description": "Section order."
},
"titles": {
"type": "object",
"properties": {
"summary": {
"type": "string"
},
"work": {
"type": "string"
},
"education": {
"type": "string"
},
"skills": {
"type": "string"
},
"projects": {
"type": "string"
},
"volunteer": {
"type": "string"
},
"awards": {
"type": "string"
},
"certificates": {
"type": "string"
},
"publications": {
"type": "string"
},
"languages": {
"type": "string"
},
"interests": {
"type": "string"
}
},
"description": "Heading names, for example in another language."
}
}
}
},
"description": "JSON Resume (https://jsonresume.org/schema). Each list holds at most 40 entries; empty entries are dropped. The whole resume stays under 100,000 characters of JSON.",
"required": [
"basics"
]
},
"View": {
"type": "object",
"properties": {
"resumeId": {
"type": "string"
},
"url": {
"type": "string",
"description": "The resume page: it shows the resume and downloads the PDF."
},
"updatedAt": {
"type": "string",
"format": "date-time"
},
"template": {
"type": "string",
"enum": [
"classic",
"modern",
"compact"
],
"description": "Default classic."
},
"paper": {
"type": "string",
"enum": [
"Letter",
"A4"
],
"description": "Default Letter."
},
"color": {
"type": "string",
"enum": [
"ink",
"cobalt",
"navy",
"sage",
"brick",
"plum"
],
"description": "Heading color. Without it, Modern prints cobalt and the others ink."
},
"resume": {
"$ref": "#/components/schemas/Resume"
},
"text": {
"type": "string",
"description": "The resume as plain text, for application forms."
},
"pdf": {
"type": "string",
"description": "Where the PDF downloads."
}
}
},
"Created": {
"type": "object",
"properties": {
"resumeId": {
"type": "string"
},
"url": {
"type": "string",
"description": "Send this to the person."
},
"adminUrl": {
"type": "string",
"description": "Opens the editor on any device. Only for the person the resume is for."
},
"ownerKey": {
"type": "string",
"description": "Send as x-owner-key to change the resume. Only for the person the resume is for."
},
"template": {
"type": "string",
"enum": [
"classic",
"modern",
"compact"
],
"description": "Default classic."
},
"paper": {
"type": "string",
"enum": [
"Letter",
"A4"
],
"description": "Default Letter."
},
"color": {
"type": "string",
"enum": [
"ink",
"cobalt",
"navy",
"sage",
"brick",
"plum"
],
"description": "Heading color. Without it, Modern prints cobalt and the others ink."
},
"share": {
"type": "string"
}
}
},
"Error": {
"type": "object",
"properties": {
"error": {
"type": "string",
"description": "A sentence that says what to change."
}
},
"required": [
"error"
]
}
}
}
}
Change history
Quality pass: several resumes, cover letters, phone-readable shared pages
Bounded source sync
Bounded source sync
Bounded source sync