Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -78,3 +78,6 @@ jobs:

- name: Build Next.js
run: ${{ steps.pm.outputs.runner }} build

- name: Verify URL conventions
run: ${{ steps.pm.outputs.runner }} verify:urls
9 changes: 7 additions & 2 deletions .github/workflows/deploy.yml
Original file line number Diff line number Diff line change
Expand Up @@ -60,10 +60,12 @@ jobs:
xsltproc \
python3 \
python3-pip
# Do NOT set `static_site_generator: next` here: it makes configure-pages
# write a `next.config.js`, which Next.js prefers over this repo's
# `next.config.ts`, so the deployed build silently ignores our config
# (#207). Everything it would inject is already in `next.config.ts`.
- name: Setup Pages
uses: actions/configure-pages@v5
with:
static_site_generator: next
- name: Restore cache
uses: actions/cache@v4
with:
Expand All @@ -76,6 +78,9 @@ jobs:
run: ${{ steps.detect-package-manager.outputs.manager }} ${{ steps.detect-package-manager.outputs.command }}
- name: Build with Next.js
run: ${{ steps.detect-package-manager.outputs.runner }} build
# Blocks the deploy on broken URLs (#207); reads ./out, rebuilds nothing.
- name: Verify URL conventions
run: ${{ steps.detect-package-manager.outputs.runner }} verify:urls
- name: Upload artifact
uses: actions/upload-pages-artifact@v3
with:
Expand Down
14 changes: 14 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,20 @@ If a PR changes generated output without changing the inputs that produce it, ca
- A large part of the site is Markdown-driven. Review content pipeline changes for frontmatter assumptions, slug handling, excerpt/title sanitization, and image resolution.
- This repo uses Yarn as the expected package manager. Flag changes that introduce package-manager drift or inconsistent lockfile/package-manager usage unless the migration is intentional.

### URL conventions (see #207)

- Canonical URLs have **no trailing slash**: `/some-page`. `next.config.ts` sets
`trailingSlash: false`, so the export writes `out/some-page.html` and GitHub
Pages serves it directly for `/some-page`.
- Write internal links, canonical URLs, sitemap entries and RSS `<link>`s in
that form. Two deliberate exceptions: `/cups/` (separate CUPS Pages site) and
RSS `<guid>`s, which keep their historical trailing slash because they are
item identities -- changing them makes feed readers re-announce old articles.
- `scripts/generate-trailing-slash-aliases.ts` writes `out/some-page/index.html`
redirect stubs after the export so old inbound links ending in `/` keep
working.
- `yarn verify:urls` checks these invariants and gates both CI and deployment.

## Configuration & Portability

- **Single Source of Truth**: All deployment-specific values, such as GitHub organization / repository names, base paths, and external URLs (e.g., Giscus configs, CI pipelines), are centralized in `config/site.config.ts`.
Expand Down
2 changes: 1 addition & 1 deletion app/foomatic/driver/[id]/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ export async function generateMetadata({ params }: DriverPageProps): Promise<Met
driver?.shortDescription ||
`The ${name} printer driver in the OpenPrinting database` +
(printerCount ? `, supporting ${printerCount} printer model${printerCount === 1 ? "" : "s"}.` : ".")
const canonical = getSiteUrl(`/foomatic/driver/${id}/`)
const canonical = getSiteUrl(`/foomatic/driver/${id}`)

return {
title,
Expand Down
2 changes: 1 addition & 1 deletion app/foomatic/printer/[make]/[id]/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ export async function generateMetadata({ params }: PrinterPageProps): Promise<Me
const description = printer
? `Support information, recommended driver, and ${driverCount} available driver${driverCount === 1 ? "" : "s"} for the ${name} on Linux and Unix via OpenPrinting.`
: `Printer support information for ${id} from the OpenPrinting database.`
const canonical = getSiteUrl(`/foomatic/printer/${make}/${id}/`)
const canonical = getSiteUrl(`/foomatic/printer/${make}/${id}`)

return {
title,
Expand Down
2 changes: 1 addition & 1 deletion app/gsod2020/[slug]/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ export default async function GSoD2020IdeaPage({
<section className="py-10">
<div className="mx-auto max-w-4xl px-6">
<Link
href="/gsod2020/"
href="/gsod2020"
className="inline-flex items-center gap-2 text-sm font-medium text-blue-600 hover:underline dark:text-blue-400"
>
<ArrowLeft className="h-4 w-4" />
Expand Down
2 changes: 1 addition & 1 deletion app/gsod2020/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ export default async function GSoD2020Page() {
{ideas.map((idea) => (
<Link
key={idea.slug}
href={`/gsod2020/${idea.slug}/`}
href={`/gsod2020/${idea.slug}`}
className="group block rounded-xl border border-border bg-card p-6 transition-all duration-300 hover:border-border/80 hover:bg-accent card-glow"
>
<div className="mb-4 flex items-start justify-between gap-3">
Expand Down
4 changes: 2 additions & 2 deletions app/hall-of-fame/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,11 @@ const ANNOUNCEMENT_PATH = "/OpenPrinting-News-The-New-OpenPrinting-Website"
export const metadata: Metadata = {
title,
description,
alternates: { canonical: getSiteUrl("/hall-of-fame/") },
alternates: { canonical: getSiteUrl("/hall-of-fame") },
openGraph: {
title,
description,
url: getSiteUrl("/hall-of-fame/"),
url: getSiteUrl("/hall-of-fame"),
type: "website",
},
}
Expand Down
4 changes: 2 additions & 2 deletions app/opportunity-open-source/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,12 @@ export const metadata: Metadata = {
title: "Opportunity Open Source | OpenPrinting",
description:
"OpenPrinting's annual free and open source software conference in India — the mission, past editions, and the upcoming one.",
alternates: { canonical: getSiteUrl("/opportunity-open-source/") },
alternates: { canonical: getSiteUrl("/opportunity-open-source") },
openGraph: {
title: "Opportunity Open Source | OpenPrinting",
description:
"OpenPrinting's annual free and open source software conference in India.",
url: getSiteUrl("/opportunity-open-source/"),
url: getSiteUrl("/opportunity-open-source"),
type: "website",
},
}
Expand Down
70 changes: 35 additions & 35 deletions app/sitemap.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,35 +25,35 @@ function readDirSlugs(dir: string): string[] {

const STATIC_ROUTES = [
"/",
"/about-us/",
"/news/",
"/projects/",
"/downloads/",
"/documentation/",
"/upcoming-technologies/",
"/driverless/",
"/drivers/",
"/printers/",
"/foomatic/printers/",
"/foomatic/drivers/",
"/contact/",
"/donations/",
"/sponsors/",
"/opportunity-open-source/",
"/contribute/",
"/contribute-website/",
"/codeofconduct/",
"/achievements/",
"/history/",
"/current/",
"/databaseintro/",
"/gsoc/",
"/gsod/",
"/gsod2020/",
"/lfmp/",
"/lfmp2020/",
"/wsl-printer-app/",
"/wsl-printer-app-compile/",
"/about-us",
"/news",
"/projects",
"/downloads",
"/documentation",
"/upcoming-technologies",
"/driverless",
"/drivers",
"/printers",
"/foomatic/printers",
"/foomatic/drivers",
"/contact",
"/donations",
"/sponsors",
"/opportunity-open-source",
"/contribute",
"/contribute-website",
"/codeofconduct",
"/achievements",
"/history",
"/current",
"/databaseintro",
"/gsoc",
"/gsod",
"/gsod2020",
"/lfmp",
"/lfmp2020",
"/wsl-printer-app",
"/wsl-printer-app-compile",
];

export default function sitemap(): MetadataRoute.Sitemap {
Expand All @@ -65,19 +65,19 @@ export default function sitemap(): MetadataRoute.Sitemap {

for (const post of getAllPostRecords()) {
entries.push({
url: getSiteUrl(`/${post.slug}/`),
url: getSiteUrl(`/${post.slug}`),
lastModified: post.date || undefined,
});
}

for (const slug of readDirSlugs("projects")) {
entries.push({ url: getSiteUrl(`/projects/${slug}/`) });
entries.push({ url: getSiteUrl(`/projects/${slug}`) });
}
for (const slug of readDirSlugs("documentation")) {
entries.push({ url: getSiteUrl(`/documentation/${slug}/`) });
entries.push({ url: getSiteUrl(`/documentation/${slug}`) });
}
for (const slug of readDirSlugs("upcoming-technologies")) {
entries.push({ url: getSiteUrl(`/upcoming-technologies/${slug}/`) });
entries.push({ url: getSiteUrl(`/upcoming-technologies/${slug}`) });
}

for (const route of foomaticRoutes()) {
Expand All @@ -97,7 +97,7 @@ function foomaticRoutes(): string[] {
printers: { id: string; manufacturer: string }[];
};
for (const printer of data.printers) {
routes.push(`${printerHref(printer.id, printer.manufacturer)}/`);
routes.push(printerHref(printer.id, printer.manufacturer));
}
}

Expand All @@ -107,7 +107,7 @@ function foomaticRoutes(): string[] {
drivers: { id: string }[];
};
for (const driver of data.drivers) {
routes.push(`${driverHref(driver.id)}/`);
routes.push(driverHref(driver.id));
}
}

Expand Down
4 changes: 2 additions & 2 deletions app/sponsors/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,12 @@ export const metadata: Metadata = {
title: "Sponsors & Supporters | OpenPrinting",
description:
"The organizations and supporters who sponsor OpenPrinting, and how to become a sponsor or make a donation.",
alternates: { canonical: getSiteUrl("/sponsors/") },
alternates: { canonical: getSiteUrl("/sponsors") },
openGraph: {
title: "Sponsors & Supporters | OpenPrinting",
description:
"The organizations and supporters who sponsor OpenPrinting, and how to become a sponsor or make a donation.",
url: getSiteUrl("/sponsors/"),
url: getSiteUrl("/sponsors"),
type: "website",
},
}
Expand Down
4 changes: 2 additions & 2 deletions components/cta-section.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -39,10 +39,10 @@ export default function CTASection() {
className="flex flex-col sm:flex-row gap-4 justify-center"
>
<Button asChild size="lg" className="bg-brand-blue hover:bg-brand-blue/90">
<Link href="/downloads/" prefetch={false}>Download Now</Link>
<Link href="/downloads" prefetch={false}>Download Now</Link>
</Button>
<Button asChild variant="outline" size="lg" className="border-white text-white hover:bg-white/10">
<Link href="/printers/" prefetch={false}>
<Link href="/printers" prefetch={false}>
Find a Printer
</Link>
</Button>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ Modern printers usually are driverless IPP printers, and those get discovered an

Printers which do not do driverless IPP are either legacy printers, the many older printers which got developed before driverless IPP printing existed, and specialty printers. These need Printer Applications. As there will be several different Printer Applications and each one supporting another set of printers it is not trivial for the user to discover available non-IPP-driverless printers and find out which is the Printer Application to use and whether it is already installed.

So we need some guide for the user. The idea is a GUI tool which lists available, non-IPP-driverless printers, local (USB) and network devices. If the user selects one of them, all installed Printer Applications which support this printer are shown, and for each a button to open the Printer Application's web interface and also a quick auto-add-this-printer button. In addition to the list of suitable Printer Applications there should also be a button which does a fuzzy search for the printer make and model on the Snap Store/the OpenPrinting web site to find Printer Applications which are not installed on the local system. There is already a concept to implement an appropriate [search index on OpenPrinting](/OpenPrinting-News-November-2021/#printer-querying-on-the-openprinting-web-server) which will be used by this GUI.
So we need some guide for the user. The idea is a GUI tool which lists available, non-IPP-driverless printers, local (USB) and network devices. If the user selects one of them, all installed Printer Applications which support this printer are shown, and for each a button to open the Printer Application's web interface and also a quick auto-add-this-printer button. In addition to the list of suitable Printer Applications there should also be a button which does a fuzzy search for the printer make and model on the Snap Store/the OpenPrinting web site to find Printer Applications which are not installed on the local system. There is already a concept to implement an appropriate [search index on OpenPrinting](/OpenPrinting-News-November-2021#printer-querying-on-the-openprinting-web-server) which will be used by this GUI.

The contributor's task is to implement such a tool in GTK, ideally as a module for the GNOME Control Center.
### Mentors
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ Test programs are also needed for the so-called 'autopkgtest' tests which are ad

In addition, instruction files and shell scripts are needed to build the software on different platforms/environments, run tests, create GitHub Actions (for the automatic triggering on each commit ...).

This subject got discussed on the OpenPrinting micro-conference on Linux Plumbers 2022: ([Summary](/OpenPrinting-News-September-2022/#openprinting-micro-conference-on-the-linux-plumbers-2022), [Slides](https://lpc.events/event/16/contributions/1161/attachments/942/1851/lpc-printing-ci-2022.pdf), [Video](https://www.youtube.com/watch?v=c--Uki7cvGE))
This subject got discussed on the OpenPrinting micro-conference on Linux Plumbers 2022: ([Summary](/OpenPrinting-News-September-2022#openprinting-micro-conference-on-the-linux-plumbers-2022), [Slides](https://lpc.events/event/16/contributions/1161/attachments/942/1851/lpc-printing-ci-2022.pdf), [Video](https://www.youtube.com/watch?v=c--Uki7cvGE))

Here you can see what we already have in terms of CI, and what is missing ...
### Mentors
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ Test programs are also needed for the so-called 'autopkgtest' tests which are ad

In addition, instruction files and shell scripts are needed to build the software on different platforms/environments, run tests, create GitHub Actions (for the automatic triggering on each commit ...).

This subject got discussed on the OpenPrinting micro-conference on Linux Plumbers 2022: ([Summary](/OpenPrinting-News-September-2022/#openprinting-micro-conference-on-the-linux-plumbers-2022), [Slides](https://lpc.events/event/16/contributions/1161/attachments/942/1851/lpc-printing-ci-2022.pdf), [Video](https://www.youtube.com/watch?v=c--Uki7cvGE))
This subject got discussed on the OpenPrinting micro-conference on Linux Plumbers 2022: ([Summary](/OpenPrinting-News-September-2022#openprinting-micro-conference-on-the-linux-plumbers-2022), [Slides](https://lpc.events/event/16/contributions/1161/attachments/942/1851/lpc-printing-ci-2022.pdf), [Video](https://www.youtube.com/watch?v=c--Uki7cvGE))

Here you can see what we already have in terms of CI, and what is missing ...
### Mentors
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ Test programs are also needed for the so-called 'autopkgtest' tests which are ad

In addition, instruction files and shell scripts are needed to build the software on different platforms/environments, run tests, create GitHub Actions (for the automatic triggering on each commit ...).

This subject got discussed on the OpenPrinting micro-conference on Linux Plumbers 2022: ([Summary](/OpenPrinting-News-September-2022/#openprinting-micro-conference-on-the-linux-plumbers-2022), [Slides](https://lpc.events/event/16/contributions/1161/attachments/942/1851/lpc-printing-ci-2022.pdf), [Video](https://www.youtube.com/watch?v=c--Uki7cvGE))
This subject got discussed on the OpenPrinting micro-conference on Linux Plumbers 2022: ([Summary](/OpenPrinting-News-September-2022#openprinting-micro-conference-on-the-linux-plumbers-2022), [Slides](https://lpc.events/event/16/contributions/1161/attachments/942/1851/lpc-printing-ci-2022.pdf), [Video](https://www.youtube.com/watch?v=c--Uki7cvGE))

Here you can see what we already have in terms of CI, and what is missing ...
### Mentors
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ To compare graphical content they use the free software computer vision library

With this we could for example take a PDF file, rasterize it in high quality, then "print" it/send it through a filter chain and afterwards compare the images. We can also OCR raster output to check whether the complete text of the input (plain text or PDF file) is conserved in the output, not having anything cut off at the borders and no glyphs missing or replaced by squares/placeholders for missing glyphs.

See also [my report from the GUADEC 2024](/OpenPrinting-News-July-2024/#guadec-2024-in-denver), the section "Workshop: openQA testing for your GNOME app, module or service".
See also [my report from the GUADEC 2024](/OpenPrinting-News-July-2024#guadec-2024-in-denver), the section "Workshop: openQA testing for your GNOME app, module or service".

Tests which benefit from this are not only our CI testing in libcupsfilters, but also 2 of our other projects on this list:
* Behavior-accurate simulation of multi-function printers
Expand Down
2 changes: 1 addition & 1 deletion contents/gsoc/2025/Qt-Print-Dialog.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ title: "Qt Print Dialog: Modernize the user interface"

The print dialog of [Qt](https://contribute.qt-project.org/), which is also the print dialog used by KDE applications has still the user interface of 20 years ago, when I told the Qt and KDE developers that a CUPS-supporting print dialog is needed and they made this print dialog in response.

Now, after the internals of the dialog being up-to-date (Support for the [Common Print Dialog Backends](/achievements/#common-print-dialog-backends) added in [GSoC 2022](https://github.com/TinyTrebuchet/gsoc22/)) we need to make the user interface of the Qt print dialog cute.
Now, after the internals of the dialog being up-to-date (Support for the [Common Print Dialog Backends](/achievements#common-print-dialog-backends) added in [GSoC 2022](https://github.com/TinyTrebuchet/gsoc22/)) we need to make the user interface of the Qt print dialog cute.

The modernization should at least be a UI similar to the one of the GTK print dialog. This should not require any extensions of the API between the print dialog and the applications and so the new dialog can replace the old one without modifications on existing applications needed.

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ title: "Utilizing OSS-Fuzz-Gen to improve fuzz testing for OpenPrinting projects

1 contributor full-size (350 hours), Level of difficulty: Hard

Recent vulnerabilities (including [CVE-2024-47175, CVE-2024-47176, CVE-2024-47177](/OpenPrinting-News-Flash-cups-browsed-Remote-Code-Execution-vulnerability/)) reported in OpenPrinting projects have underscored the critical need for robust security measures. Given that most of the projects of OpenPrinting are developed in `C/C++`, which are prone to memory violation bugs. To address these challenges, OpenPrinting has engaged with Google's [OSS-Fuzz](https://github.com/google/oss-fuzz/), a service designed to support open-source communities by providing large-scale fuzz testing and bug reporting, and maintains the fuzz harnesses in the separate [OpenPrinting fuzzing](https://github.com/OpenPrinting/fuzzing) repository.
Recent vulnerabilities (including [CVE-2024-47175, CVE-2024-47176, CVE-2024-47177](/OpenPrinting-News-Flash-cups-browsed-Remote-Code-Execution-vulnerability)) reported in OpenPrinting projects have underscored the critical need for robust security measures. Given that most of the projects of OpenPrinting are developed in `C/C++`, which are prone to memory violation bugs. To address these challenges, OpenPrinting has engaged with Google's [OSS-Fuzz](https://github.com/google/oss-fuzz/), a service designed to support open-source communities by providing large-scale fuzz testing and bug reporting, and maintains the fuzz harnesses in the separate [OpenPrinting fuzzing](https://github.com/OpenPrinting/fuzzing) repository.

**Current Integration with OSS-Fuzz:** OpenPrinting has successfully integrated **three** key projects into the OSS-Fuzz workflow, with **two** additional projects currently in progress. Although the integration has already yielded significant results, which have reported **21** critical fixed bugs leading to more than **5,000** lines of code fixes, it remains insufficient. The [testing coverage](https://introspector.oss-fuzz.com/project-profile?project=cups) for critical components is still lacking, and the severity of potential issues within OpenPrinting projects demands further action.

Expand Down
Loading
Loading