diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..757fee3
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+/.idea
\ No newline at end of file
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..b52f72c
--- /dev/null
+++ b/README.md
@@ -0,0 +1,15 @@
+# SimpleCV
+SimpleCV is simple and elegant CV template written in [Typst](https://typst.app/)
+aimed at (but not limited to!) people with an engineering background. The template was
+inspired by two Latex CV templates([[1]](https://www.overleaf.com/latex/templates/autocv/scfvqfpxncwb),
+[[2]](https://www.overleaf.com/latex/templates/faangpath-simple-template/npsfpdqnxmbc)).
+Feel free to create open an issue if you have any questions or notice some error.
+
+# Usage
+Create a new Typst project and copy the whole content of the `source` directory
+into the project. Change the contents of the `main.typ` file according to your own needs. This should be it.
+You can find an example of what the CV looks like in `example.pdf`.
+
+# License
+The project itself is available under the MIT license. The icons are
+from FontAwesome and subject their [their license agreement](https://github.com/FortAwesome/Font-Awesome/blob/6.x/LICENSE.txt).
\ No newline at end of file
diff --git a/example.pdf b/example.pdf
new file mode 100644
index 0000000..487578f
Binary files /dev/null and b/example.pdf differ
diff --git a/source/email.svg b/source/email.svg
new file mode 100644
index 0000000..e564cad
--- /dev/null
+++ b/source/email.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/source/github.svg b/source/github.svg
new file mode 100644
index 0000000..81b1073
--- /dev/null
+++ b/source/github.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/source/linkedin.svg b/source/linkedin.svg
new file mode 100644
index 0000000..dc1e36d
--- /dev/null
+++ b/source/linkedin.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/source/main.typ b/source/main.typ
new file mode 100644
index 0000000..5ccb214
--- /dev/null
+++ b/source/main.typ
@@ -0,0 +1,109 @@
+#import template, education_entry, work_entry, skill_entry from "simplecv.typ"
+
+// Change the margins of the cv.
+#set page(margin: (x: 1.5cm, y: 0.5cm))
+
+// Change the overall text size of the cv. Might be useful if you want to add/remove content so that everything still stays on one page.
+#set text(12pt)
+
+// Change the font of the cv.
+#set text("Linux Libertine")
+
+// Change the theme color of the cv.
+#let color = blue
+
+// Change to your name.
+#let name = "John Doe"
+
+// Change the shown contact data. You can also change the order of the elements so that they will show up in a different order. Currently, only these five elements are available with icons, but you can add new ones by editing the template.
+#let contact_data = (
+ (
+ "service": "linkedin",
+ "display": "John Doe",
+ "link": "https://www.linkedin.com/in/JohnDoe"
+ ),
+ (
+ "service": "email",
+ "display": "john@johndoe.com",
+ "link": "mailto://john@johndoe.com"
+ ),
+ (
+ "service": "phone",
+ "display": "+1 123 456 789",
+ "link": "tel:+1 123 456 789"
+ ),
+ (
+ "service": "github",
+ "display": "JohnDoe",
+ "link": "https://github.com/JohnDoe"
+ ),
+ (
+ "service": "website",
+ "display": "mywebsite.com",
+ "link": "https://mywebsite.com"
+ )
+)
+
+// Leave this unchanged. This puts the name and contact data in the right spot.
+#show doc => template(name, contact_data, color, doc)
+
+// Starting from here, you can add as much content as you want. This represents the main content of the cv.
+= Education
+#education_entry("Computer Science", "ETH Zürich",
+degree_title: "MSc.", start_date: "Sep 2016", end_date: "Jul 2018",
+description: lorem(9), location: "Munich, Germany")
+
+#education_entry("Computer Science", "Stanford University",
+degree_title: "BSc.", start_date: "Sep 2012", end_date: "Jul 2016",
+description: lorem(12), location: "California, USA")
+
+= Experience
+#work_entry("Senior Software Engineer", "Microsoft", start_date: "Since Nov 2021", tasks: (
+ lorem(7),
+ lorem(13),
+ lorem(9)
+),
+location: "Seattle, USA")
+
+#work_entry("Senior Software Engineer", "Apple", start_date: "Jan 2020", end_date: "Oct 2021", tasks: (
+ lorem(4),
+ lorem(6),
+ lorem(14)
+ ),
+location: "California, USA")
+
+#work_entry("Junior Software Engineer", "Google", start_date: "Oct 2018", end_date: "Nov 2019", tasks: (
+ lorem(8),
+ lorem(12),
+ lorem(3)
+ ),
+location: "Zurich, Switzerland")
+
+= Projects
+*Project 1*. #lorem(40)
+
+*Project 2*. #lorem(32)
+
+*Project 3*. #lorem(40)
+
+= Skills
+// Ratings won't be displayed in this template.
+#skill_entry("Technologies",
+ (
+ ("name": "Git", "rating": 3),
+ ("name": "C++", "rating": 2),
+ ("name": "Python", "rating": 5),
+ ("name": "Typst", "rating": 3),
+ ("name": "JavaScript", "rating": 4),
+ ("name": "Vue.js", "rating": 4),
+ )
+)
+
+#skill_entry("Languages",
+ (
+ ("name": "English", "rating": 5),
+ ("name": "German", "rating": 5),
+ ("name": "Spanish", "rating": 3),
+ ("name": "Japanese", "rating": 2),
+ )
+)
\ No newline at end of file
diff --git a/source/phone.svg b/source/phone.svg
new file mode 100644
index 0000000..95e90c3
--- /dev/null
+++ b/source/phone.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/source/simplecv.typ b/source/simplecv.typ
new file mode 100644
index 0000000..af87203
--- /dev/null
+++ b/source/simplecv.typ
@@ -0,0 +1,138 @@
+// Based on https://www.overleaf.com/latex/templates/autocv/scfvqfpxncwb and https://www.overleaf.com/latex/templates/faangpath-simple-template/npsfpdqnxmbc
+
+#set list(indent: 1em)
+// Reduce space between paragraphs.
+#let par_space = 0.5em
+// Reduce space between headings and descriptions.
+#let sep_space = par_space + 0.2em
+
+// Format start and end dates.
+#let format_date(start_date: none, end_date: none) = {
+ let date = {
+ if end_date == none {
+ start_date
+ } else if start_date == none {
+ end_date
+ } else {
+ start_date + " - " + end_date
+ }
+ }
+
+ [*#date*]
+}
+
+// Format locations.
+#let format_location(location) = {
+ [_#block(above: sep_space, location)_]
+}
+
+// General entry that is split into a left and right half (for experience and education).
+#let cv_entry(left_content: none, right_content: none) = {
+ grid(
+ columns: (11fr, 6fr),
+ column-gutter: 1cm,
+ {
+ set align(left)
+ left_content
+ },
+ {
+ set align(right)
+ right_content
+ }
+ )
+}
+
+// Entry for education.
+#let education_entry(degree, university, degree_title: none, description: none, start_date: none, end_date: none, location: none) = {
+ cv_entry(
+ left_content: {
+ if degree_title != none {
+ [*#degree_title*] + " "
+ } + [*#degree*] + [ (#university)] + block(above: sep_space, par[#description])
+ },
+ right_content: {
+ format_date(start_date: start_date, end_date: end_date)
+
+ if location != none {
+ "\n" + format_location(location)
+ }
+ }
+ )
+}
+
+// Entry for work.
+#let work_entry(role, company, tasks: none, start_date: none, end_date: none, location: none) = {
+ cv_entry(
+ left_content: {
+ [*#role*] + "\n" + block(above: sep_space, text[#company])
+
+ if tasks != none {
+ let tasks_list = []
+
+ for task in tasks {
+ tasks_list += [- #task]
+ }
+
+ tasks_list
+ }
+ },
+ right_content: {
+ format_date(start_date: start_date, end_date: end_date)
+
+ if location != none {
+ "\n" + format_location(location)
+ }
+ }
+ )
+}
+
+// Entry for skills
+#let skill_entry(category, skills) = {
+ [== #category]
+
+ let cell = rect.with(radius: 5pt, inset: 4pt)
+ let boxes = for skill in skills {(cell(skill.name),)}
+
+ {boxes.join(" ")}
+}
+
+// Set name and contact data and format headings
+#let template(name, contact_data, color, doc) = {
+ set par(justify: true, leading: par_space)
+ align(center)[
+ #smallcaps(text(size: 2.5em, fill: color)[#name]) \
+
+ {
+ if contact_data != none and contact_data.len() > 0 {
+ let elements = for el in contact_data {
+ (link(el.link)[{box(image(height: 0.7em, el.service + ".svg")) + " " + el.display}],)
+ }
+ elements.join(" | ")
+ }
+ }
+ ]
+
+ show heading.where(level: 1): i => {
+ set align(left)
+ let title = smallcaps(i.title)
+
+ set block(above: 1em)
+ set text(weight: "light", size: 1.2em, fill: color)
+ stack(
+ dir: ttb,
+ spacing: 2mm,
+ [{title}],
+ line(length: 100%, stroke: color)
+ )
+ }
+
+ show heading.where(level: 2): i => {
+ set align(left)
+ let title = smallcaps(i.title)
+ set block(above: 0.8em)
+ set text(weight: "light", size: 1.1em, fill: color)
+ [{i.title}]
+ }
+
+ doc
+}
diff --git a/source/website.svg b/source/website.svg
new file mode 100644
index 0000000..06aa71e
--- /dev/null
+++ b/source/website.svg
@@ -0,0 +1 @@
+
\ No newline at end of file