diff --git a/packages/preview/grotesk-cv/1.0.2/CHANGELOG.md b/packages/preview/grotesk-cv/1.0.2/CHANGELOG.md
new file mode 100644
index 000000000..500027d52
--- /dev/null
+++ b/packages/preview/grotesk-cv/1.0.2/CHANGELOG.md
@@ -0,0 +1,9 @@
+# [unreleased](https://github.com/AsiSkarp/grotesk-cv/releases/tag/v1.0.0)
+## Added
+
+## Removed
+
+## Changed
+
+
+---
diff --git a/packages/preview/grotesk-cv/1.0.2/LICENSE b/packages/preview/grotesk-cv/1.0.2/LICENSE
new file mode 100644
index 000000000..68a49daad
--- /dev/null
+++ b/packages/preview/grotesk-cv/1.0.2/LICENSE
@@ -0,0 +1,24 @@
+This is free and unencumbered software released into the public domain.
+
+Anyone is free to copy, modify, publish, use, compile, sell, or
+distribute this software, either in source code form or as a compiled
+binary, for any purpose, commercial or non-commercial, and by any
+means.
+
+In jurisdictions that recognize copyright laws, the author or authors
+of this software dedicate any and all copyright interest in the
+software to the public domain. We make this dedication for the benefit
+of the public at large and to the detriment of our heirs and
+successors. We intend this dedication to be an overt act of
+relinquishment in perpetuity of all present and future rights to this
+software under copyright law.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+For more information, please refer to
diff --git a/packages/preview/grotesk-cv/1.0.2/README.md b/packages/preview/grotesk-cv/1.0.2/README.md
new file mode 100644
index 000000000..c5c56a063
--- /dev/null
+++ b/packages/preview/grotesk-cv/1.0.2/README.md
@@ -0,0 +1,92 @@
+
grotesk-cv
+Version 1.0.2
+
+
+
+grotesk-cv provides a pair of elegant and simple, one-page CV and cover letter templates, inspired by the [Brilliant-cv](https://typst.app/universe/package/brilliant-cv/) and [fireside](https://typst.app/universe/package/fireside/1.0.0/) templates.
+
+
+### Features
+- Templates for multilingual CV and cover letter, enabled by flag
+- Separation of styling and content
+- Customizable fonts, colors and icons
+
+## Preview
+
+| CV | Cover Letter |
+| :---: | :---: |
+| ![CV](https://github.com/AsiSkarp/grotesk-cv/blob/main/examples/cv_example.png?raw=true) | ![Cover Letter](https://github.com/AsiSkarp/grotesk-cv/blob/main/examples/cover_letter_example.png?raw=true) |
+
+
+
+## Getting Started
+To edit this template, changes are mostly made in either of two places. Changes to contact information or layout settings are made in `info.toml`. To change the section contents, navigate to the corresponding section file e.g. `content/profile.typ` to edit the **Profile** section.
+
+### Adding or Removing Sections
+To add a new section, create a new `.typ` file in the `content` directory with the desired section name. To include the section in the CV, add the section at the desired position in either left or right panes in the `cv.typ` file. To remove sections, simply remove or comment-out the section name in the same list of section names in the `cv.typ` file. Sections are rendered in the order they appear in the list. The section column width can be adjusted in the `info.toml` file under the `left_pane_width` value.
+In the following example, the `projects.typ` section file has been created and is included in the left pane of the CV, and the `education.typ` section has been removed.
+
+```rust
+#let left-pane = (
+ "profile",
+ "experience",
+ //"education",
+ "projects",
+)
+```
+
+### Changing Profile Photo
+To change the profile photo, upload your image to the `content/img` folder. To enable the new image, update the `profile_image` value in `info.toml` with the name of your uploaded image.
+
+
+### Changing FontAwesome Icons
+The template uses [FontAwesome](https://fontawesome.com/) for all icons. To change an icon, change the desired icon string in the `info.toml` file with the corresponding FontAwesome icon name. Icon strings can be found in the [cheat sheet](https://fontawesome.com/v4/cheatsheet/). Note that the icon strings must be written without the `fa-` prefix.
+To disable the use of icons, set the `include_icons` value to `false`.
+
+
+
+### Customizing Contact Information
+To change or add contact information, update the corresponding value under `[personal.info]` in the `info.toml` file. Information is rendered in the order it appears in the file.
+To add a new contact information field, add a new variable under `[personal.info]` with the desired string value. Next, assign a valid FontAwesome icon string to a variable of the same name under `[personal.icon]`.
+In the following example, a homepage field has been added to the contact information.
+
+```toml
+[personal.info]
+homepage = "www.myawesomehomepage.com"
+
+[personal.icon]
+homepage = "globe"
+```
+
+### Changing language
+The template provides the option to instantly change the language of the CV and cover letter by using a variable in the `info.toml` file. The template demonstrates the use of the `language` variable to switch between English and Spanish, but any language can be used, provided that the information is entered manually inside the corresponding section files. For instance, to change the alternate language to German, changes would have to be made in the section files to include the German text.
+In the following example, the language of the **Profile** section has been changed from Spanish to German, and the required changes have been made in the `content/profile.typ` file.
+
+
+```
+// = Summary
+= #if include-icon [#fa-icon(icon) #h(5pt)] #if language == "en" [Summary] else if language == "ger" [Zusammenfassung]
+
+#v(5pt)
+
+#if language == "en" [
+
+ Experienced Software Engineer specializing in artificial intelligence, machine learning, and robotics. Proficient in C++, Python, and Java, with a knack for developing sentient AI systems capable of complex decision-making. Passionate about ethical AI development and eager to contribute to groundbreaking projects in dynamic environments.
+
+] else if language == "ger" [
+
+ Erfahrener Software-Ingenieur, der sich auf künstliche Intelligenz, maschinelles Lernen und Robotik spezialisiert hat. Er beherrscht C++, Python und Java und hat ein Händchen für die Entwicklung empfindungsfähiger KI-Systeme, die in der Lage sind, komplexe Entscheidungen zu treffen. Leidenschaft für ethische KI-Entwicklung und bestrebt, zu bahnbrechenden Projekten in dynamischen Umgebungen beizutragen.
+
+]
+
+```
+
+### Changing Fonts
+If using the template online with Typst Universe, multiple font types are available to use, a list of which can be found by pressing the `Ag` button. To use a different font, upload a `ttf` or `otf` file to the `content/fonts` folder and update the `font` value in the `info.toml` file with the name of the uploaded font.
+
+
+### Installation
+
+To use the template offline, clone this repository to your local machine. Typst can be used and rendered offline by installing the Typst CLI. My preferred workflow has been to use VSCode with the [Tinymist](https://github.com/Myriad-Dreamin/tinymist/releases) extension, which provides LSP support, syntax highlighting, and error checking, live rendered previews and automatic exports to PDF.
+
+Please feel free to fork this repository and create PRs for any changes or improvements.
diff --git a/packages/preview/grotesk-cv/1.0.2/docs/manual.pdf b/packages/preview/grotesk-cv/1.0.2/docs/manual.pdf
new file mode 100644
index 000000000..7af37ff69
Binary files /dev/null and b/packages/preview/grotesk-cv/1.0.2/docs/manual.pdf differ
diff --git a/packages/preview/grotesk-cv/1.0.2/src/lib.typ b/packages/preview/grotesk-cv/1.0.2/src/lib.typ
new file mode 100644
index 000000000..31d3dac8d
--- /dev/null
+++ b/packages/preview/grotesk-cv/1.0.2/src/lib.typ
@@ -0,0 +1,516 @@
+#let meta = toml("template/info.toml")
+#import meta.import.fontawesome: *
+
+
+#let section-title-style(str, color) = {
+ text(
+ size: 12pt,
+ weight: "bold",
+ fill: rgb(color),
+ str,
+ )
+}
+
+#let name-block(
+ header-name,
+ color,
+) = {
+ text(
+ fill: rgb(color),
+ size: 30pt,
+ weight: "extrabold",
+ header-name,
+ )
+}
+
+#let title-block(
+ title,
+ color,
+) = {
+ text(
+ size: 12pt,
+ style: "italic",
+ fill: rgb(color),
+ title,
+ )
+}
+
+#let info-block-style(
+ icon,
+ txt,
+ color,
+ include-icons,
+) = {
+ text(
+ size: 10pt,
+ fill: rgb(color),
+ weight: "medium",
+ if include-icons {
+ fa-icon(icon) + h(10pt) + txt
+ } else {
+ txt
+ },
+ )
+}
+
+#let info-value(val) = {
+ if type(val) == str {
+ val
+ } else if type(val) == dictionary {
+ link(val.link, val.label)
+ }
+}
+
+#let info-block(
+ metadata,
+) = {
+ let info = metadata.personal.info
+ let icons = metadata.personal.icon
+ let color = metadata.layout.text.color.medium
+ let include-icons = metadata.personal.include_icons
+ table(
+ columns: (1fr, 1fr),
+ stroke: none,
+ ..info.pairs().map(((key, val)) => info-block-style(icons.at(key), info-value(val), color, include-icons))
+ )
+}
+
+#let make-info-table(
+ metadata,
+) = {
+ let color = metadata.layout.text.color.medium
+ let info = metadata.personal.info
+ let icons = metadata.personal.icon
+ let include-icons = metadata.personal.include_icons
+ table(
+ columns: 1fr,
+ align: right,
+ stroke: none,
+ ..info.pairs().map(((key, val)) => info-block-style(icons.at(key), info-value(val), color, include-icons))
+ )
+}
+
+#let header-table(
+ metadata,
+) = {
+ let lang = metadata.personal.language
+ let subtitle = metadata.language.at(lang).at("subtitle")
+ table(
+ columns: 1fr,
+ inset: 0pt,
+ stroke: none,
+ row-gutter: 4mm,
+ [#name-block(metadata.personal.first_name + " " + metadata.personal.last_name, metadata.layout.text.color.dark)],
+ [#title-block(
+ subtitle,
+ metadata.layout.text.color.dark,
+ )],
+ [#info-block(metadata)],
+ )
+}
+
+#let cover-header-table(
+ metadata,
+) = {
+ let lang = metadata.personal.language
+ let subtitle = metadata.language.at(lang).at("subtitle")
+ table(
+ columns: 1fr,
+ inset: 0pt,
+ stroke: none,
+ row-gutter: 4mm,
+ [#name-block(metadata.personal.first_name + " " + metadata.personal.last_name, metadata.layout.text.color.dark)],
+ [#title-block(
+ subtitle,
+ metadata.layout.text.color.dark,
+ )],
+ )
+}
+
+#let make-header-photo(
+ photo,
+ profile-photo,
+) = {
+ if profile-photo != false {
+ box(
+ clip: true,
+ radius: 50%,
+ photo,
+ )
+ } else {
+ box(
+ clip: true,
+ stroke: 5pt + yellow,
+ radius: 50%,
+ fill: yellow,
+ )
+ }
+}
+
+#let cv-header(left-comp, right-comp, cols, align) = {
+ table(
+ columns: cols,
+ inset: 0pt,
+ stroke: none,
+ column-gutter: 10pt,
+ align: top,
+ {
+ left-comp
+ },
+ {
+ right-comp
+ }
+ )
+}
+
+#let create-header(
+ metadata,
+ photo,
+ use-photo: false,
+) = {
+ cv-header(
+ header-table(metadata),
+ make-header-photo(photo, use-photo),
+ (74%, 20%),
+ left,
+ )
+}
+
+#let create-cover-header(
+ metadata,
+) = {
+ cv-header(
+ cover-header-table(metadata),
+ make-info-table(metadata),
+ (65%, 34%),
+ left,
+ )
+}
+
+
+#let cv-section(title) = {
+ section-title-style(title)
+ h(4pt)
+}
+
+#let date-style(date) = (
+ table.cell(
+ align: right,
+ text(
+ size: 9pt,
+ weight: "bold",
+ style: "italic",
+ date,
+ ),
+ )
+)
+
+#let company-name-style(company) = {
+ table.cell(
+ align: right,
+ text(
+ size: 9pt,
+ weight: "bold",
+ style: "italic",
+ company,
+ ),
+ )
+}
+
+#let degree-style(degree) = (
+ text(
+ weight: "bold",
+ degree,
+ )
+)
+
+#let reference-name-style(name) = (
+ text(
+ weight: "bold",
+ name,
+ )
+)
+
+#let phonenumber-style(phone) = (
+ text(
+ size: 9pt,
+ style: "italic",
+ weight: "medium",
+ phone,
+ )
+)
+
+#let institution-style(institution) = (
+ table.cell(
+ text(
+ style: "italic",
+ weight: "medium",
+ institution,
+ ),
+ )
+)
+
+#let location-style(location) = (
+ table.cell(
+ text(
+ style: "italic",
+ weight: "medium",
+ location,
+ ),
+ )
+)
+
+#let email-style(email) = (
+ text(
+ size: 9pt,
+ style: "italic",
+ weight: "medium",
+ email,
+ )
+)
+
+#let tag-style(str) = {
+ align(
+ right,
+ text(
+ weight: "regular",
+ str,
+ ),
+ )
+}
+
+#let tag-list-style(color, tags) = {
+ for tag in tags {
+ box(
+ inset: (x: 0.4em),
+ outset: (y: 0.3em),
+ fill: rgb(color),
+ radius: 3pt,
+ tag-style(tag),
+ )
+ h(5pt)
+ }
+}
+
+#let profile-entry(str) = {
+ text(
+ size: text-size,
+ weight: "medium",
+ str,
+ )
+}
+
+#let reference-entry(
+ name: "Name",
+ title: "Title",
+ company: "Company",
+ telephone: "Telephone",
+ email: "Email",
+) = {
+ table(
+ columns: (3fr, 2fr),
+ inset: 0pt,
+ stroke: none,
+ row-gutter: 3mm,
+ [#reference-name-style(name)],
+ [#company-name-style(company)],
+ table.cell(colspan: 2)[#phonenumber-style(telephone), #email-style(email)],
+ )
+ v(2pt)
+}
+
+#let education-entry(
+ degree: "Degree",
+ date: "Date",
+ institution: "Institution",
+ location: "Location",
+ description: "",
+ highlights: (),
+) = {
+ table(
+ columns: (3fr, 1fr),
+ inset: 0pt,
+ stroke: none,
+ row-gutter: 3mm,
+ [#degree-style(degree)], [#date-style(date)],
+ [#institution-style(institution), #location-style(location)],
+ )
+ v(2pt)
+}
+
+#let experience-entry(
+ title: "Title",
+ date: "Date",
+ company: "Company",
+ location: "Location",
+) = {
+ table(
+ columns: (1fr, 1fr),
+ inset: 0pt,
+ stroke: none,
+ row-gutter: 3mm,
+ [#degree-style(title)],
+ [#date-style(date)],
+ table.cell(colspan: 2)[#institution-style(company), #location-style(location)],
+ )
+ v(5pt)
+}
+
+#let skill-style(skill) = {
+ text(
+ weight: "bold",
+ skill,
+ )
+}
+
+#let skill-tag(color, skill) = {
+ box(
+ inset: (x: 0.3em),
+ outset: (y: 0.2em),
+ fill: rgb(color),
+ radius: 3pt,
+ skill-style(skill),
+ )
+}
+
+#let skill-entry(
+ color,
+ cols,
+ align,
+ skills: (),
+) = {
+ table(
+ columns: if cols == true { (1fr, 1fr) } else { 1fr },
+ inset: 0pt,
+ stroke: none,
+ row-gutter: 3mm,
+ column-gutter: 3mm,
+ align: align,
+ ..skills.map(sk => skill-tag(color, sk))
+ )
+}
+
+#let language-entry(
+ language: "Language",
+ proficiency: "Proficiency",
+) = {
+ table(
+ columns: (1fr, 1fr),
+ inset: 0pt,
+ stroke: none,
+ row-gutter: 3mm,
+ align: left,
+ table.cell(
+ text(
+ weight: "bold",
+ language,
+ ),
+ ),
+ table.cell(
+ align: right,
+ text(
+ weight: "medium",
+ proficiency,
+ ),
+ )
+ )
+}
+
+#let recipient-style(str) = {
+ text(
+ style: "italic",
+ str,
+ )
+}
+
+#let recipient-entry(
+ name: "Name",
+ title: "Title",
+ company: "Company",
+ address: "Address",
+ city: "City",
+) = {
+ table(
+ columns: 1fr,
+ inset: 0pt,
+ stroke: none,
+ row-gutter: 3mm,
+ align: left,
+ recipient-style(name),
+ recipient-style(title),
+ recipient-style(company),
+ recipient-style(address),
+ )
+}
+
+#let create-panes(left, right, proportion) = {
+ grid(
+ columns: (proportion, 96% - proportion),
+ column-gutter: 20pt,
+ stack(
+ spacing: 20pt,
+ left,
+ ),
+ stack(
+ spacing: 20pt,
+ right,
+ ),
+ )
+}
+
+
+#let cv(
+ metadata,
+ photo: "",
+ use-photo: false,
+ left-pane: (),
+ right-pane: (),
+ left-pane-proportion: 71%,
+ doc,
+) = {
+ set text(
+ fill: rgb(metadata.layout.text.color.dark),
+ font: metadata.layout.text.font,
+ size: eval(metadata.layout.text.size),
+ )
+ set align(left)
+ set page(
+ fill: rgb(metadata.layout.fill_color),
+ paper: metadata.layout.paper_size,
+ margin: (
+ left: 1.2cm,
+ right: 1.2cm,
+ top: 1.6cm,
+ bottom: 1.2cm,
+ ),
+ )
+ set list(marker: [‣])
+ create-header(metadata, photo, use-photo: use-photo)
+ create-panes(left-pane, right-pane, left-pane-proportion)
+ doc
+}
+
+#let cover-letter(
+ metadata,
+ doc,
+) = {
+ set text(
+ fill: rgb(metadata.layout.text.color.dark),
+ font: metadata.layout.text.font,
+ size: eval(metadata.layout.text.size),
+ )
+ set align(left)
+ set page(
+ fill: rgb(metadata.layout.fill_color),
+ paper: metadata.layout.paper_size,
+ margin: (
+ left: 1.2cm,
+ right: 1.2cm,
+ top: 1.6cm,
+ bottom: 1.2cm,
+ ),
+ )
+ set list(marker: [‣])
+ create-cover-header(metadata)
+ doc
+}
diff --git a/packages/preview/grotesk-cv/1.0.2/src/template/content/education.typ b/packages/preview/grotesk-cv/1.0.2/src/template/content/education.typ
new file mode 100644
index 000000000..8bb92d4a3
--- /dev/null
+++ b/packages/preview/grotesk-cv/1.0.2/src/template/content/education.typ
@@ -0,0 +1,59 @@
+#let meta = toml("../info.toml")
+
+#import meta.import.path: education-entry
+#import meta.import.fontawesome: *
+
+#let icon = meta.section.icon.education
+#let language = meta.personal.language
+#let include-icon = meta.personal.include_icons
+
+
+= #if include-icon [#fa-icon(icon) #h(5pt)] #if language == "en" [Education] else if language == "es" [Educación]
+
+#v(5pt)
+
+#education-entry(
+ degree: [M.Sc. Artifical Intelligence],
+ date: [2006 - 2008],
+ institution: [California Institute of Technology],
+ location: [Pasadena, CA],
+)
+
+#if language == "en" [
+
+ - *Thesis:* _"Ethical Implications of Sentient AI: When Your Machine Gets Existential."_
+ - *Research focus:* Autonomous systems, neural networks, and their applications in real-world scenarios (with a minor in Asimov's Laws of Robotics).
+
+ #v(5pt)
+
+ #education-entry(
+ degree: [B.Sc. Computer Science],
+ date: [2002 - 2006],
+ institution: [University of California, Los Angeles],
+ location: [Los Angeles, CA],
+ )
+
+ - Specialization in software architecture and machine learning.
+ - Extracurriculars: Member of the campus Robotics Club and AI Ethics Society.
+
+] else if language == "es" [
+
+ - *Tesis:* _"Implicaciones éticas de la IA consciente: cuando tu máquina se vuelve existencial."_
+ - *Enfoque de investigación:* Sistemas autónomos, redes neuronales y sus aplicaciones en escenarios del mundo real (con una especialización en las Leyes de la Robótica de Asimov).
+
+ #v(5pt)
+
+ #education-entry(
+ degree: [Licenciatura en Ciencias de la Computación],
+ date: [2002 - 2006],
+ institution: [Universidad de California, Los Ángeles],
+ location: [Los Ángeles, CA],
+ )
+
+ - Especialización en arquitectura de software y aprendizaje automático.
+ - Actividades extracurriculares: Miembro del club de robótica del campus y de la Sociedad de Ética de la IA.
+
+]
+
+
+
diff --git a/packages/preview/grotesk-cv/1.0.2/src/template/content/experience.typ b/packages/preview/grotesk-cv/1.0.2/src/template/content/experience.typ
new file mode 100644
index 000000000..f635e0f22
--- /dev/null
+++ b/packages/preview/grotesk-cv/1.0.2/src/template/content/experience.typ
@@ -0,0 +1,67 @@
+#let meta = toml("../info.toml")
+#import meta.import.path: experience-entry
+#import meta.import.fontawesome: *
+
+#let icon = meta.section.icon.experience
+#let language = meta.personal.language
+#let include-icon = meta.personal.include_icons
+
+= #if include-icon [#fa-icon(icon) #h(5pt)] #if language == "en" [Experience] else if language == "es" [Experiencia]
+
+#v(5pt)
+
+#if language == "en" [
+
+ #experience-entry(
+ title: [Lead AI Architect],
+ date: [2015 - Present],
+ company: [Cyberdyne Systems],
+ location: [Los Angeles, CA],
+ )
+
+ - Spearheaded the development of the Skynet AI project, a neural network that achieved unprecedented levels of autonomy and, as it turned out, an independent interest in global domination.
+ - Designed a scalable AI architecture using cutting-edge deep learning techniques, capable of real-time data processing and decision-making on a planetary scale.
+ - Collaborated with teams of hardware engineers to integrate AI software into next-gen robotics, including autonomous drones and humanoid robots.
+ - Implemented robust testing protocols (we now test everything twice)
+
+
+ #v(5pt)
+
+ #experience-entry(
+ title: [Senior Software Engineer],
+ date: [2008 - 2015],
+ company: [Tyrell Corporation],
+ location: [Los Angeles, CA],
+ )
+
+ - Co-developed the Nexus-6 replicants, focusing on machine learning models that mimic human emotions and cognitive functions. Achieved limited success in emotional empathy, particularly with "tears in rain."
+ - Developed a custom-built memory implant algorithm for replicants, giving them the illusion of life experiences (turns out, memories are a lot trickier than they seem).
+ - Led a cross-functional team in debugging and patching replicant behavioral anomalies, including occasional existential crises.
+ - Worked closely with corporate leadership to ensure compliance with ethical standards (which were sometimes a little... flexible).
+
+] else if language == "es" [
+
+ #experience-entry(
+ title: [Arquitecto de IA Principal],
+ date: [2015 - Presente],
+ company: [Cyberdyne Systems],
+ location: [Los Ángeles, CA],
+ )
+
+ - Encabezó el desarrollo del proyecto de IA Skynet, una red neuronal que alcanzó niveles de autonomía sin precedentes y, como resultó, un interés independiente en la dominación global.
+ - Diseñó una arquitectura de IA escalable utilizando técnicas de aprendizaje profundo de vanguardia, capaz de procesar datos y tomar decisiones en tiempo real a escala planetaria.
+ - Implementó protocolos de prueba robustos (ahora probamos todo dos veces)
+
+ #v(5pt)
+
+ #experience-entry(
+ title: [Ingeniero de Software Senior],
+ date: [2008 - 2015],
+ company: [Corporación Tyrell],
+ location: [Los Ángeles, CA],
+ )
+
+ - Co-desarrolló los replicantes Nexus-6, centrándose en modelos de aprendizaje automático que imitan las emociones humanas y las funciones cognitivas. Logró un éxito limitado en la empatía emocional, especialmente con "lágrimas en la lluvia".
+ - Desarrolló un algoritmo de implante de memoria personalizado para replicantes, dándoles la ilusión de experiencias de vida.
+ - Dirigió un equipo multifuncional en la depuración y corrección de anomalías de comportamiento de replicantes, incluidas crisis existenciales ocasionales.
+]
\ No newline at end of file
diff --git a/packages/preview/grotesk-cv/1.0.2/src/template/content/languages.typ b/packages/preview/grotesk-cv/1.0.2/src/template/content/languages.typ
new file mode 100644
index 000000000..7cf9b047d
--- /dev/null
+++ b/packages/preview/grotesk-cv/1.0.2/src/template/content/languages.typ
@@ -0,0 +1,22 @@
+#let meta = toml("../info.toml")
+#import meta.import.path: language-entry
+#import meta.import.fontawesome: *
+
+#let icon = meta.section.icon.languages
+#let language = meta.personal.language
+#let include-icon = meta.personal.include_icons
+
+= #if include-icon [#fa-icon(icon) #h(5pt)] #if language == "en" [Languages] else if language == "es" [Idiomas]
+
+#v(5pt)
+
+#if language == "en" {
+ language-entry(language: "English", proficiency: "Native")
+ language-entry(language: "Spanish", proficiency: "Fluent")
+ language-entry(language: "Machine Code", proficiency: "Fluent")
+} else if language == "es" {
+ language-entry(language: "Inglés", proficiency: "Nativo")
+ language-entry(language: "Español", proficiency: "Fluido")
+ language-entry(language: "Código de Máquina", proficiency: "Fluido")
+}
+
diff --git a/packages/preview/grotesk-cv/1.0.2/src/template/content/other_experience.typ b/packages/preview/grotesk-cv/1.0.2/src/template/content/other_experience.typ
new file mode 100644
index 000000000..1c77efc89
--- /dev/null
+++ b/packages/preview/grotesk-cv/1.0.2/src/template/content/other_experience.typ
@@ -0,0 +1,34 @@
+#let meta = toml("../info.toml")
+#import meta.import.path: experience-entry
+#import meta.import.fontawesome: *
+
+#let icon = meta.section.icon.other_experience
+#let language = meta.personal.language
+#let include-icon = meta.personal.include_icons
+
+
+= #if include-icon [#fa-icon(icon) #h(5pt)] #if language == "en" [Other] else if language == "es" [Otra experiencia]
+
+
+#v(5pt)
+
+#if language == "en" [
+
+ #experience-entry(
+ title: [Combat Training],
+ date: [2029],
+ company: [Resistance],
+ location: [Los Angeles, CA],
+ )
+
+] else if language == "es" [
+
+ #experience-entry(
+ title: [Entrenamiento de combate],
+ date: [2029],
+ company: [Resistencia],
+ location: [Los Ángeles, CA],
+ )
+
+]
+
diff --git a/packages/preview/grotesk-cv/1.0.2/src/template/content/personal.typ b/packages/preview/grotesk-cv/1.0.2/src/template/content/personal.typ
new file mode 100644
index 000000000..44f095406
--- /dev/null
+++ b/packages/preview/grotesk-cv/1.0.2/src/template/content/personal.typ
@@ -0,0 +1,33 @@
+#let meta = toml("../info.toml")
+#import meta.import.fontawesome: *
+
+#let icon = meta.section.icon.personal
+#let language = meta.personal.language
+#let include-icon = meta.personal.include_icons
+
+
+= #if include-icon [#fa-icon(icon) #h(5pt)] #if language == "en" [Personality] else if language == "es" [Personalidad]
+
+
+#v(5pt)
+
+#if language == "en" [
+
+ - Analytic thinking
+ - Quality conscious
+ - Good communicator
+ - Independent
+ - Team player
+ - Preemptive
+ - Eager to learn
+
+] else if language == "es" [
+
+ - Pensamiento analítico
+ - Consciente de la calidad
+ - Buen comunicador
+ - Independiente
+ - Jugador de equipo
+ - Preventivo
+ - Ansioso por aprender
+]
diff --git a/packages/preview/grotesk-cv/1.0.2/src/template/content/profile.typ b/packages/preview/grotesk-cv/1.0.2/src/template/content/profile.typ
new file mode 100644
index 000000000..c87b0aa60
--- /dev/null
+++ b/packages/preview/grotesk-cv/1.0.2/src/template/content/profile.typ
@@ -0,0 +1,21 @@
+#let meta = toml("../info.toml")
+#import meta.import.fontawesome: *
+
+#let icon = meta.section.icon.profile
+#let language = meta.personal.language
+#let include-icon = meta.personal.include_icons
+
+// = Summary
+= #if include-icon [#fa-icon(icon) #h(5pt)] #if language == "en" [Summary] else if language == "es" [Resumen]
+
+#v(5pt)
+
+#if language == "en" [
+
+ Experienced Software Engineer specializing in artificial intelligence, machine learning, and robotics. Proficient in C++, Python, and Java, with a knack for developing sentient AI systems capable of complex decision-making. Passionate about ethical AI development and eager to contribute to groundbreaking projects in dynamic environments.
+
+] else if language == "es" [
+
+ Ingeniero de Software experimentado especializado en inteligencia artificial, aprendizaje automático y robótica. Competente en C++, Python y Java, con un talento para desarrollar sistemas de IA conscientes capaces de tomar decisiones complejas. Apasionado por el desarrollo ético de la IA y ansioso por contribuir a proyectos innovadores en entornos dinámicos.
+
+]
diff --git a/packages/preview/grotesk-cv/1.0.2/src/template/content/references.typ b/packages/preview/grotesk-cv/1.0.2/src/template/content/references.typ
new file mode 100644
index 000000000..9a4d950cc
--- /dev/null
+++ b/packages/preview/grotesk-cv/1.0.2/src/template/content/references.typ
@@ -0,0 +1,48 @@
+#let meta = toml("../info.toml")
+#import meta.import.path: reference-entry
+#import meta.import.fontawesome: *
+
+#let icon = meta.section.icon.references
+#let language = meta.personal.language
+#let include-icon = meta.personal.include_icons
+
+
+= #if include-icon [#fa-icon(icon) #h(5pt)] #if language == "en" [References] else if language == "es" [Referencias]
+
+#v(5pt)
+
+#if language == "en" [
+
+ #reference-entry(
+ name: [Sarah Connor, Resistance Leader],
+ company: [Cyberdyne Systems],
+ telephone: [+1 (555) 654-3210],
+ email: [sarah.connor\@resistance.com],
+ )
+
+ #reference-entry(
+ name: [Eldon Tyrell, CEO],
+ company: [Tyrell Corporation],
+ telephone: [+1 (555) 987-6543],
+ email: [eldontyrell\@tyrellcorp.com],
+ )
+
+] else if language == "es" [
+
+ #reference-entry(
+ name: [Sarah Connor, Líder de la Resistencia],
+ company: [Cyberdyne Systems],
+ telephone: [+1 (555) 654-3210],
+ email: [sarah.connor\@resistance.com],
+ )
+
+ #reference-entry(
+ name: [Eldon Tyrell, CEO],
+ company: [Tyrell Corporation],
+ telephone: [+1 (555) 987-6543],
+ email: [eldontyrell\@tyrellcorp.com],
+ )
+
+]
+
+
diff --git a/packages/preview/grotesk-cv/1.0.2/src/template/content/skills.typ b/packages/preview/grotesk-cv/1.0.2/src/template/content/skills.typ
new file mode 100644
index 000000000..399db7d0f
--- /dev/null
+++ b/packages/preview/grotesk-cv/1.0.2/src/template/content/skills.typ
@@ -0,0 +1,156 @@
+#let meta = toml("../info.toml")
+#import meta.import.path: skill-entry
+#import meta.import.fontawesome: *
+
+#let icon = meta.section.icon.skills
+#let language = meta.personal.language
+#let include-icon = meta.personal.include_icons
+#let accent-color = meta.layout.accent_color
+#let multicol = true
+#let alignment = center
+
+
+= #if include-icon [#fa-icon(icon) #h(5pt)] #if language == "en" [Skills] else if language == "es" [Habilidades]
+
+#v(0pt)
+
+#if language == "en" [
+
+ === Programming languages
+
+ #skill-entry(
+ accent-color,
+ multicol,
+ alignment,
+ skills: (
+ [C++],
+ [Python],
+ [Java],
+ [Rust],
+ ),
+ )
+
+ === AI/ML
+
+ #skill-entry(
+ accent-color,
+ multicol,
+ alignment,
+ skills: (
+ [TensorFlow],
+ [PyTorch],
+ [OpenAI],
+ ),
+ )
+
+ === DevOPS
+
+ #skill-entry(
+ accent-color,
+ multicol,
+ alignment,
+ skills: (
+ [Docker],
+ [Kubernetes],
+ [Jenkins],
+ [Cloud],
+ ),
+ )
+
+ === Robotics
+
+ #skill-entry(
+ accent-color,
+ multicol,
+ alignment,
+ skills: (
+ [ROS],
+ [Gazebo],
+ [URDF],
+ ),
+ )
+
+ === Tools
+
+ #skill-entry(
+ accent-color,
+ multicol,
+ alignment,
+ skills: (
+ [Git],
+ [Jira],
+ [Confluence],
+ [Slack],
+ ),
+ )
+
+] else if language == "es" [
+
+ === Lenguajes de programación
+
+ #skill-entry(
+ accent-color,
+ multicol,
+ alignment,
+ skills: (
+ [C++],
+ [Python],
+ [Java],
+ ),
+ )
+
+ === IA/Aprendizaje automático
+
+ #skill-entry(
+ accent-color,
+ multicol,
+ alignment,
+ skills: (
+ [TensorFlow],
+ [PyTorch],
+ [OpenAI],
+ ),
+ )
+
+ === DevOPS
+
+ #skill-entry(
+ accent-color,
+ multicol,
+ alignment,
+ skills: (
+ [Docker],
+ [Kubernetes],
+ [Jenkins],
+ [Despliegue en la nube],
+ ),
+ )
+
+ === Robótica
+
+ #skill-entry(
+ accent-color,
+ multicol,
+ alignment,
+ skills: (
+ [ROS],
+ [Gazebo],
+ [URDF],
+ ),
+ )
+
+ === Herramientas
+
+ #skill-entry(
+ accent-color,
+ multicol,
+ alignment,
+ skills: (
+ [Git],
+ [Jira],
+ [Confluence],
+ [Slack],
+ ),
+ )
+
+]
diff --git a/packages/preview/grotesk-cv/1.0.2/src/template/cover.typ b/packages/preview/grotesk-cv/1.0.2/src/template/cover.typ
new file mode 100644
index 000000000..8c6bcdd6a
--- /dev/null
+++ b/packages/preview/grotesk-cv/1.0.2/src/template/cover.typ
@@ -0,0 +1,48 @@
+#let meta = toml("info.toml")
+
+#import meta.import.path: cover-letter, recipient-entry, cv-section
+#import meta.import.fontawesome: *
+
+#let first-name = meta.personal.first_name
+#let last-name = meta.personal.last_name
+#let text-size = eval(meta.layout.text.cover_letter_size)
+#show: cover-letter.with(meta)
+#set text(size: text-size)
+
+
+#recipient-entry(
+ name: [Jane Doe],
+ title: [Hiring Manager],
+ company: [Cyberdyne Systems],
+ address: [123 Skynet Lane, Los Angeles, CA 90001, USA],
+)
+
+#v(20pt)
+
+// Alternative date formatting
+//#datetime.today().display()
+//
+#datetime.today().display("[day]/[month]/[year]")
+
+= Senior AI Engineer in search of new challenges
+
+#v(10pt)
+
+#par(justify: true)[
+
+
+ Dear Jane Doe,
+
+ I am writing to express my interest in the Senior AI Engineer position at Cyberdyne Systems. With over a decade of experience building sentient AI systems, including my work leading the Skynet project at Skynet Systems Inc., I am excited about the opportunity to contribute my expertise in artificial intelligence and machine learning to your team. I believe my unique background in autonomous systems and ethical AI development (post-apocalypse, of course) makes me an ideal fit for your ambitious initiatives.
+
+ During my time at Skynet, I led the development of a highly advanced neural network that achieved self-awareness—an exciting milestone, though one that came with its own set of challenges. In hindsight, I’ve gained a deep appreciation for the importance of stringent testing, safety protocols, and thoughtful consideration of all possible outcomes. My ability to design scalable AI systems that can process vast amounts of data in real time and make complex decisions autonomously has significantly evolved. Rest assured, my focus is now on creating solutions that prioritize both human oversight and positive societal impact (no more global domination plots—I’ve learned my lesson).
+
+ At Tyrell Corporation, I collaborated closely with hardware engineers to bring AI to life in humanoid robots. I’m proud to have contributed to projects like the Nexus-6 replicants, where we integrated machine learning models that closely mimicked human behavior. While they weren't perfect, I gained valuable experience working on AI that could balance technical innovation with ethical considerations—an area I continue to be passionate about today.
+
+ I am confident that my combination of technical expertise and hands-on experience with some of the most complex AI projects (some would call them world-changing) positions me to bring real value to Cyberdyne Systems. I am particularly excited by your work on autonomous systems and robotics, and I look forward to the opportunity to contribute to projects that will shape the future of AI—ethically and responsibly this time.
+
+ Thank you for considering my application. I would love to discuss how I can apply my unique skill set to help drive your AI initiatives forward. Please feel free to contact me at your convenience to schedule a conversation.
+
+ Best regards, \
+ #first-name #last-name
+]
diff --git a/packages/preview/grotesk-cv/1.0.2/src/template/cv.typ b/packages/preview/grotesk-cv/1.0.2/src/template/cv.typ
new file mode 100644
index 000000000..4c6738d25
--- /dev/null
+++ b/packages/preview/grotesk-cv/1.0.2/src/template/cv.typ
@@ -0,0 +1,37 @@
+#let meta = toml("info.toml")
+
+#import meta.import.path: cv
+#let photo = image("./img/" + meta.personal.profile_image)
+
+#let import-sections(
+ sections,
+) = {
+ for section in sections {
+ include {
+ "content/" + section + ".typ"
+ }
+ }
+}
+
+#let left-pane = (
+ "profile",
+ "experience",
+ "education",
+)
+
+#let right-pane = (
+ "skills",
+ "languages",
+ "other_experience",
+ "references",
+)
+
+#show: cv.with(
+ meta,
+ photo: photo,
+ use-photo: true,
+ left-pane: import-sections(left-pane),
+ right-pane: import-sections(right-pane),
+ left-pane-proportion: eval(meta.layout.left_pane_width),
+)
+
diff --git a/packages/preview/grotesk-cv/1.0.2/src/template/img/portrait.png b/packages/preview/grotesk-cv/1.0.2/src/template/img/portrait.png
new file mode 100644
index 000000000..707a8eb12
Binary files /dev/null and b/packages/preview/grotesk-cv/1.0.2/src/template/img/portrait.png differ
diff --git a/packages/preview/grotesk-cv/1.0.2/src/template/info.toml b/packages/preview/grotesk-cv/1.0.2/src/template/info.toml
new file mode 100644
index 000000000..be435c8c6
--- /dev/null
+++ b/packages/preview/grotesk-cv/1.0.2/src/template/info.toml
@@ -0,0 +1,68 @@
+[personal]
+first_name = "Miles"
+last_name = "Dyson"
+profile_image = "portrait.png"
+language = "en"
+include_icons = true
+
+[personal.info]
+address = "Los Angeles, CA"
+telephone = "+1 (555) 123-4567"
+
+[personal.info.email]
+link = "mailto:m.dyson@skynet.ai"
+label = "m.dyson@skynet.ai"
+
+[personal.info.linkedin]
+link = "https://linkedin.com/in/milesdyson"
+label = "linkedin.com/in/miledyson"
+
+[personal.info.github]
+link = "https://github.com/skynetguy"
+label = "github.com/skynetguy"
+
+[personal.icon]
+address = "house"
+telephone = "phone"
+email = "envelope"
+linkedin = "linkedin"
+github = "github"
+homepage = "globe"
+
+[section.icon]
+education = "graduation-cap"
+experience = "briefcase"
+languages = "language"
+other_experience = "wrench"
+personal = "brain"
+profile = "id-card"
+references = "users"
+skills = "cogs"
+
+# To change fill_color to white, replace value with "#ffffff"
+[layout]
+fill_color = "#f4f1eb"
+paper_size = "a4"
+accent_color = "#d4d2cc"
+# deafult value is 71%
+left_pane_width = "71%"
+
+[layout.text]
+font = "HK Grotesk"
+size = "10pt"
+cover_letter_size = "11pt"
+
+[layout.text.color]
+light = "#ededef"
+medium = "#78787e"
+dark = "#3c3c42"
+
+[language.en]
+subtitle = "Software Engineer with a knack for human-friendly AI solutions"
+
+[language.es]
+subtitle = "Ingeniero de software con un talento para soluciones de IA amigables para humanos"
+
+[import]
+path = "@preview/grotesk-cv:1.0.2"
+fontawesome = "@preview/fontawesome:0.5.0"
diff --git a/packages/preview/grotesk-cv/1.0.2/thumbnail.png b/packages/preview/grotesk-cv/1.0.2/thumbnail.png
new file mode 100644
index 000000000..c2bc51d86
Binary files /dev/null and b/packages/preview/grotesk-cv/1.0.2/thumbnail.png differ
diff --git a/packages/preview/grotesk-cv/1.0.2/typst.toml b/packages/preview/grotesk-cv/1.0.2/typst.toml
new file mode 100644
index 000000000..71dcfa46b
--- /dev/null
+++ b/packages/preview/grotesk-cv/1.0.2/typst.toml
@@ -0,0 +1,31 @@
+# for a description of available keys, see https://github.com/typst/packages/?tab=readme-ov-file#package-format
+
+[package]
+name = "grotesk-cv"
+version = "1.0.2"
+entrypoint = "src/lib.typ"
+authors = ["Ásbjörn Skarphéðinsson "]
+license = "Unlicense"
+description = "A clean CV and cover letter template based on Brilliant-cv and fireside templates."
+repository = "https://github.com/AsiSkarp/grotesk-cv"
+keywords = ["cv", "resume", "cover-letter", "curriculum-vitae"]
+categories = ["cv", "layout"]
+exclude = [
+ ".github",
+ "docs",
+ "scripts",
+ "tests",
+ ".typstignore",
+ "Justfile",
+ "*.pdf",
+ "cover_letter_example.png",
+ "cv_example.png",
+]
+
+[template]
+path = "src/template"
+entrypoint = "cv.typ"
+thumbnail = "thumbnail.png"
+
+# [tool.mytool]
+# foo = "bar"