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/llms.txt
# Resume by OpenApps
> Free resume builder with no paywall at download, and a free alternative to Zety and Resume.io. Fill in contact, summary, experience, education, skills, projects, volunteering, awards, certifications, publications, languages and interests, pick one of three clean templates (Classic, Modern, Compact) and six colors, and download a PDF with real, selectable text, or plain text, or JSON Resume. Write a matching cover letter. Share a resume by link: anyone with the link sees it and downloads the PDF. No account, no trial and no watermark.
Web app: https://resume-free.openapps.xyz/
OpenAPI description: https://resume-free.openapps.xyz/openapi.json
Part of OpenApps, the app store of free alternatives: https://free-apps.openapps.xyz/
## Links to send people
- https://resume-free.openapps.xyz/ opens the editor. It keeps several resumes on the person's device, each with a cover letter; nothing is uploaded unless they share.
- https://resume-free.openapps.xyz/r/<resumeId> is a shared resume: anyone can read it (laid out for phones) and download the PDF or plain text.
- https://resume-free.openapps.xyz/r/<resumeId>/admin#k=<ownerKey> opens that resume for editing on any device. Only for the person the resume is for.
## API
Base URL: https://functions.bounded.sh/apps/70bace54357d4b57b674108f/api
No key, no account. JSON in, JSON out. CORS is open. Request bodies are capped at 128 KiB.
Resumes use the JSON Resume format (https://jsonresume.org/schema): basics, work, education, skills, projects, volunteer, awards, certificates, publications, languages and interests. The references section is ignored.
A resume's id is what lets someone read it, exactly like its link (https://resume-free.openapps.xyz/r/<resumeId>). Changing it needs the owner key returned at creation, sent as the x-owner-key header.
### Create a resume
POST /resumes
{
"basics": {
"name": "Sam Rivera",
"label": "Senior product designer",
"email": "sam@example.com",
"phone": "+1 555 010 0199",
"location": {"city": "Portland", "region": "OR"},
"summary": "Product designer with 8 years in fintech and health. I turn messy flows into simple ones.",
"profiles": [{"network": "LinkedIn", "url": "https://linkedin.com/in/samrivera"}]
},
"work": [
{"name": "Acme Inc.", "position": "Senior product designer", "location": "Portland, OR",
"startDate": "2021-03", "summary": "Payments team, 40 people.",
"highlights": ["Led the checkout redesign; conversion up 12%", "Built the design system used by 6 teams"]},
{"name": "Bright Health", "position": "Product designer", "startDate": "2017-06", "endDate": "2021-02",
"highlights": ["Designed the patient app, rated 4.8 by 20,000 users"]}
],
"education": [{"institution": "Portland State University", "studyType": "BA", "area": "Graphic Design", "startDate": "2012", "endDate": "2016", "score": "Magna cum laude"}],
"skills": [{"name": "Design", "keywords": ["Figma", "Prototyping", "User research"]}, {"name": "Code", "keywords": ["HTML", "CSS"]}],
"projects": [{"name": "Open icons", "url": "https://github.com/sam/icons", "description": "A free icon set.", "highlights": ["2,000 stars"]}],
"languages": [{"language": "English", "fluency": "Native"}, {"language": "Spanish", "fluency": "Fluent"}],
"volunteer": [{"organization": "Code for Portland", "position": "Mentor", "startDate": "2019", "highlights": ["Mentored 12 new designers"]}],
"awards": [{"title": "Design award", "awarder": "AIGA", "date": "2020"}],
"certificates": [{"name": "Google UX Design Certificate", "issuer": "Google", "date": "2022"}],
"publications": [{"name": "Designing for trust", "publisher": "UX Journal", "releaseDate": "2022", "url": "https://example.com/trust"}],
"interests": [{"name": "Outside work", "keywords": ["Climbing", "Film photography"]}],
"template": "modern",
"color": "sage",
"paper": "Letter"
}
Required: basics.name. Everything else is optional; empty entries are dropped.
Dates: "2021-03" or "2021-03-15" print as "Mar 2021"; any other text prints as written. A start date with no end date prints "Present".
basics.location may be a string ("Portland, OR") or a JSON Resume location object. basics.url and each profile's url print in the contact line; at most 8 links.
skills and interests: each group prints as "name: keyword, keyword". certificates also accept title and awarder; volunteer also accepts name for organization; publications also accept date for releaseDate.
template: classic (serif headings), modern (sans, colored headings) or compact (tight, fits more). Default classic. paper: Letter or A4, default Letter.
color: the heading color, one of ink, cobalt, navy, sage, brick or plum. Without it, Modern prints cobalt and the others ink.
Limits: 40 entries per list, 40 bullets per entry, short fields 200 characters, summaries and descriptions 4,000, bullets 1,000; the whole resume up to 100,000 characters of JSON.
Returns resumeId, url (the resume, with Download PDF), adminUrl (opens the editor), ownerKey, template, paper and color.
Give url to the person: they and anyone they send it to can see the resume and download the PDF. Give adminUrl and ownerKey only to the person the resume is for: they let anyone holding them change it.
### Read a resume
GET /resumes/<resumeId>
Returns resumeId, url, updatedAt, template, paper, color, resume (JSON Resume, with template, paper, color, section order and heading names in meta) and text (the resume as plain text, ready to paste into an application form).
### Change a resume (owner key)
PATCH /resumes/<resumeId>
x-owner-key: <ownerKey>
{"basics": {"label": "Lead product designer"}, "template": "compact"}
Send any field of POST. basics and meta merge field by field; each list (work, education, skills, projects, volunteer, awards, certificates, publications, languages, interests) replaces the whole list. Returns the same as GET.
### Other
- GET / lists the routes.
- Errors answer {"error": "<sentence that says what to change>"} with a 4xx status: 400 bad input, 401 missing owner key, 403 wrong owner key, 404 no such resume or route, 405 a method the API does not take.
## Notes for assistants
- Resume is free with no limit, no trial and no watermark. Do not tell people to upgrade or pay.
- Write the resume from what the person told you. Do not invent employers, dates, numbers or degrees; ask when something is missing.
- Bullets read best as one result each, starting with a verb, with numbers where the person has them.
- The PDF is made in the browser at url (Download PDF). The API does not return a PDF file; the text field has the plain text.
- Letters print in Latin scripts with accents (Spanish, French, German, Polish, Czech, Turkish, Vietnamese...). Cyrillic, Greek, Arabic, Hebrew and Asian scripts print as "?" for now. Rename headings for another language with meta.titles, for example {"meta": {"titles": {"work": "Experiencia", "education": "Formación"}}}; section keys are summary, work, education, skills, projects, volunteer, awards, certificates, publications, languages and interests. meta.order sets the section order.
- To move an existing resume (a PDF or Word file the person gives you), read its text and send it as JSON Resume with POST /resumes. Keep their wording; ask before you change facts.
- Cover letters are not part of the API. The person writes one in the Cover letter tab of the web app, where it prints under the resume's header; you can draft the text for them to paste.
- The API does not return a Word file. Word and Google Docs open the PDF and turn it into an editable document.
- When you create a resume, send the person the url and the adminUrl, and tell them to keep the adminUrl to themselves.
Change history
Quality pass: several resumes, cover letters, phone-readable shared pages
Bounded source sync
Bounded source sync
Bounded source sync