From c1163dc8ff70316ff9124fd4f4e36b7706e75e75 Mon Sep 17 00:00:00 2001 From: Yiorgis Gozadinos Date: Fri, 16 Jan 2026 14:14:47 +0200 Subject: [PATCH] Use biome on the frontend for linting, add to CI --- .github/workflows/test.yml | 19 +++- .pre-commit-config.yaml | 9 ++ app/frontend/biome.json | 10 ++- app/frontend/components/Chat.tsx | 8 +- app/frontend/components/SettingsPanel.tsx | 1 - .../samples/PyCon Finland 2025 Schedule.html | 90 +++++++++---------- 6 files changed, 85 insertions(+), 52 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index b83dc2cd..598b9dd2 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -25,8 +25,25 @@ jobs: - name: Type check run: uv run pyright + lint-frontend: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: "22" + cache: "npm" + cache-dependency-path: app/frontend/package-lock.json + - name: Install dependencies + working-directory: app/frontend + run: npm ci + - name: Lint and format check + working-directory: app/frontend + run: npm run check + test: - needs: lint + needs: [lint, lint-frontend] runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index f9155440..46a4d4a1 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -20,3 +20,12 @@ repos: rev: v1.1.407 hooks: - id: pyright + + - repo: local + hooks: + - id: biome + name: biome check + entry: bash -c 'cd app/frontend && npm run check' + language: system + files: ^app/frontend/ + types_or: [javascript, jsx, ts, tsx, json] diff --git a/app/frontend/biome.json b/app/frontend/biome.json index 03241efc..b9fe69ab 100644 --- a/app/frontend/biome.json +++ b/app/frontend/biome.json @@ -1,9 +1,9 @@ { "$schema": "https://biomejs.dev/schemas/2.2.6/schema.json", "vcs": { - "enabled": false, + "enabled": true, "clientKind": "git", - "useIgnoreFile": false + "useIgnoreFile": true }, "files": { "ignoreUnknown": false @@ -15,7 +15,11 @@ "linter": { "enabled": true, "rules": { - "recommended": true + "recommended": true, + "a11y": { + "noAutofocus": "off", + "noSvgWithoutTitle": "off" + } } }, "javascript": { diff --git a/app/frontend/components/Chat.tsx b/app/frontend/components/Chat.tsx index bf663ed2..b9bdc2be 100644 --- a/app/frontend/components/Chat.tsx +++ b/app/frontend/components/Chat.tsx @@ -1,6 +1,5 @@ "use client"; -import { useCallback, useEffect, useState } from "react"; import { CopilotKit, useCoAgent, @@ -8,6 +7,7 @@ import { useCopilotAction, } from "@copilotkit/react-core"; import { CopilotChat } from "@copilotkit/react-ui"; +import { useCallback, useEffect, useState } from "react"; import "@copilotkit/react-ui/styles.css"; import CitationBlock from "./CitationBlock"; import DbInfo from "./DbInfo"; @@ -519,7 +519,11 @@ function ChatContentInner({ type="button" className={`settings-btn ${initialContext ? "has-context" : ""}`} onClick={() => setSettingsOpen(true)} - title={initialContext ? "Background context is set" : "Set background context"} + title={ + initialContext + ? "Background context is set" + : "Set background context" + } > Context diff --git a/app/frontend/components/SettingsPanel.tsx b/app/frontend/components/SettingsPanel.tsx index 76638e7b..ca009885 100644 --- a/app/frontend/components/SettingsPanel.tsx +++ b/app/frontend/components/SettingsPanel.tsx @@ -133,7 +133,6 @@ export default function SettingsPanel({ background: #2563eb; } `} - {/* biome-ignore lint/a11y/useKeyWithClickEvents: handled via onKeyDown on overlay */}
PyCon Finland 2025 Schedule

PyCon Finland 2025 Schedule

Friday October 17, 2025, as part of Plone Conference 2025 in Jyväskylä, Finland.

Notice! Changes to the schedule are still possible! Get your tickets, only 100€!

Notice: The times in the calendar will be shown on your local time. The actual event time is UTC +3:00 (Helsinki).

PS. Check out all Plone Conference talks and calendar. Read more about PyCon Finland 2025.

Auditorio 1
Alfa
Beeta
09:00
Registration opens at the Lobby
09:15
Other
Case Study
Auditorio 1
en
This - talk covers a lot of ground. I'm moving between three levels of -abstraction: a concrete case story, software patterns, and ultimately a + talk covers a lot of ground. I'm moving between three levels of +abstraction: a concrete case story, software patterns, and ultimately a living systems paradigm.
Case Study
Python
Beeta
en
eduTAP - is a project to bring campus cards into the smart phone wallets. + is a project to bring campus cards into the smart phone wallets. eduTAP is implemented in Python, by members of the Plone Community.
Case Study
Alfa
en
Design for your constraints, communicate your assumptions, and sometimes boring wins over brilliant.
10:00
AI
Auditorio 1
en
“A fool with a tool is still a fool” examines how AI is reshaping software - development—what it truly does well, where it fails spectacularly, and -how to use it responsibly rather than recklessly. Drawing on real-world -wins and faceplants (including “vibe coding”), the talk distills -practical guardrails, governance, and senior-level responsibilities for + development—what it truly does well, where it fails spectacularly, and +how to use it responsibly rather than recklessly. Drawing on real-world +wins and faceplants (including “vibe coding”), the talk distills +practical guardrails, governance, and senior-level responsibilities for shipping trustworthy systems.
React
Plone: Backend
Python
Beeta
en
In - this talk, we’ll introduce Guillotina Volto, an experimental -integration that uses Guillotina — an async Python REST API framework — + this talk, we’ll introduce Guillotina Volto, an experimental +integration that uses Guillotina — an async Python REST API framework — as a new backend for Volto.
Python
Alfa
en
A - recap on thread safety and synchronisation primitives. As more -developers adopt free-threaded Python, understanding thread safety -becomes critical - not just nice to have. This talk explores all -essential synchronisation primitives from Python's threading module -through a practical dice game simulation scenario. You'll learn to -identify and fix race conditions, understand what the GIL was + recap on thread safety and synchronisation primitives. As more +developers adopt free-threaded Python, understanding thread safety +becomes critical - not just nice to have. This talk explores all +essential synchronisation primitives from Python's threading module +through a practical dice game simulation scenario. You'll learn to +identify and fix race conditions, understand what the GIL was protecting, and discover patterns to ensure your code works correctly in the free-threaded future.
10:00
AI
Auditorio 1
en
In my talk, I’ll share practical AI experiences from projects over the past two years.
Python
Beeta
en
Debugging - can be a stressful experience to a developer for many reasons. In this -talk, I provide practical and hands-on tips that you can bring to your -work or hobby projects the following day to turn your debugging session + can be a stressful experience to a developer for many reasons. In this +talk, I provide practical and hands-on tips that you can bring to your +work or hobby projects the following day to turn your debugging session from stressful encounters to joyful experiences.
10:30
Community
Auditorio 1
en
Plone Foundation Annual General Meeting. Vote for a new board and other topics.
11:00
11:30
Keynote
Auditorio 1
en
Muuttolintujen - Kevät (“Spring of migratory birds”) is a mobile application –based -citizen science campaign where citizens collect bird observations with + Kevät (“Spring of migratory birds”) is a mobile application –based +citizen science campaign where citizens collect bird observations with help of an automated bird sound classifier of Finnish birds.
12:30
Python
Alfa
en
This talk presents three real-world scenarios where Python acts as the glue between specialized languages.
13:30
AI
Auditorio 1
en
Building - AI applications on your own data offers many opportunities; -Retrieval-Augmented Generation (RAG) can make LLMs more accurate and + AI applications on your own data offers many opportunities; +Retrieval-Augmented Generation (RAG) can make LLMs more accurate and relevant. But where should you store your data and vectors?
AI
Python
Beeta
en
The OG cast of developers who brought you Zope, CMF, Plone and Pyramid join up to make AI fun.
Python
Alfa
en
Shiny - for Python allows you to build interactive web applications using only -Python code. Inspired by the original Shiny framework for R, it -introduces a reactive programming model that makes it easy to link UI + for Python allows you to build interactive web applications using only +Python code. Inspired by the original Shiny framework for R, it +introduces a reactive programming model that makes it easy to link UI elements to Python functions.
14:15
Python
Auditorio 1
en
In - this talk I will cover some of the recommendations I make as a staff -engineer on how to deliver quality in such a field, and what you can do + this talk I will cover some of the recommendations I make as a staff +engineer on how to deliver quality in such a field, and what you can do to level up.
Python
Beeta
en
Let me take you on a journey—a journey of bold ideas, spectacular failures, and the rare flash of brilliance.
14:45
React
Python
Alfa
en
In this talk, we take a look at why and how to do it with tools like rustimport and Maturin.
15:00
Python
Auditorio 1
en
Typing - in Python starts to take shape via many PEPS and we are going to + in Python starts to take shape via many PEPS and we are going to explore the evolution of it. In this talk, we will look at how do we get - here, with all the tools that can be used to enforce strong typing in + here, with all the tools that can be used to enforce strong typing in Python, a genetically dynamic typing language.
Plone: Frontend
Webdesign
Beeta
en
In - this talk, we’ll explore how to make accessibility-first development + this talk, we’ll explore how to make accessibility-first development part of your organization’s DNA. You’ll learn how assistive technologies - interact with the accessibility tree, what accessibility-first -development really means, why accessible design benefits all users—not -just people with disabilities—and we will break some common biases that + interact with the accessibility tree, what accessibility-first +development really means, why accessible design benefits all users—not +just people with disabilities—and we will break some common biases that still exist around accessibility.
Plone: DevOps
Beeta
en
This - talk will share why we made the switch, how we approached the -transition, and what tools (like Kubernetes runners and composite + talk will share why we made the switch, how we approached the +transition, and what tools (like Kubernetes runners and composite actions) helped us succeed.
15:30
Other
Open Source
Auditorio 1
en
An - attempt to explain why feminism can be an interesting approach to -questioning our behaviors and practices as open source contributors, as + attempt to explain why feminism can be an interesting approach to +questioning our behaviors and practices as open source contributors, as members of the software industry, and as developers.
Process
Alfa
en
This - is story of what mistakes I have done in my projects, why I now -understand my developers colleagues better and what I have done to + is story of what mistakes I have done in my projects, why I now +understand my developers colleagues better and what I have done to regain my past knowledge as a tester.
React
Plone: Frontend
Plone: Backend
Beeta
en
This - talk shares how I brought back a key part of Plone, the workflow + talk shares how I brought back a key part of Plone, the workflow manager, by rebuilding it for Volto and the new REST based backend.
Python
Alfa
en
If - you care about Python at scale—web servers, data pipelines, or -reinforcement-learning loops—this session is your roadmap to a GIL-free + you care about Python at scale—web servers, data pipelines, or +reinforcement-learning loops—this session is your roadmap to a GIL-free future.
16:00
AI
Python
Auditorio 1
en
DSPy - is a declarative framework for building modular, self-improving AI -systems using structured code and natural-language modules, enabling + is a declarative framework for building modular, self-improving AI +systems using structured code and natural-language modules, enabling fast iteration, composability, and model-agnostic deployment.
16:45
17:00
Community
Auditorio 1
en
Sprints Info. Information about the Plone development sprint on Saturday and Sunday. Where, what, how, topics.
17:15
Auditorio 1
Lightning talks consists of 5 min slots where people can quickly talk about something important and interesting.
18:00
Auditorio 1
en
Plone Conference 2025 and PyCon Finland 2025 has ended. See you all at the next time!

Location is Agora building at University of Jyväskylä.

- \ No newline at end of file +