source code:

#import "@preview/nerd-icons:0.2.0": *
#change-nerd-font("jetbrainsmono nfm")
#set document(title: "Curriculum Vitae in Typst", author: "Matt Ji")
#set page(
  paper: "a4",
  margin: (left: 0.50in, right: 0.50in, top: 0.25in, bottom: 0.50in),
)

#let resume(json,pic) = block[
  #set text(lang: json.meta.language)
  #if pic {
  	place(right,image("profile.svg", width: 17%))
  	place(left,image("signature.png", width: 20%))
  } else {}
  #let header = {
    align(center)[
      #pad(bottom: 5pt)[
        #text(size: 24pt, weight: "bold")[#json.basics.name]
      ]
      #set text(size: 11pt)
  	  #for label in json.basics.altLabels [
  	  	#label
  	  ]
  
      #json.basics.location.city, #json.basics.location.region, #json.basics.location.countryCode
      
  
      #text([#json.basics.phone])
      |
      #link("mailto:"+json.basics.email)[#json.basics.email]
      
      #link(json.basics.url)[#text("Homepage")]
      #for profile in json.basics.profiles [
      	|
      	#link(profile.url)[#profile.network: #profile.username] 
      ]
    ]
  }
  #let experience_item(organization, role, startdate, enddate, body) = {
    set text(size: 11pt)
  
    block[
      #text(weight: "bold")[#organization]
      #if role != none {
        text(style: "italic")[#text(weight: "bold")[#role]]
      }
      #box(width: 1fr)[
        #align(right)[#text(size: 8pt)[#startdate \- #enddate]]
      ]
    ]
    for highlight in body [
  		• #highlight
  	] 
  }
  #let project_item(name, keywords, body) = {
    set text(size: 11pt)
    block[
        #text(weight: "bold")[#name]
        #box(width: 1fr)
        #for keyword in keywords [
  		#keyword
  		]		
    ]
    for highlight in body [
  	• #highlight
  	]
  }
  #let education_item(school, role, startdate,enddate, body) = {
    set text(size: 11pt)
  
    block[
      #text(weight: "bold")[#school]
      #if role != none {
        text(style: "italic")[#text(weight: "bold")[#role]]
      }
      #box(width: 1fr)[
        #align(right)[#text(size: 8pt)[#startdate \- #enddate]]
    ]
    ]
    for course in body [
  	• #course
  	]
  }
  
  #header
  
  == Skills:
  bash Python HTML CSS NixOS Go HTMX Docker JavaScript Linux PDF Typst
  == Experience:
  #for job in json.work [
  	#experience_item(job.name,job.position,job.startDate,job.endDate,job.highlights)
  ]
  == Projects:
  #for project in json.projects [
  	#project_item(project.name,project.keywords,project.highlights)
  ]
  == Education:
  #for school in json.education [
  	#education_item(school.institution, school.studyType,school.startDate,school.endDate,school.courses)
  ]
  
  == Language:
  #for language in json.languages [
  • #language.language: #language.fluency
  ]
]

#context [
  #set text(font: "JetBrainsMono NFM")
  #set-favorite-nf-prefix("dev")
  #show "Docker": name => box[#nf-icon("nf-seti-docker") #name]
  #show "NixOS": name => box[#nf-icon("nixos") #name]
  #show "Lua": name => box[#nf-icon("lua") #name]
  #show "Go": name => box[#nf-icon("nf-seti-go") #name]
  #show "HTML": name => box[#nf-icon("html") #name]
  #show "CSS": name => box[#nf-icon("css") #name]
  #show "Vim": name => box[#nf-icon("vim") #name]
  #show "Python": name => box[#nf-icon("python") #name]
  #show "bash": name => box[#nf-icon("terminal_bash") #name]
  #show "JavaScript": name => box[#nf-icon("javascript") #name]
  #show "React": name => box[#nf-icon("react") #name] 
  #show "HTMX": name => box[#nf-icon("html") #name]
  #show "Linux": name => box[#nf-icon("linux") #name]
  #show "Windows": name => box[#nf-icon("windows") #name]
  #show "C++": name => box[#nf-icon("c") #name]
  #show "LLM": name => box[#nf-icon("robot") #name]
  #show "solar": name => box[#nf-icon("sun") #name]
  #show "database": name => box[#nf-icon("database") #name]
  #show "Kubernetes": name => box[#nf-icon("kubernetes") #name]
  #show "GitHub:": name => box[#nf-icon("nf-cod-github_alt")]
  #show "LinkedIn:": name => box[#nf-icon("linkedin")]
  #show "XING:": name => box[#nf-icon("xing")]
  // #set-favorite-nf-prefix("seti")
  #show "Excel": name => box[#nf-icon("nf-seti-excel") #name]
  #show "Word": name => box[#nf-icon("nf-seti-word") #name]
  #show "Typst": name => box[#nf-icon("nf-linux-typst") #name]
  #show "PDF": name => box[#nf-icon("nf-fa-file_pdf") #name]
  #show "Markdown": name => box[#nf-icon("nf-cod-markdown") #name]
  #resume(json("resume.json"),true )
]