diff --git a/packages/preview/easy-internship/0.1.0/LICENSE b/packages/preview/easy-internship/0.1.0/LICENSE
new file mode 100644
index 0000000000..e657a4b55a
--- /dev/null
+++ b/packages/preview/easy-internship/0.1.0/LICENSE
@@ -0,0 +1,16 @@
+MIT No Attribution
+
+Copyright (c) 2025-2026 Pierre Lapolla
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this
+software and associated documentation files (the "Software"), to deal in the Software
+without restriction, including without limitation the rights to use, copy, modify,
+merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so.
+
+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 OR COPYRIGHT
+HOLDERS 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.
diff --git a/packages/preview/easy-internship/0.1.0/README.md b/packages/preview/easy-internship/0.1.0/README.md
new file mode 100644
index 0000000000..d3501f14cb
--- /dev/null
+++ b/packages/preview/easy-internship/0.1.0/README.md
@@ -0,0 +1,71 @@
+# easy-internship
+
+A clean report template for school projects and internship reports: cover page, table of contents, school and company logos in the header, and a footer with author, page number and date. Works in English and French.
+
+
+
+
+
+## Getting started
+
+Create a new project from the template:
+
+```sh
+typst init @preview/easy-internship:0.1.0
+```
+
+Or use it in an existing document:
+
+```typst
+#import "@preview/easy-internship:0.1.0": report
+
+#show: report.with(
+ title: [My report],
+ author: "Jane Doe",
+)
+
+= Introduction
+Your report content here.
+```
+
+Logos and bibliography are passed as content, so their paths are resolved relative to *your* file:
+
+```typst
+#show: report.with(
+ title: [Internship Report],
+ author: "Jane Doe",
+ school-logo: image("school-logo.svg"),
+ company-logo: image("company-logo.svg"),
+ bibliography: bibliography("refs.bib"),
+)
+```
+
+## Parameters
+
+| Parameter | Type | Default | Description |
+| --- | --- | --- | --- |
+| `title` | content | `[My report]` | Cover title and document metadata. |
+| `author` | string | `"Student Name"` | Cover author, footer and metadata. |
+| `subtitle` | content / `none` | `none` | Subtitle on the cover page. |
+| `date` | datetime / content | `datetime.today()` | Shown on the cover and in the footer. |
+| `language` | string | `"en"` | Text language (e.g. `"en"`, `"fr"`). |
+| `font` | string | `"Libertinus Serif"` | Body font, falls back to Libertinus Serif. |
+| `text-size` | length | `11pt` | Body text size. |
+| `page-margin` | length / dictionary | `2.5cm` | Passed to `page(margin: ..)`. |
+| `logo-size` | length | `1cm` | Logo height in the header (doubled on the cover). |
+| `footer-font-size` | length | `0.8em` | Size of the footer side texts. |
+| `cover-title-size` | length | `30pt` | Cover title size. |
+| `cover-subtitle-size` | length | `18pt` | Cover subtitle size. |
+| `cover-page` | bool | `true` | Render the cover page. |
+| `outline-page` | bool | `true` | Render the table of contents. |
+| `keywords` | array | `()` | Document metadata keywords. |
+| `description` | content / `none` | `none` | Document metadata description. |
+| `school-logo` | content / `none` | `none` | Left header logo, e.g. `image("logo.png")`. |
+| `company-logo` | content / `none` | `none` | Right header logo. |
+| `footer-content` | content / `none` | `none` | Left footer text, defaults to `author`. |
+| `highlight-color` | color | `rgb("#00727A")` | Accent color for title, headings and highlights. |
+| `bibliography` | content / `none` | `none` | e.g. `bibliography("refs.bib")`, rendered on a new page at the end. |
+
+## License
+
+[MIT-0](LICENSE): use, modify and share freely, no attribution required in your report.
diff --git a/packages/preview/easy-internship/0.1.0/lib.typ b/packages/preview/easy-internship/0.1.0/lib.typ
new file mode 100644
index 0000000000..9bddce45f1
--- /dev/null
+++ b/packages/preview/easy-internship/0.1.0/lib.typ
@@ -0,0 +1,97 @@
+#let report(
+ body,
+ title: [My report],
+ author: "Student Name",
+ subtitle: none,
+ date: datetime.today(),
+ language: "en",
+ font: "Libertinus Serif",
+ text-size: 11pt,
+ page-margin: 2.5cm,
+ logo-size: 1cm,
+ footer-font-size: 0.8em,
+ cover-title-size: 30pt,
+ cover-subtitle-size: 18pt,
+ cover-page: true,
+ outline-page: true,
+ keywords: (),
+ description: none,
+ school-logo: none,
+ company-logo: none,
+ footer-content: none,
+ highlight-color: rgb("#00727A"),
+ bibliography: none,
+) = {
+ let display-date = if type(date) == datetime {
+ date.display("[day] [month repr:long] [year]")
+ } else {
+ date
+ }
+
+ set page(paper: "a4", margin: page-margin)
+ set text(size: text-size, lang: language, font: (font, "Libertinus Serif"))
+ set par(justify: true, first-line-indent: (amount: 1.5em, all: true))
+ set heading(numbering: "1.")
+ set highlight(fill: highlight-color.lighten(75%))
+ show heading: set text(fill: highlight-color)
+
+ set document(
+ title: title,
+ author: author,
+ date: if type(date) == datetime { date } else { auto },
+ keywords: keywords,
+ description: description,
+ )
+
+ let header-content = {
+ set image(height: logo-size)
+ grid(
+ columns: (1fr, 1fr),
+ align(left, if school-logo != none { school-logo }),
+ align(right, if company-logo != none { company-logo }),
+ )
+ }
+ let footer-layout = grid(
+ columns: (1fr, auto, 1fr),
+ align(left, text(size: footer-font-size, if footer-content == none { author } else { footer-content })),
+ align(center, context counter(page).display()),
+ align(right, text(size: footer-font-size, display-date)),
+ )
+
+ if cover-page {
+ block(width: 100%, height: 100%)[
+ #{
+ set image(height: 2 * logo-size)
+ header-content
+ }
+ #v(1fr)
+ #align(center)[
+ #text(size: cover-title-size, weight: "bold", fill: highlight-color)[#title]
+ #if subtitle != none {
+ v(0.6em)
+ text(size: cover-subtitle-size, weight: "medium")[#subtitle]
+ }
+ #v(1.6em)
+ #text(size: 13pt, weight: "semibold")[#author]
+ #v(0.5em)
+ #text(size: 12pt)[#display-date]
+ ]
+ #v(1fr)
+ ]
+ pagebreak()
+ }
+
+ set page(header: header-content, footer: footer-layout)
+
+ if outline-page {
+ outline()
+ pagebreak()
+ }
+
+ body
+
+ if bibliography != none {
+ pagebreak()
+ bibliography
+ }
+}
diff --git a/packages/preview/easy-internship/0.1.0/template/company-logo.svg b/packages/preview/easy-internship/0.1.0/template/company-logo.svg
new file mode 100644
index 0000000000..b90205271b
--- /dev/null
+++ b/packages/preview/easy-internship/0.1.0/template/company-logo.svg
@@ -0,0 +1 @@
+
diff --git a/packages/preview/easy-internship/0.1.0/template/main.typ b/packages/preview/easy-internship/0.1.0/template/main.typ
new file mode 100644
index 0000000000..a0e416a32c
--- /dev/null
+++ b/packages/preview/easy-internship/0.1.0/template/main.typ
@@ -0,0 +1,44 @@
+#import "@preview/easy-internship:0.1.0": report
+
+#show: report.with(
+ title: [Internship Report],
+ subtitle: [Software Engineering Intern ยท Spring 2026],
+ author: "Jane Doe",
+ language: "en",
+ school-logo: image("school-logo.svg"),
+ company-logo: image("company-logo.svg"),
+ keywords: ("internship", "report"),
+ bibliography: bibliography("refs.bib"),
+)
+
+#heading(numbering: none)[Acknowledgments]
+#lorem(60)
+
+= Introduction
+This report describes the internship context, the work carried out and the
+lessons learned. @activities lists the main tasks.
+
+= Activities
+- Implemented internal tooling
+- Wrote technical documentation
+- Took part in code reviews
+
+#figure(
+ table(
+ columns: (2fr, 1fr),
+ table.header[*Task*][*Hours*],
+ [Development], [120],
+ [Documentation], [24],
+ [Testing], [18],
+ ),
+ caption: [Time spent per task.],
+)
+
+= Key Learnings
+#highlight[Clear documentation] made the biggest difference. Literate
+programming @knuth1984 is a good read on the topic.
+
+$ sum_(i=1)^n i = (n(n+1)) / 2 $
+
+= Conclusion
+#lorem(40)
diff --git a/packages/preview/easy-internship/0.1.0/template/refs.bib b/packages/preview/easy-internship/0.1.0/template/refs.bib
new file mode 100644
index 0000000000..428ab8b822
--- /dev/null
+++ b/packages/preview/easy-internship/0.1.0/template/refs.bib
@@ -0,0 +1,9 @@
+@article{knuth1984,
+ author = {Knuth, Donald E.},
+ title = {Literate Programming},
+ journal = {The Computer Journal},
+ year = {1984},
+ volume = {27},
+ number = {2},
+ pages = {97--111}
+}
diff --git a/packages/preview/easy-internship/0.1.0/template/school-logo.svg b/packages/preview/easy-internship/0.1.0/template/school-logo.svg
new file mode 100644
index 0000000000..dd07a5da35
--- /dev/null
+++ b/packages/preview/easy-internship/0.1.0/template/school-logo.svg
@@ -0,0 +1 @@
+
diff --git a/packages/preview/easy-internship/0.1.0/thumbnail.png b/packages/preview/easy-internship/0.1.0/thumbnail.png
new file mode 100644
index 0000000000..6dffd95e6e
Binary files /dev/null and b/packages/preview/easy-internship/0.1.0/thumbnail.png differ
diff --git a/packages/preview/easy-internship/0.1.0/typst.toml b/packages/preview/easy-internship/0.1.0/typst.toml
new file mode 100644
index 0000000000..8ecfb02282
--- /dev/null
+++ b/packages/preview/easy-internship/0.1.0/typst.toml
@@ -0,0 +1,17 @@
+[package]
+name = "easy-internship"
+version = "0.1.0"
+entrypoint = "lib.typ"
+authors = ["Pierre Lapolla <@PierreLapolla>"]
+license = "MIT-0"
+description = "Internship and school reports with cover and logos."
+repository = "https://github.com/PierreLapolla/easy-internship"
+keywords = ["report", "internship", "school", "university", "french"]
+categories = ["report"]
+disciplines = []
+compiler = "0.13.0"
+
+[template]
+path = "template"
+entrypoint = "main.typ"
+thumbnail = "thumbnail.png"