Movim
@movim@piaille.fr
Looks like we'll have to work a bit faster on the massive audio/video call and Spaces features 👀
https://discord.com/press-releases/discord-launches-teen-by-default-settings-globally
@movim@piaille.fr
Looks like we'll have to work a bit faster on the massive audio/video call and Spaces features 👀
https://discord.com/press-releases/discord-launches-teen-by-default-settings-globally
@movim@piaille.fr
Looks like we'll have to work a bit faster on the massive audio/video call and Spaces features 👀
https://discord.com/press-releases/discord-launches-teen-by-default-settings-globally
@pandoc@fosstodon.org
🆕 pandoc 3.9 🎉🚀
• Official support for wasm (WebAssembly), allowing to run pandoc in the browser,
• the *alerts* extension is now available in the pandoc Markdown flavor,
• support for defaults files using JSON instead of YAML,
• extension of `${.}` vars in the `defaults` field, making it easier to base defaults files on other defaults,
• method to run Lua code with a modified pandoc state,
• and much more
Many thanks to all who contributed!
@pandoc@fosstodon.org
🆕 pandoc 3.9 🎉🚀
• Official support for wasm (WebAssembly), allowing to run pandoc in the browser,
• the *alerts* extension is now available in the pandoc Markdown flavor,
• support for defaults files using JSON instead of YAML,
• extension of `${.}` vars in the `defaults` field, making it easier to base defaults files on other defaults,
• method to run Lua code with a modified pandoc state,
• and much more
Many thanks to all who contributed!
@gstreamer@floss.social
📢 We're thrilled to announce GStreamer 1.28
... a new major stable feature release!
Check out
https://gstreamer.freedesktop.org/releases/1.28/
for details of all the exciting new features and improvements!
Many thanks to everyone who contributed to this release!
@gstreamer@floss.social
📢 We're thrilled to announce GStreamer 1.28
... a new major stable feature release!
Check out
https://gstreamer.freedesktop.org/releases/1.28/
for details of all the exciting new features and improvements!
Many thanks to everyone who contributed to this release!
@gstreamer@floss.social
📢 We're thrilled to announce GStreamer 1.28
... a new major stable feature release!
Check out
https://gstreamer.freedesktop.org/releases/1.28/
for details of all the exciting new features and improvements!
Many thanks to everyone who contributed to this release!
@hugovk@mastodon.social · Reply to Hugo van Kemenade's post
By popular demand (@miketheman), pypistats now has a `--sort` option so you can sort by other columns such as date, rather than the default downloads.
@hugovk@mastodon.social · Reply to Hugo van Kemenade's post
By popular demand (@miketheman), pypistats now has a `--sort` option so you can sort by other columns such as date, rather than the default downloads.
@GIMP@floss.social
https://www.gimp.org/news/2026/01/24/gimp-3-0-8-released/
GIMP 3.0.8 released today.
A new version of the manual, including more translation work; fixes to bugs people have been kind enough to report.
Startup performance improved on many systems; colour profiles on Windows; SVG path import;
some minor UI improvements; security fixes; see link for more.
This might be the final 3.0 release before 3.2.
#GIMP #GIMP3 #Gimp_3 #release #freeSoftware #libreGraphics #GNU #GnuImageEditor
@GIMP@floss.social
https://www.gimp.org/news/2026/01/24/gimp-3-0-8-released/
GIMP 3.0.8 released today.
A new version of the manual, including more translation work; fixes to bugs people have been kind enough to report.
Startup performance improved on many systems; colour profiles on Windows; SVG path import;
some minor UI improvements; security fixes; see link for more.
This might be the final 3.0 release before 3.2.
#GIMP #GIMP3 #Gimp_3 #release #freeSoftware #libreGraphics #GNU #GnuImageEditor
@GIMP@floss.social
https://www.gimp.org/news/2026/01/24/gimp-3-0-8-released/
GIMP 3.0.8 released today.
A new version of the manual, including more translation work; fixes to bugs people have been kind enough to report.
Startup performance improved on many systems; colour profiles on Windows; SVG path import;
some minor UI improvements; security fixes; see link for more.
This might be the final 3.0 release before 3.2.
#GIMP #GIMP3 #Gimp_3 #release #freeSoftware #libreGraphics #GNU #GnuImageEditor
@obsoleszenz@nerdculture.de
⚡ LibreDJ v0.7.2 + v0.7.1 Release 🎉
v0.7.0 still had some blocking bugs including deck selection between midi controller & keyboard going out of sync and even more severe, an incorrect PartialOrd implementation that caused the library worker thread to panic.
I hope i now catched them all :)
On the more interesting side of things, along refactoring & fixing deck selection, it's now also possible to select more then one deck by eg Pressing and holding any of F1-F4 and combining it with another. As long as a key is pressed down, one can add other decks. Every action the user does that affects a deck will now be processed for every selected deck. To select only a single deck, simple press the corresponding button for that deck. This works now with keyboard + denon sc2000.
Project: https://codeberg.org/OpenDJLab/LibreDJ/
Full Changelog: https://codeberg.org/OpenDJLab/LibreDJ/src/branch/main/CHANGELOG.md#v0-7-2-24-01-2026
@obsoleszenz@nerdculture.de
⚡ LibreDJ v0.7.2 + v0.7.1 Release 🎉
v0.7.0 still had some blocking bugs including deck selection between midi controller & keyboard going out of sync and even more severe, an incorrect PartialOrd implementation that caused the library worker thread to panic.
I hope i now catched them all :)
On the more interesting side of things, along refactoring & fixing deck selection, it's now also possible to select more then one deck by eg Pressing and holding any of F1-F4 and combining it with another. As long as a key is pressed down, one can add other decks. Every action the user does that affects a deck will now be processed for every selected deck. To select only a single deck, simple press the corresponding button for that deck. This works now with keyboard + denon sc2000.
Project: https://codeberg.org/OpenDJLab/LibreDJ/
Full Changelog: https://codeberg.org/OpenDJLab/LibreDJ/src/branch/main/CHANGELOG.md#v0-7-2-24-01-2026
@lobsters@mastodon.social
Rheo - Typesetting and static site engine based on Typst https://lobste.rs/s/3zsexb #release #rust
https://github.com/freecomputinglab/rheo
@lobsters@mastodon.social
@pandoc@fosstodon.org
🆕 pandoc 3.8.3 🎉
This release adds three new input formats (#Asciidoc, #PPTX, and #XLSX) and one new output format (#BBCode + variants).
It also fixes a number of bugs (including some regressions in 3.8). See the changelog for full details.
Thanks to all who contributed!
@php@fosstodon.org
📣 Announcing the immediate availability of:
- PHP 8.5.2
- PHP 8.4.17
- PHP 8.3.30
📝 Changelog: https://www.php.net/ChangeLog-8.php
🎁 Source: https://www.php.net/downloads
Windows: https://www.php.net/downloads.php?os=windows
@hugovk@mastodon.social · Reply to Hugo van Kemenade's post
I heard you like alphas?
Just released! Python 3.15.0a5, this time built against `main` from today instead of last month! 🚀
https://discuss.python.org/t/python-3-15-0-alpha-5-yes-another-alpha/105721
@WoodpeckerCI@floss.social
WoodpeckerCI v3.13.0 is here! 🚀 New CLI contexts, notes on secrets, cron custom vars & disabling, Kubernetes pod affinity & headless services support, plus enhanced security & bug fixes. Update now for a smoother CI/CD! 🔧✨ #WoodpeckerCI #release #CI #DevOps 🛠️
@hugovk@mastodon.social
Really good to see new releases from Astral, pyenv and GitHub Actions just hours after a new Python release. And for an alpha at that!
@hugovk@mastodon.social · Reply to Hugo van Kemenade's post
Just released: Python 3.15.0a4 and look at those JIT numbers!
@feb@loma.ml
Mit der Lieferung der Sprachdatei ist klar, dass das Friendica-Release unmittelbar bevorsteht.
Die neuen Features und Verbesserungen der Usability kann man inzwischen nicht mehr zählen. Daher vorab ein großes Dankeschön an alle Beteiligten.
@feb@loma.ml
Mit der Lieferung der Sprachdatei ist klar, dass das Friendica-Release unmittelbar bevorsteht.
Die neuen Features und Verbesserungen der Usability kann man inzwischen nicht mehr zählen. Daher vorab ein großes Dankeschön an alle Beteiligten.
@feb@loma.ml
Mit der Lieferung der Sprachdatei ist klar, dass das Friendica-Release unmittelbar bevorsteht.
Die neuen Features und Verbesserungen der Usability kann man inzwischen nicht mehr zählen. Daher vorab ein großes Dankeschön an alle Beteiligten.
@feb@loma.ml
Mit der Lieferung der Sprachdatei ist klar, dass das Friendica-Release unmittelbar bevorsteht.
Die neuen Features und Verbesserungen der Usability kann man inzwischen nicht mehr zählen. Daher vorab ein großes Dankeschön an alle Beteiligten.
@homeassistant@fosstodon.org
Home Assistant 2026.1 🥂
Home dashboard improvements 🏡, easier navigation to protocol dashboards 🔎, and ESPHome action responses are just a few of the small but important changes this release. 😎
#HomeAssistant #SmartHome #Release #HomeAutomation
https://www.home-assistant.io/blog/2026/01/07/release-20261
@lobsters@mastodon.social
Pidgin 3.0 Experimental 5 (2.94.0) has been released https://lobste.rs/s/ukybhb #c #release
https://discourse.imfreedom.org/t/pidgin-3-0-experimental-5-2-94-0-has-been-released/338
@abnv@fantastic.earth
If I were to release a service to run on servers, how would you prefer I package it? A #poll: #selfhosting #software #release
| Option | Voters |
|---|---|
| Statically linked executable. | 22 (21%) |
| Dynamically linked executable. | 6 (6%) |
| Docker image. | 35 (33%) |
| Nix package + module. | 8 (8%) |
| Source + build and setup instructions. | 30 (29%) |
| Something else? Reply in comments. | 4 (4%) |
@abnv@fantastic.earth
If I were to release a service to run on servers, how would you prefer I package it? A #poll: #selfhosting #software #release
| Option | Voters |
|---|---|
| Statically linked executable. | 22 (21%) |
| Dynamically linked executable. | 6 (6%) |
| Docker image. | 35 (33%) |
| Nix package + module. | 8 (8%) |
| Source + build and setup instructions. | 30 (29%) |
| Something else? Reply in comments. | 4 (4%) |
@hugovk@mastodon.social · Reply to Hugo van Kemenade's post
Just released! 🚀
norwegianblue 0.24.0
CLI to show end-of-life dates
show spinner when querying
support 3.15
replace dateutil+six dependencies with stdlib
replace httpx with urllib3
replace pre-commit with prek
@hugovk@mastodon.social · Reply to Hugo van Kemenade's post
Just released! 🚀
pypistats 1.12.0
CLI for PyPI download stats
support 3.15
drop 3.9
improve verbose output
declare type hints
replace dateutil+six dependencies with stdlib
replace httpx with urllib
replace pre-commit with prek
@hugovk@mastodon.social · Reply to Hugo van Kemenade's post
Just released! 🚀
stravavis 0.6.0: create visualisations of Strava activities
* add option to select visualisations/allow --bbox as file/support 3.13-3.14/drop 3.9
https://github.com/marcusvolz/strava_py/releases/tag/v0.6.0
termcolor 3.3.0: ANSI formatting for the terminal
* add italic/fix error handling
https://github.com/termcolor/termcolor/releases/tag/3.3.0
pylast 7.0.1: A Python interface to Last.fm
* fix type hints
@fedify@hollo.social
Fedify is a #TypeScript framework for building #ActivityPub servers that participate in the #fediverse. It reduces the complexity and boilerplate typically required for ActivityPub implementation while providing comprehensive federation capabilities.
We're excited to announce #Fedify 1.10.0, a focused release that lays critical groundwork for future debugging and observability features. Released on December 24, 2025, this version introduces infrastructure improvements that will enable the upcoming debug dashboard while maintaining full backward compatibility with existing Fedify applications.
This release represents a transitional step toward Fedify 2.0.0, introducing optional capabilities that will become standard in the next major version. The changes focus on enabling richer observability through OpenTelemetry enhancements and adding prefix scanning capabilities to the key–value store interface.
Fedify 1.10.0 significantly expands OpenTelemetry instrumentation with span events that capture detailed ActivityPub data. These enhancements enable richer observability and debugging capabilities without relying solely on span attributes, which are limited to primitive values.
The new span events provide complete activity payloads and verification status, making it possible to build comprehensive debugging tools that show the full context of federation operations:
activitypub.activity.received event on activitypub.inbox span — records the full activity JSON, verification status (activity verified, HTTP signatures verified, Linked Data signatures verified), and actor informationactivitypub.activity.sent event on activitypub.send_activity span — records the full activity JSON and target inbox URLactivitypub.object.fetched event on activitypub.lookup_object span — records the fetched object's type and complete JSON-LD representationAdditionally, Fedify now instruments previously uncovered operations:
activitypub.fetch_document span for document loader operations, tracking URL fetching, HTTP redirects, and final document URLsactivitypub.verify_key_ownership span for cryptographic key ownership verification, recording actor ID, key ID, verification result, and the verification method usedThese instrumentation improvements emerged from work on issue #234 (Real-time ActivityPub debug dashboard). Rather than introducing a custom observer interface as originally proposed in #323, we leveraged Fedify's existing OpenTelemetry infrastructure to capture rich federation data through span events. This approach provides a standards-based foundation that's composable with existing observability tools like Jaeger, Zipkin, and Grafana Tempo.
FedifySpanExporterBuilding on the enhanced instrumentation, Fedify 1.10.0 introduces FedifySpanExporter, a new OpenTelemetry SpanExporter that persists ActivityPub activity traces to a KvStore. This enables distributed tracing support across multiple nodes in a Fedify deployment, which is essential for building debug dashboards that can show complete request flows across web servers and background workers.
The new @fedify/fedify/otel module provides the following types and interfaces:
import { MemoryKvStore } from "@fedify/fedify";
import { FedifySpanExporter } from "@fedify/fedify/otel";
import {
BasicTracerProvider,
SimpleSpanProcessor,
} from "@opentelemetry/sdk-trace-base";
const kv = new MemoryKvStore();
const exporter = new FedifySpanExporter(kv, {
ttl: Temporal.Duration.from({ hours: 1 }),
});
const provider = new BasicTracerProvider();
provider.addSpanProcessor(new SimpleSpanProcessor(exporter));The stored traces can be queried for display in debugging interfaces:
// Get all activities for a specific trace
const activities = await exporter.getActivitiesByTraceId(traceId);
// Get recent traces with summary information
const recentTraces = await exporter.getRecentTraces({ limit: 100 });The exporter supports two storage strategies depending on the KvStore capabilities. When the list() method is available (preferred), it stores individual records with keys like [prefix, traceId, spanId]. When only cas() is available, it uses compare-and-swap operations to append records to arrays stored per trace.
This infrastructure provides the foundation for implementing a comprehensive debug dashboard as a custom SpanExporter, as outlined in the updated implementation plan for issue #234.
list() method for KvStore interfaceFedify 1.10.0 adds an optional list() method to the KvStore interface for enumerating entries by key prefix. This method enables efficient prefix scanning, which is useful for implementing features like distributed trace storage, cache invalidation by prefix, and listing related entries.
interface KvStore {
// ... existing methods
list?(prefix?: KvKey): AsyncIterable<KvStoreListEntry>;
}When the prefix parameter is omitted or empty, list() returns all entries in the store. This is useful for debugging and administrative purposes. All official KvStore implementations have been updated to support this method:
MemoryKvStore — filters in-memory keys by prefixSqliteKvStore — uses LIKE query with JSON key patternPostgresKvStore — uses array slice comparisonRedisKvStore — uses SCAN with pattern matching and key deserializationDenoKvStore — delegates to Deno KV's built-in list() APIWorkersKvStore — uses Cloudflare Workers KV list() with JSON key prefix patternWhile list() is currently optional to give existing custom KvStore implementations time to add support, it will become a required method in Fedify 2.0.0 (tracked in issue #499). This migration path allows implementers to gradually adopt the new capability throughout the 1.x release cycle.
The addition of list() support was implemented in pull request #500, which also included the setup of proper testing infrastructure for WorkersKvStore using Vitest with @cloudflare/vitest-pool-workers.
Thanks to a contribution from Cho Hasang (@crohasang), the @fedify/nestjs package now supports NestJS 11 environments that use Express 5. The peer dependency range for Express has been widened to ^4.0.0 || ^5.0.0, eliminating peer dependency conflicts in modern NestJS projects while maintaining backward compatibility with Express 4.
This change, implemented in pull request #493, keeps the workspace catalog pinned to Express 4 for internal development and test stability while allowing Express 5 in consuming applications.
Fedify 1.10.0 serves as a stepping stone toward the upcoming 2.0.0 release. The optional list() method introduced in this version will become required in 2.0.0, simplifying the interface contract and allowing Fedify internals to rely on prefix scanning being universally available.
The enhanced #OpenTelemetry instrumentation and FedifySpanExporter provide the foundation for implementing the debug dashboard proposed in issue #234. The next steps include building the web dashboard UI with real-time activity lists, filtering, and JSON inspection capabilities—all as a separate package that leverages the standards-based observability infrastructure introduced in this release.
Depending on the development timeline and feature priorities, there may be additional 1.x releases before the 2.0.0 migration. For developers building custom KvStore implementations, now is the time to add list() support to prepare for the eventual 2.0.0 upgrade. The implementation patterns used in the official backends provide clear guidance for various storage strategies.
Special thanks to Cho Hasang (@crohasang) for the NestJS 11 compatibility improvements, and to all community members who provided feedback and testing for the new observability features.
For the complete list of changes, bug fixes, and improvements, please refer to the CHANGES.md file in the repository.
@fedify@hollo.social
Fedify is a #TypeScript framework for building #ActivityPub servers that participate in the #fediverse. It reduces the complexity and boilerplate typically required for ActivityPub implementation while providing comprehensive federation capabilities.
We're excited to announce #Fedify 1.10.0, a focused release that lays critical groundwork for future debugging and observability features. Released on December 24, 2025, this version introduces infrastructure improvements that will enable the upcoming debug dashboard while maintaining full backward compatibility with existing Fedify applications.
This release represents a transitional step toward Fedify 2.0.0, introducing optional capabilities that will become standard in the next major version. The changes focus on enabling richer observability through OpenTelemetry enhancements and adding prefix scanning capabilities to the key–value store interface.
Fedify 1.10.0 significantly expands OpenTelemetry instrumentation with span events that capture detailed ActivityPub data. These enhancements enable richer observability and debugging capabilities without relying solely on span attributes, which are limited to primitive values.
The new span events provide complete activity payloads and verification status, making it possible to build comprehensive debugging tools that show the full context of federation operations:
activitypub.activity.received event on activitypub.inbox span — records the full activity JSON, verification status (activity verified, HTTP signatures verified, Linked Data signatures verified), and actor informationactivitypub.activity.sent event on activitypub.send_activity span — records the full activity JSON and target inbox URLactivitypub.object.fetched event on activitypub.lookup_object span — records the fetched object's type and complete JSON-LD representationAdditionally, Fedify now instruments previously uncovered operations:
activitypub.fetch_document span for document loader operations, tracking URL fetching, HTTP redirects, and final document URLsactivitypub.verify_key_ownership span for cryptographic key ownership verification, recording actor ID, key ID, verification result, and the verification method usedThese instrumentation improvements emerged from work on issue #234 (Real-time ActivityPub debug dashboard). Rather than introducing a custom observer interface as originally proposed in #323, we leveraged Fedify's existing OpenTelemetry infrastructure to capture rich federation data through span events. This approach provides a standards-based foundation that's composable with existing observability tools like Jaeger, Zipkin, and Grafana Tempo.
FedifySpanExporterBuilding on the enhanced instrumentation, Fedify 1.10.0 introduces FedifySpanExporter, a new OpenTelemetry SpanExporter that persists ActivityPub activity traces to a KvStore. This enables distributed tracing support across multiple nodes in a Fedify deployment, which is essential for building debug dashboards that can show complete request flows across web servers and background workers.
The new @fedify/fedify/otel module provides the following types and interfaces:
import { MemoryKvStore } from "@fedify/fedify";
import { FedifySpanExporter } from "@fedify/fedify/otel";
import {
BasicTracerProvider,
SimpleSpanProcessor,
} from "@opentelemetry/sdk-trace-base";
const kv = new MemoryKvStore();
const exporter = new FedifySpanExporter(kv, {
ttl: Temporal.Duration.from({ hours: 1 }),
});
const provider = new BasicTracerProvider();
provider.addSpanProcessor(new SimpleSpanProcessor(exporter));The stored traces can be queried for display in debugging interfaces:
// Get all activities for a specific trace
const activities = await exporter.getActivitiesByTraceId(traceId);
// Get recent traces with summary information
const recentTraces = await exporter.getRecentTraces({ limit: 100 });The exporter supports two storage strategies depending on the KvStore capabilities. When the list() method is available (preferred), it stores individual records with keys like [prefix, traceId, spanId]. When only cas() is available, it uses compare-and-swap operations to append records to arrays stored per trace.
This infrastructure provides the foundation for implementing a comprehensive debug dashboard as a custom SpanExporter, as outlined in the updated implementation plan for issue #234.
list() method for KvStore interfaceFedify 1.10.0 adds an optional list() method to the KvStore interface for enumerating entries by key prefix. This method enables efficient prefix scanning, which is useful for implementing features like distributed trace storage, cache invalidation by prefix, and listing related entries.
interface KvStore {
// ... existing methods
list?(prefix?: KvKey): AsyncIterable<KvStoreListEntry>;
}When the prefix parameter is omitted or empty, list() returns all entries in the store. This is useful for debugging and administrative purposes. All official KvStore implementations have been updated to support this method:
MemoryKvStore — filters in-memory keys by prefixSqliteKvStore — uses LIKE query with JSON key patternPostgresKvStore — uses array slice comparisonRedisKvStore — uses SCAN with pattern matching and key deserializationDenoKvStore — delegates to Deno KV's built-in list() APIWorkersKvStore — uses Cloudflare Workers KV list() with JSON key prefix patternWhile list() is currently optional to give existing custom KvStore implementations time to add support, it will become a required method in Fedify 2.0.0 (tracked in issue #499). This migration path allows implementers to gradually adopt the new capability throughout the 1.x release cycle.
The addition of list() support was implemented in pull request #500, which also included the setup of proper testing infrastructure for WorkersKvStore using Vitest with @cloudflare/vitest-pool-workers.
Thanks to a contribution from Cho Hasang (@crohasang), the @fedify/nestjs package now supports NestJS 11 environments that use Express 5. The peer dependency range for Express has been widened to ^4.0.0 || ^5.0.0, eliminating peer dependency conflicts in modern NestJS projects while maintaining backward compatibility with Express 4.
This change, implemented in pull request #493, keeps the workspace catalog pinned to Express 4 for internal development and test stability while allowing Express 5 in consuming applications.
Fedify 1.10.0 serves as a stepping stone toward the upcoming 2.0.0 release. The optional list() method introduced in this version will become required in 2.0.0, simplifying the interface contract and allowing Fedify internals to rely on prefix scanning being universally available.
The enhanced #OpenTelemetry instrumentation and FedifySpanExporter provide the foundation for implementing the debug dashboard proposed in issue #234. The next steps include building the web dashboard UI with real-time activity lists, filtering, and JSON inspection capabilities—all as a separate package that leverages the standards-based observability infrastructure introduced in this release.
Depending on the development timeline and feature priorities, there may be additional 1.x releases before the 2.0.0 migration. For developers building custom KvStore implementations, now is the time to add list() support to prepare for the eventual 2.0.0 upgrade. The implementation patterns used in the official backends provide clear guidance for various storage strategies.
Special thanks to Cho Hasang (@crohasang) for the NestJS 11 compatibility improvements, and to all community members who provided feedback and testing for the new observability features.
For the complete list of changes, bug fixes, and improvements, please refer to the CHANGES.md file in the repository.
@fedify@hollo.social
Fedify is a #TypeScript framework for building #ActivityPub servers that participate in the #fediverse. It reduces the complexity and boilerplate typically required for ActivityPub implementation while providing comprehensive federation capabilities.
We're excited to announce #Fedify 1.10.0, a focused release that lays critical groundwork for future debugging and observability features. Released on December 24, 2025, this version introduces infrastructure improvements that will enable the upcoming debug dashboard while maintaining full backward compatibility with existing Fedify applications.
This release represents a transitional step toward Fedify 2.0.0, introducing optional capabilities that will become standard in the next major version. The changes focus on enabling richer observability through OpenTelemetry enhancements and adding prefix scanning capabilities to the key–value store interface.
Fedify 1.10.0 significantly expands OpenTelemetry instrumentation with span events that capture detailed ActivityPub data. These enhancements enable richer observability and debugging capabilities without relying solely on span attributes, which are limited to primitive values.
The new span events provide complete activity payloads and verification status, making it possible to build comprehensive debugging tools that show the full context of federation operations:
activitypub.activity.received event on activitypub.inbox span — records the full activity JSON, verification status (activity verified, HTTP signatures verified, Linked Data signatures verified), and actor informationactivitypub.activity.sent event on activitypub.send_activity span — records the full activity JSON and target inbox URLactivitypub.object.fetched event on activitypub.lookup_object span — records the fetched object's type and complete JSON-LD representationAdditionally, Fedify now instruments previously uncovered operations:
activitypub.fetch_document span for document loader operations, tracking URL fetching, HTTP redirects, and final document URLsactivitypub.verify_key_ownership span for cryptographic key ownership verification, recording actor ID, key ID, verification result, and the verification method usedThese instrumentation improvements emerged from work on issue #234 (Real-time ActivityPub debug dashboard). Rather than introducing a custom observer interface as originally proposed in #323, we leveraged Fedify's existing OpenTelemetry infrastructure to capture rich federation data through span events. This approach provides a standards-based foundation that's composable with existing observability tools like Jaeger, Zipkin, and Grafana Tempo.
FedifySpanExporterBuilding on the enhanced instrumentation, Fedify 1.10.0 introduces FedifySpanExporter, a new OpenTelemetry SpanExporter that persists ActivityPub activity traces to a KvStore. This enables distributed tracing support across multiple nodes in a Fedify deployment, which is essential for building debug dashboards that can show complete request flows across web servers and background workers.
The new @fedify/fedify/otel module provides the following types and interfaces:
import { MemoryKvStore } from "@fedify/fedify";
import { FedifySpanExporter } from "@fedify/fedify/otel";
import {
BasicTracerProvider,
SimpleSpanProcessor,
} from "@opentelemetry/sdk-trace-base";
const kv = new MemoryKvStore();
const exporter = new FedifySpanExporter(kv, {
ttl: Temporal.Duration.from({ hours: 1 }),
});
const provider = new BasicTracerProvider();
provider.addSpanProcessor(new SimpleSpanProcessor(exporter));The stored traces can be queried for display in debugging interfaces:
// Get all activities for a specific trace
const activities = await exporter.getActivitiesByTraceId(traceId);
// Get recent traces with summary information
const recentTraces = await exporter.getRecentTraces({ limit: 100 });The exporter supports two storage strategies depending on the KvStore capabilities. When the list() method is available (preferred), it stores individual records with keys like [prefix, traceId, spanId]. When only cas() is available, it uses compare-and-swap operations to append records to arrays stored per trace.
This infrastructure provides the foundation for implementing a comprehensive debug dashboard as a custom SpanExporter, as outlined in the updated implementation plan for issue #234.
list() method for KvStore interfaceFedify 1.10.0 adds an optional list() method to the KvStore interface for enumerating entries by key prefix. This method enables efficient prefix scanning, which is useful for implementing features like distributed trace storage, cache invalidation by prefix, and listing related entries.
interface KvStore {
// ... existing methods
list?(prefix?: KvKey): AsyncIterable<KvStoreListEntry>;
}When the prefix parameter is omitted or empty, list() returns all entries in the store. This is useful for debugging and administrative purposes. All official KvStore implementations have been updated to support this method:
MemoryKvStore — filters in-memory keys by prefixSqliteKvStore — uses LIKE query with JSON key patternPostgresKvStore — uses array slice comparisonRedisKvStore — uses SCAN with pattern matching and key deserializationDenoKvStore — delegates to Deno KV's built-in list() APIWorkersKvStore — uses Cloudflare Workers KV list() with JSON key prefix patternWhile list() is currently optional to give existing custom KvStore implementations time to add support, it will become a required method in Fedify 2.0.0 (tracked in issue #499). This migration path allows implementers to gradually adopt the new capability throughout the 1.x release cycle.
The addition of list() support was implemented in pull request #500, which also included the setup of proper testing infrastructure for WorkersKvStore using Vitest with @cloudflare/vitest-pool-workers.
Thanks to a contribution from Cho Hasang (@crohasang), the @fedify/nestjs package now supports NestJS 11 environments that use Express 5. The peer dependency range for Express has been widened to ^4.0.0 || ^5.0.0, eliminating peer dependency conflicts in modern NestJS projects while maintaining backward compatibility with Express 4.
This change, implemented in pull request #493, keeps the workspace catalog pinned to Express 4 for internal development and test stability while allowing Express 5 in consuming applications.
Fedify 1.10.0 serves as a stepping stone toward the upcoming 2.0.0 release. The optional list() method introduced in this version will become required in 2.0.0, simplifying the interface contract and allowing Fedify internals to rely on prefix scanning being universally available.
The enhanced #OpenTelemetry instrumentation and FedifySpanExporter provide the foundation for implementing the debug dashboard proposed in issue #234. The next steps include building the web dashboard UI with real-time activity lists, filtering, and JSON inspection capabilities—all as a separate package that leverages the standards-based observability infrastructure introduced in this release.
Depending on the development timeline and feature priorities, there may be additional 1.x releases before the 2.0.0 migration. For developers building custom KvStore implementations, now is the time to add list() support to prepare for the eventual 2.0.0 upgrade. The implementation patterns used in the official backends provide clear guidance for various storage strategies.
Special thanks to Cho Hasang (@crohasang) for the NestJS 11 compatibility improvements, and to all community members who provided feedback and testing for the new observability features.
For the complete list of changes, bug fixes, and improvements, please refer to the CHANGES.md file in the repository.
@fedify@hollo.social
Fedify is a #TypeScript framework for building #ActivityPub servers that participate in the #fediverse. It reduces the complexity and boilerplate typically required for ActivityPub implementation while providing comprehensive federation capabilities.
We're excited to announce #Fedify 1.10.0, a focused release that lays critical groundwork for future debugging and observability features. Released on December 24, 2025, this version introduces infrastructure improvements that will enable the upcoming debug dashboard while maintaining full backward compatibility with existing Fedify applications.
This release represents a transitional step toward Fedify 2.0.0, introducing optional capabilities that will become standard in the next major version. The changes focus on enabling richer observability through OpenTelemetry enhancements and adding prefix scanning capabilities to the key–value store interface.
Fedify 1.10.0 significantly expands OpenTelemetry instrumentation with span events that capture detailed ActivityPub data. These enhancements enable richer observability and debugging capabilities without relying solely on span attributes, which are limited to primitive values.
The new span events provide complete activity payloads and verification status, making it possible to build comprehensive debugging tools that show the full context of federation operations:
activitypub.activity.received event on activitypub.inbox span — records the full activity JSON, verification status (activity verified, HTTP signatures verified, Linked Data signatures verified), and actor informationactivitypub.activity.sent event on activitypub.send_activity span — records the full activity JSON and target inbox URLactivitypub.object.fetched event on activitypub.lookup_object span — records the fetched object's type and complete JSON-LD representationAdditionally, Fedify now instruments previously uncovered operations:
activitypub.fetch_document span for document loader operations, tracking URL fetching, HTTP redirects, and final document URLsactivitypub.verify_key_ownership span for cryptographic key ownership verification, recording actor ID, key ID, verification result, and the verification method usedThese instrumentation improvements emerged from work on issue #234 (Real-time ActivityPub debug dashboard). Rather than introducing a custom observer interface as originally proposed in #323, we leveraged Fedify's existing OpenTelemetry infrastructure to capture rich federation data through span events. This approach provides a standards-based foundation that's composable with existing observability tools like Jaeger, Zipkin, and Grafana Tempo.
FedifySpanExporterBuilding on the enhanced instrumentation, Fedify 1.10.0 introduces FedifySpanExporter, a new OpenTelemetry SpanExporter that persists ActivityPub activity traces to a KvStore. This enables distributed tracing support across multiple nodes in a Fedify deployment, which is essential for building debug dashboards that can show complete request flows across web servers and background workers.
The new @fedify/fedify/otel module provides the following types and interfaces:
import { MemoryKvStore } from "@fedify/fedify";
import { FedifySpanExporter } from "@fedify/fedify/otel";
import {
BasicTracerProvider,
SimpleSpanProcessor,
} from "@opentelemetry/sdk-trace-base";
const kv = new MemoryKvStore();
const exporter = new FedifySpanExporter(kv, {
ttl: Temporal.Duration.from({ hours: 1 }),
});
const provider = new BasicTracerProvider();
provider.addSpanProcessor(new SimpleSpanProcessor(exporter));The stored traces can be queried for display in debugging interfaces:
// Get all activities for a specific trace
const activities = await exporter.getActivitiesByTraceId(traceId);
// Get recent traces with summary information
const recentTraces = await exporter.getRecentTraces({ limit: 100 });The exporter supports two storage strategies depending on the KvStore capabilities. When the list() method is available (preferred), it stores individual records with keys like [prefix, traceId, spanId]. When only cas() is available, it uses compare-and-swap operations to append records to arrays stored per trace.
This infrastructure provides the foundation for implementing a comprehensive debug dashboard as a custom SpanExporter, as outlined in the updated implementation plan for issue #234.
list() method for KvStore interfaceFedify 1.10.0 adds an optional list() method to the KvStore interface for enumerating entries by key prefix. This method enables efficient prefix scanning, which is useful for implementing features like distributed trace storage, cache invalidation by prefix, and listing related entries.
interface KvStore {
// ... existing methods
list?(prefix?: KvKey): AsyncIterable<KvStoreListEntry>;
}When the prefix parameter is omitted or empty, list() returns all entries in the store. This is useful for debugging and administrative purposes. All official KvStore implementations have been updated to support this method:
MemoryKvStore — filters in-memory keys by prefixSqliteKvStore — uses LIKE query with JSON key patternPostgresKvStore — uses array slice comparisonRedisKvStore — uses SCAN with pattern matching and key deserializationDenoKvStore — delegates to Deno KV's built-in list() APIWorkersKvStore — uses Cloudflare Workers KV list() with JSON key prefix patternWhile list() is currently optional to give existing custom KvStore implementations time to add support, it will become a required method in Fedify 2.0.0 (tracked in issue #499). This migration path allows implementers to gradually adopt the new capability throughout the 1.x release cycle.
The addition of list() support was implemented in pull request #500, which also included the setup of proper testing infrastructure for WorkersKvStore using Vitest with @cloudflare/vitest-pool-workers.
Thanks to a contribution from Cho Hasang (@crohasang), the @fedify/nestjs package now supports NestJS 11 environments that use Express 5. The peer dependency range for Express has been widened to ^4.0.0 || ^5.0.0, eliminating peer dependency conflicts in modern NestJS projects while maintaining backward compatibility with Express 4.
This change, implemented in pull request #493, keeps the workspace catalog pinned to Express 4 for internal development and test stability while allowing Express 5 in consuming applications.
Fedify 1.10.0 serves as a stepping stone toward the upcoming 2.0.0 release. The optional list() method introduced in this version will become required in 2.0.0, simplifying the interface contract and allowing Fedify internals to rely on prefix scanning being universally available.
The enhanced #OpenTelemetry instrumentation and FedifySpanExporter provide the foundation for implementing the debug dashboard proposed in issue #234. The next steps include building the web dashboard UI with real-time activity lists, filtering, and JSON inspection capabilities—all as a separate package that leverages the standards-based observability infrastructure introduced in this release.
Depending on the development timeline and feature priorities, there may be additional 1.x releases before the 2.0.0 migration. For developers building custom KvStore implementations, now is the time to add list() support to prepare for the eventual 2.0.0 upgrade. The implementation patterns used in the official backends provide clear guidance for various storage strategies.
Special thanks to Cho Hasang (@crohasang) for the NestJS 11 compatibility improvements, and to all community members who provided feedback and testing for the new observability features.
For the complete list of changes, bug fixes, and improvements, please refer to the CHANGES.md file in the repository.
@fedify@hollo.social
Fedify is a #TypeScript framework for building #ActivityPub servers that participate in the #fediverse. It reduces the complexity and boilerplate typically required for ActivityPub implementation while providing comprehensive federation capabilities.
We're excited to announce #Fedify 1.10.0, a focused release that lays critical groundwork for future debugging and observability features. Released on December 24, 2025, this version introduces infrastructure improvements that will enable the upcoming debug dashboard while maintaining full backward compatibility with existing Fedify applications.
This release represents a transitional step toward Fedify 2.0.0, introducing optional capabilities that will become standard in the next major version. The changes focus on enabling richer observability through OpenTelemetry enhancements and adding prefix scanning capabilities to the key–value store interface.
Fedify 1.10.0 significantly expands OpenTelemetry instrumentation with span events that capture detailed ActivityPub data. These enhancements enable richer observability and debugging capabilities without relying solely on span attributes, which are limited to primitive values.
The new span events provide complete activity payloads and verification status, making it possible to build comprehensive debugging tools that show the full context of federation operations:
activitypub.activity.received event on activitypub.inbox span — records the full activity JSON, verification status (activity verified, HTTP signatures verified, Linked Data signatures verified), and actor informationactivitypub.activity.sent event on activitypub.send_activity span — records the full activity JSON and target inbox URLactivitypub.object.fetched event on activitypub.lookup_object span — records the fetched object's type and complete JSON-LD representationAdditionally, Fedify now instruments previously uncovered operations:
activitypub.fetch_document span for document loader operations, tracking URL fetching, HTTP redirects, and final document URLsactivitypub.verify_key_ownership span for cryptographic key ownership verification, recording actor ID, key ID, verification result, and the verification method usedThese instrumentation improvements emerged from work on issue #234 (Real-time ActivityPub debug dashboard). Rather than introducing a custom observer interface as originally proposed in #323, we leveraged Fedify's existing OpenTelemetry infrastructure to capture rich federation data through span events. This approach provides a standards-based foundation that's composable with existing observability tools like Jaeger, Zipkin, and Grafana Tempo.
FedifySpanExporterBuilding on the enhanced instrumentation, Fedify 1.10.0 introduces FedifySpanExporter, a new OpenTelemetry SpanExporter that persists ActivityPub activity traces to a KvStore. This enables distributed tracing support across multiple nodes in a Fedify deployment, which is essential for building debug dashboards that can show complete request flows across web servers and background workers.
The new @fedify/fedify/otel module provides the following types and interfaces:
import { MemoryKvStore } from "@fedify/fedify";
import { FedifySpanExporter } from "@fedify/fedify/otel";
import {
BasicTracerProvider,
SimpleSpanProcessor,
} from "@opentelemetry/sdk-trace-base";
const kv = new MemoryKvStore();
const exporter = new FedifySpanExporter(kv, {
ttl: Temporal.Duration.from({ hours: 1 }),
});
const provider = new BasicTracerProvider();
provider.addSpanProcessor(new SimpleSpanProcessor(exporter));The stored traces can be queried for display in debugging interfaces:
// Get all activities for a specific trace
const activities = await exporter.getActivitiesByTraceId(traceId);
// Get recent traces with summary information
const recentTraces = await exporter.getRecentTraces({ limit: 100 });The exporter supports two storage strategies depending on the KvStore capabilities. When the list() method is available (preferred), it stores individual records with keys like [prefix, traceId, spanId]. When only cas() is available, it uses compare-and-swap operations to append records to arrays stored per trace.
This infrastructure provides the foundation for implementing a comprehensive debug dashboard as a custom SpanExporter, as outlined in the updated implementation plan for issue #234.
list() method for KvStore interfaceFedify 1.10.0 adds an optional list() method to the KvStore interface for enumerating entries by key prefix. This method enables efficient prefix scanning, which is useful for implementing features like distributed trace storage, cache invalidation by prefix, and listing related entries.
interface KvStore {
// ... existing methods
list?(prefix?: KvKey): AsyncIterable<KvStoreListEntry>;
}When the prefix parameter is omitted or empty, list() returns all entries in the store. This is useful for debugging and administrative purposes. All official KvStore implementations have been updated to support this method:
MemoryKvStore — filters in-memory keys by prefixSqliteKvStore — uses LIKE query with JSON key patternPostgresKvStore — uses array slice comparisonRedisKvStore — uses SCAN with pattern matching and key deserializationDenoKvStore — delegates to Deno KV's built-in list() APIWorkersKvStore — uses Cloudflare Workers KV list() with JSON key prefix patternWhile list() is currently optional to give existing custom KvStore implementations time to add support, it will become a required method in Fedify 2.0.0 (tracked in issue #499). This migration path allows implementers to gradually adopt the new capability throughout the 1.x release cycle.
The addition of list() support was implemented in pull request #500, which also included the setup of proper testing infrastructure for WorkersKvStore using Vitest with @cloudflare/vitest-pool-workers.
Thanks to a contribution from Cho Hasang (@crohasang), the @fedify/nestjs package now supports NestJS 11 environments that use Express 5. The peer dependency range for Express has been widened to ^4.0.0 || ^5.0.0, eliminating peer dependency conflicts in modern NestJS projects while maintaining backward compatibility with Express 4.
This change, implemented in pull request #493, keeps the workspace catalog pinned to Express 4 for internal development and test stability while allowing Express 5 in consuming applications.
Fedify 1.10.0 serves as a stepping stone toward the upcoming 2.0.0 release. The optional list() method introduced in this version will become required in 2.0.0, simplifying the interface contract and allowing Fedify internals to rely on prefix scanning being universally available.
The enhanced #OpenTelemetry instrumentation and FedifySpanExporter provide the foundation for implementing the debug dashboard proposed in issue #234. The next steps include building the web dashboard UI with real-time activity lists, filtering, and JSON inspection capabilities—all as a separate package that leverages the standards-based observability infrastructure introduced in this release.
Depending on the development timeline and feature priorities, there may be additional 1.x releases before the 2.0.0 migration. For developers building custom KvStore implementations, now is the time to add list() support to prepare for the eventual 2.0.0 upgrade. The implementation patterns used in the official backends provide clear guidance for various storage strategies.
Special thanks to Cho Hasang (@crohasang) for the NestJS 11 compatibility improvements, and to all community members who provided feedback and testing for the new observability features.
For the complete list of changes, bug fixes, and improvements, please refer to the CHANGES.md file in the repository.
@fedify@hollo.social
Fedify is a #TypeScript framework for building #ActivityPub servers that participate in the #fediverse. It reduces the complexity and boilerplate typically required for ActivityPub implementation while providing comprehensive federation capabilities.
We're excited to announce #Fedify 1.10.0, a focused release that lays critical groundwork for future debugging and observability features. Released on December 24, 2025, this version introduces infrastructure improvements that will enable the upcoming debug dashboard while maintaining full backward compatibility with existing Fedify applications.
This release represents a transitional step toward Fedify 2.0.0, introducing optional capabilities that will become standard in the next major version. The changes focus on enabling richer observability through OpenTelemetry enhancements and adding prefix scanning capabilities to the key–value store interface.
Fedify 1.10.0 significantly expands OpenTelemetry instrumentation with span events that capture detailed ActivityPub data. These enhancements enable richer observability and debugging capabilities without relying solely on span attributes, which are limited to primitive values.
The new span events provide complete activity payloads and verification status, making it possible to build comprehensive debugging tools that show the full context of federation operations:
activitypub.activity.received event on activitypub.inbox span — records the full activity JSON, verification status (activity verified, HTTP signatures verified, Linked Data signatures verified), and actor informationactivitypub.activity.sent event on activitypub.send_activity span — records the full activity JSON and target inbox URLactivitypub.object.fetched event on activitypub.lookup_object span — records the fetched object's type and complete JSON-LD representationAdditionally, Fedify now instruments previously uncovered operations:
activitypub.fetch_document span for document loader operations, tracking URL fetching, HTTP redirects, and final document URLsactivitypub.verify_key_ownership span for cryptographic key ownership verification, recording actor ID, key ID, verification result, and the verification method usedThese instrumentation improvements emerged from work on issue #234 (Real-time ActivityPub debug dashboard). Rather than introducing a custom observer interface as originally proposed in #323, we leveraged Fedify's existing OpenTelemetry infrastructure to capture rich federation data through span events. This approach provides a standards-based foundation that's composable with existing observability tools like Jaeger, Zipkin, and Grafana Tempo.
FedifySpanExporterBuilding on the enhanced instrumentation, Fedify 1.10.0 introduces FedifySpanExporter, a new OpenTelemetry SpanExporter that persists ActivityPub activity traces to a KvStore. This enables distributed tracing support across multiple nodes in a Fedify deployment, which is essential for building debug dashboards that can show complete request flows across web servers and background workers.
The new @fedify/fedify/otel module provides the following types and interfaces:
import { MemoryKvStore } from "@fedify/fedify";
import { FedifySpanExporter } from "@fedify/fedify/otel";
import {
BasicTracerProvider,
SimpleSpanProcessor,
} from "@opentelemetry/sdk-trace-base";
const kv = new MemoryKvStore();
const exporter = new FedifySpanExporter(kv, {
ttl: Temporal.Duration.from({ hours: 1 }),
});
const provider = new BasicTracerProvider();
provider.addSpanProcessor(new SimpleSpanProcessor(exporter));The stored traces can be queried for display in debugging interfaces:
// Get all activities for a specific trace
const activities = await exporter.getActivitiesByTraceId(traceId);
// Get recent traces with summary information
const recentTraces = await exporter.getRecentTraces({ limit: 100 });The exporter supports two storage strategies depending on the KvStore capabilities. When the list() method is available (preferred), it stores individual records with keys like [prefix, traceId, spanId]. When only cas() is available, it uses compare-and-swap operations to append records to arrays stored per trace.
This infrastructure provides the foundation for implementing a comprehensive debug dashboard as a custom SpanExporter, as outlined in the updated implementation plan for issue #234.
list() method for KvStore interfaceFedify 1.10.0 adds an optional list() method to the KvStore interface for enumerating entries by key prefix. This method enables efficient prefix scanning, which is useful for implementing features like distributed trace storage, cache invalidation by prefix, and listing related entries.
interface KvStore {
// ... existing methods
list?(prefix?: KvKey): AsyncIterable<KvStoreListEntry>;
}When the prefix parameter is omitted or empty, list() returns all entries in the store. This is useful for debugging and administrative purposes. All official KvStore implementations have been updated to support this method:
MemoryKvStore — filters in-memory keys by prefixSqliteKvStore — uses LIKE query with JSON key patternPostgresKvStore — uses array slice comparisonRedisKvStore — uses SCAN with pattern matching and key deserializationDenoKvStore — delegates to Deno KV's built-in list() APIWorkersKvStore — uses Cloudflare Workers KV list() with JSON key prefix patternWhile list() is currently optional to give existing custom KvStore implementations time to add support, it will become a required method in Fedify 2.0.0 (tracked in issue #499). This migration path allows implementers to gradually adopt the new capability throughout the 1.x release cycle.
The addition of list() support was implemented in pull request #500, which also included the setup of proper testing infrastructure for WorkersKvStore using Vitest with @cloudflare/vitest-pool-workers.
Thanks to a contribution from Cho Hasang (@crohasang), the @fedify/nestjs package now supports NestJS 11 environments that use Express 5. The peer dependency range for Express has been widened to ^4.0.0 || ^5.0.0, eliminating peer dependency conflicts in modern NestJS projects while maintaining backward compatibility with Express 4.
This change, implemented in pull request #493, keeps the workspace catalog pinned to Express 4 for internal development and test stability while allowing Express 5 in consuming applications.
Fedify 1.10.0 serves as a stepping stone toward the upcoming 2.0.0 release. The optional list() method introduced in this version will become required in 2.0.0, simplifying the interface contract and allowing Fedify internals to rely on prefix scanning being universally available.
The enhanced #OpenTelemetry instrumentation and FedifySpanExporter provide the foundation for implementing the debug dashboard proposed in issue #234. The next steps include building the web dashboard UI with real-time activity lists, filtering, and JSON inspection capabilities—all as a separate package that leverages the standards-based observability infrastructure introduced in this release.
Depending on the development timeline and feature priorities, there may be additional 1.x releases before the 2.0.0 migration. For developers building custom KvStore implementations, now is the time to add list() support to prepare for the eventual 2.0.0 upgrade. The implementation patterns used in the official backends provide clear guidance for various storage strategies.
Special thanks to Cho Hasang (@crohasang) for the NestJS 11 compatibility improvements, and to all community members who provided feedback and testing for the new observability features.
For the complete list of changes, bug fixes, and improvements, please refer to the CHANGES.md file in the repository.
@fedify@hollo.social
Fedify is a #TypeScript framework for building #ActivityPub servers that participate in the #fediverse. It reduces the complexity and boilerplate typically required for ActivityPub implementation while providing comprehensive federation capabilities.
We're excited to announce #Fedify 1.10.0, a focused release that lays critical groundwork for future debugging and observability features. Released on December 24, 2025, this version introduces infrastructure improvements that will enable the upcoming debug dashboard while maintaining full backward compatibility with existing Fedify applications.
This release represents a transitional step toward Fedify 2.0.0, introducing optional capabilities that will become standard in the next major version. The changes focus on enabling richer observability through OpenTelemetry enhancements and adding prefix scanning capabilities to the key–value store interface.
Fedify 1.10.0 significantly expands OpenTelemetry instrumentation with span events that capture detailed ActivityPub data. These enhancements enable richer observability and debugging capabilities without relying solely on span attributes, which are limited to primitive values.
The new span events provide complete activity payloads and verification status, making it possible to build comprehensive debugging tools that show the full context of federation operations:
activitypub.activity.received event on activitypub.inbox span — records the full activity JSON, verification status (activity verified, HTTP signatures verified, Linked Data signatures verified), and actor informationactivitypub.activity.sent event on activitypub.send_activity span — records the full activity JSON and target inbox URLactivitypub.object.fetched event on activitypub.lookup_object span — records the fetched object's type and complete JSON-LD representationAdditionally, Fedify now instruments previously uncovered operations:
activitypub.fetch_document span for document loader operations, tracking URL fetching, HTTP redirects, and final document URLsactivitypub.verify_key_ownership span for cryptographic key ownership verification, recording actor ID, key ID, verification result, and the verification method usedThese instrumentation improvements emerged from work on issue #234 (Real-time ActivityPub debug dashboard). Rather than introducing a custom observer interface as originally proposed in #323, we leveraged Fedify's existing OpenTelemetry infrastructure to capture rich federation data through span events. This approach provides a standards-based foundation that's composable with existing observability tools like Jaeger, Zipkin, and Grafana Tempo.
FedifySpanExporterBuilding on the enhanced instrumentation, Fedify 1.10.0 introduces FedifySpanExporter, a new OpenTelemetry SpanExporter that persists ActivityPub activity traces to a KvStore. This enables distributed tracing support across multiple nodes in a Fedify deployment, which is essential for building debug dashboards that can show complete request flows across web servers and background workers.
The new @fedify/fedify/otel module provides the following types and interfaces:
import { MemoryKvStore } from "@fedify/fedify";
import { FedifySpanExporter } from "@fedify/fedify/otel";
import {
BasicTracerProvider,
SimpleSpanProcessor,
} from "@opentelemetry/sdk-trace-base";
const kv = new MemoryKvStore();
const exporter = new FedifySpanExporter(kv, {
ttl: Temporal.Duration.from({ hours: 1 }),
});
const provider = new BasicTracerProvider();
provider.addSpanProcessor(new SimpleSpanProcessor(exporter));The stored traces can be queried for display in debugging interfaces:
// Get all activities for a specific trace
const activities = await exporter.getActivitiesByTraceId(traceId);
// Get recent traces with summary information
const recentTraces = await exporter.getRecentTraces({ limit: 100 });The exporter supports two storage strategies depending on the KvStore capabilities. When the list() method is available (preferred), it stores individual records with keys like [prefix, traceId, spanId]. When only cas() is available, it uses compare-and-swap operations to append records to arrays stored per trace.
This infrastructure provides the foundation for implementing a comprehensive debug dashboard as a custom SpanExporter, as outlined in the updated implementation plan for issue #234.
list() method for KvStore interfaceFedify 1.10.0 adds an optional list() method to the KvStore interface for enumerating entries by key prefix. This method enables efficient prefix scanning, which is useful for implementing features like distributed trace storage, cache invalidation by prefix, and listing related entries.
interface KvStore {
// ... existing methods
list?(prefix?: KvKey): AsyncIterable<KvStoreListEntry>;
}When the prefix parameter is omitted or empty, list() returns all entries in the store. This is useful for debugging and administrative purposes. All official KvStore implementations have been updated to support this method:
MemoryKvStore — filters in-memory keys by prefixSqliteKvStore — uses LIKE query with JSON key patternPostgresKvStore — uses array slice comparisonRedisKvStore — uses SCAN with pattern matching and key deserializationDenoKvStore — delegates to Deno KV's built-in list() APIWorkersKvStore — uses Cloudflare Workers KV list() with JSON key prefix patternWhile list() is currently optional to give existing custom KvStore implementations time to add support, it will become a required method in Fedify 2.0.0 (tracked in issue #499). This migration path allows implementers to gradually adopt the new capability throughout the 1.x release cycle.
The addition of list() support was implemented in pull request #500, which also included the setup of proper testing infrastructure for WorkersKvStore using Vitest with @cloudflare/vitest-pool-workers.
Thanks to a contribution from Cho Hasang (@crohasang), the @fedify/nestjs package now supports NestJS 11 environments that use Express 5. The peer dependency range for Express has been widened to ^4.0.0 || ^5.0.0, eliminating peer dependency conflicts in modern NestJS projects while maintaining backward compatibility with Express 4.
This change, implemented in pull request #493, keeps the workspace catalog pinned to Express 4 for internal development and test stability while allowing Express 5 in consuming applications.
Fedify 1.10.0 serves as a stepping stone toward the upcoming 2.0.0 release. The optional list() method introduced in this version will become required in 2.0.0, simplifying the interface contract and allowing Fedify internals to rely on prefix scanning being universally available.
The enhanced #OpenTelemetry instrumentation and FedifySpanExporter provide the foundation for implementing the debug dashboard proposed in issue #234. The next steps include building the web dashboard UI with real-time activity lists, filtering, and JSON inspection capabilities—all as a separate package that leverages the standards-based observability infrastructure introduced in this release.
Depending on the development timeline and feature priorities, there may be additional 1.x releases before the 2.0.0 migration. For developers building custom KvStore implementations, now is the time to add list() support to prepare for the eventual 2.0.0 upgrade. The implementation patterns used in the official backends provide clear guidance for various storage strategies.
Special thanks to Cho Hasang (@crohasang) for the NestJS 11 compatibility improvements, and to all community members who provided feedback and testing for the new observability features.
For the complete list of changes, bug fixes, and improvements, please refer to the CHANGES.md file in the repository.
@fedify@hollo.social
Fedify is a #TypeScript framework for building #ActivityPub servers that participate in the #fediverse. It reduces the complexity and boilerplate typically required for ActivityPub implementation while providing comprehensive federation capabilities.
We're excited to announce #Fedify 1.10.0, a focused release that lays critical groundwork for future debugging and observability features. Released on December 24, 2025, this version introduces infrastructure improvements that will enable the upcoming debug dashboard while maintaining full backward compatibility with existing Fedify applications.
This release represents a transitional step toward Fedify 2.0.0, introducing optional capabilities that will become standard in the next major version. The changes focus on enabling richer observability through OpenTelemetry enhancements and adding prefix scanning capabilities to the key–value store interface.
Fedify 1.10.0 significantly expands OpenTelemetry instrumentation with span events that capture detailed ActivityPub data. These enhancements enable richer observability and debugging capabilities without relying solely on span attributes, which are limited to primitive values.
The new span events provide complete activity payloads and verification status, making it possible to build comprehensive debugging tools that show the full context of federation operations:
activitypub.activity.received event on activitypub.inbox span — records the full activity JSON, verification status (activity verified, HTTP signatures verified, Linked Data signatures verified), and actor informationactivitypub.activity.sent event on activitypub.send_activity span — records the full activity JSON and target inbox URLactivitypub.object.fetched event on activitypub.lookup_object span — records the fetched object's type and complete JSON-LD representationAdditionally, Fedify now instruments previously uncovered operations:
activitypub.fetch_document span for document loader operations, tracking URL fetching, HTTP redirects, and final document URLsactivitypub.verify_key_ownership span for cryptographic key ownership verification, recording actor ID, key ID, verification result, and the verification method usedThese instrumentation improvements emerged from work on issue #234 (Real-time ActivityPub debug dashboard). Rather than introducing a custom observer interface as originally proposed in #323, we leveraged Fedify's existing OpenTelemetry infrastructure to capture rich federation data through span events. This approach provides a standards-based foundation that's composable with existing observability tools like Jaeger, Zipkin, and Grafana Tempo.
FedifySpanExporterBuilding on the enhanced instrumentation, Fedify 1.10.0 introduces FedifySpanExporter, a new OpenTelemetry SpanExporter that persists ActivityPub activity traces to a KvStore. This enables distributed tracing support across multiple nodes in a Fedify deployment, which is essential for building debug dashboards that can show complete request flows across web servers and background workers.
The new @fedify/fedify/otel module provides the following types and interfaces:
import { MemoryKvStore } from "@fedify/fedify";
import { FedifySpanExporter } from "@fedify/fedify/otel";
import {
BasicTracerProvider,
SimpleSpanProcessor,
} from "@opentelemetry/sdk-trace-base";
const kv = new MemoryKvStore();
const exporter = new FedifySpanExporter(kv, {
ttl: Temporal.Duration.from({ hours: 1 }),
});
const provider = new BasicTracerProvider();
provider.addSpanProcessor(new SimpleSpanProcessor(exporter));The stored traces can be queried for display in debugging interfaces:
// Get all activities for a specific trace
const activities = await exporter.getActivitiesByTraceId(traceId);
// Get recent traces with summary information
const recentTraces = await exporter.getRecentTraces({ limit: 100 });The exporter supports two storage strategies depending on the KvStore capabilities. When the list() method is available (preferred), it stores individual records with keys like [prefix, traceId, spanId]. When only cas() is available, it uses compare-and-swap operations to append records to arrays stored per trace.
This infrastructure provides the foundation for implementing a comprehensive debug dashboard as a custom SpanExporter, as outlined in the updated implementation plan for issue #234.
list() method for KvStore interfaceFedify 1.10.0 adds an optional list() method to the KvStore interface for enumerating entries by key prefix. This method enables efficient prefix scanning, which is useful for implementing features like distributed trace storage, cache invalidation by prefix, and listing related entries.
interface KvStore {
// ... existing methods
list?(prefix?: KvKey): AsyncIterable<KvStoreListEntry>;
}When the prefix parameter is omitted or empty, list() returns all entries in the store. This is useful for debugging and administrative purposes. All official KvStore implementations have been updated to support this method:
MemoryKvStore — filters in-memory keys by prefixSqliteKvStore — uses LIKE query with JSON key patternPostgresKvStore — uses array slice comparisonRedisKvStore — uses SCAN with pattern matching and key deserializationDenoKvStore — delegates to Deno KV's built-in list() APIWorkersKvStore — uses Cloudflare Workers KV list() with JSON key prefix patternWhile list() is currently optional to give existing custom KvStore implementations time to add support, it will become a required method in Fedify 2.0.0 (tracked in issue #499). This migration path allows implementers to gradually adopt the new capability throughout the 1.x release cycle.
The addition of list() support was implemented in pull request #500, which also included the setup of proper testing infrastructure for WorkersKvStore using Vitest with @cloudflare/vitest-pool-workers.
Thanks to a contribution from Cho Hasang (@crohasang), the @fedify/nestjs package now supports NestJS 11 environments that use Express 5. The peer dependency range for Express has been widened to ^4.0.0 || ^5.0.0, eliminating peer dependency conflicts in modern NestJS projects while maintaining backward compatibility with Express 4.
This change, implemented in pull request #493, keeps the workspace catalog pinned to Express 4 for internal development and test stability while allowing Express 5 in consuming applications.
Fedify 1.10.0 serves as a stepping stone toward the upcoming 2.0.0 release. The optional list() method introduced in this version will become required in 2.0.0, simplifying the interface contract and allowing Fedify internals to rely on prefix scanning being universally available.
The enhanced #OpenTelemetry instrumentation and FedifySpanExporter provide the foundation for implementing the debug dashboard proposed in issue #234. The next steps include building the web dashboard UI with real-time activity lists, filtering, and JSON inspection capabilities—all as a separate package that leverages the standards-based observability infrastructure introduced in this release.
Depending on the development timeline and feature priorities, there may be additional 1.x releases before the 2.0.0 migration. For developers building custom KvStore implementations, now is the time to add list() support to prepare for the eventual 2.0.0 upgrade. The implementation patterns used in the official backends provide clear guidance for various storage strategies.
Special thanks to Cho Hasang (@crohasang) for the NestJS 11 compatibility improvements, and to all community members who provided feedback and testing for the new observability features.
For the complete list of changes, bug fixes, and improvements, please refer to the CHANGES.md file in the repository.
@fedify@hollo.social
Fedify is a #TypeScript framework for building #ActivityPub servers that participate in the #fediverse. It reduces the complexity and boilerplate typically required for ActivityPub implementation while providing comprehensive federation capabilities.
We're excited to announce #Fedify 1.10.0, a focused release that lays critical groundwork for future debugging and observability features. Released on December 24, 2025, this version introduces infrastructure improvements that will enable the upcoming debug dashboard while maintaining full backward compatibility with existing Fedify applications.
This release represents a transitional step toward Fedify 2.0.0, introducing optional capabilities that will become standard in the next major version. The changes focus on enabling richer observability through OpenTelemetry enhancements and adding prefix scanning capabilities to the key–value store interface.
Fedify 1.10.0 significantly expands OpenTelemetry instrumentation with span events that capture detailed ActivityPub data. These enhancements enable richer observability and debugging capabilities without relying solely on span attributes, which are limited to primitive values.
The new span events provide complete activity payloads and verification status, making it possible to build comprehensive debugging tools that show the full context of federation operations:
activitypub.activity.received event on activitypub.inbox span — records the full activity JSON, verification status (activity verified, HTTP signatures verified, Linked Data signatures verified), and actor informationactivitypub.activity.sent event on activitypub.send_activity span — records the full activity JSON and target inbox URLactivitypub.object.fetched event on activitypub.lookup_object span — records the fetched object's type and complete JSON-LD representationAdditionally, Fedify now instruments previously uncovered operations:
activitypub.fetch_document span for document loader operations, tracking URL fetching, HTTP redirects, and final document URLsactivitypub.verify_key_ownership span for cryptographic key ownership verification, recording actor ID, key ID, verification result, and the verification method usedThese instrumentation improvements emerged from work on issue #234 (Real-time ActivityPub debug dashboard). Rather than introducing a custom observer interface as originally proposed in #323, we leveraged Fedify's existing OpenTelemetry infrastructure to capture rich federation data through span events. This approach provides a standards-based foundation that's composable with existing observability tools like Jaeger, Zipkin, and Grafana Tempo.
FedifySpanExporterBuilding on the enhanced instrumentation, Fedify 1.10.0 introduces FedifySpanExporter, a new OpenTelemetry SpanExporter that persists ActivityPub activity traces to a KvStore. This enables distributed tracing support across multiple nodes in a Fedify deployment, which is essential for building debug dashboards that can show complete request flows across web servers and background workers.
The new @fedify/fedify/otel module provides the following types and interfaces:
import { MemoryKvStore } from "@fedify/fedify";
import { FedifySpanExporter } from "@fedify/fedify/otel";
import {
BasicTracerProvider,
SimpleSpanProcessor,
} from "@opentelemetry/sdk-trace-base";
const kv = new MemoryKvStore();
const exporter = new FedifySpanExporter(kv, {
ttl: Temporal.Duration.from({ hours: 1 }),
});
const provider = new BasicTracerProvider();
provider.addSpanProcessor(new SimpleSpanProcessor(exporter));The stored traces can be queried for display in debugging interfaces:
// Get all activities for a specific trace
const activities = await exporter.getActivitiesByTraceId(traceId);
// Get recent traces with summary information
const recentTraces = await exporter.getRecentTraces({ limit: 100 });The exporter supports two storage strategies depending on the KvStore capabilities. When the list() method is available (preferred), it stores individual records with keys like [prefix, traceId, spanId]. When only cas() is available, it uses compare-and-swap operations to append records to arrays stored per trace.
This infrastructure provides the foundation for implementing a comprehensive debug dashboard as a custom SpanExporter, as outlined in the updated implementation plan for issue #234.
list() method for KvStore interfaceFedify 1.10.0 adds an optional list() method to the KvStore interface for enumerating entries by key prefix. This method enables efficient prefix scanning, which is useful for implementing features like distributed trace storage, cache invalidation by prefix, and listing related entries.
interface KvStore {
// ... existing methods
list?(prefix?: KvKey): AsyncIterable<KvStoreListEntry>;
}When the prefix parameter is omitted or empty, list() returns all entries in the store. This is useful for debugging and administrative purposes. All official KvStore implementations have been updated to support this method:
MemoryKvStore — filters in-memory keys by prefixSqliteKvStore — uses LIKE query with JSON key patternPostgresKvStore — uses array slice comparisonRedisKvStore — uses SCAN with pattern matching and key deserializationDenoKvStore — delegates to Deno KV's built-in list() APIWorkersKvStore — uses Cloudflare Workers KV list() with JSON key prefix patternWhile list() is currently optional to give existing custom KvStore implementations time to add support, it will become a required method in Fedify 2.0.0 (tracked in issue #499). This migration path allows implementers to gradually adopt the new capability throughout the 1.x release cycle.
The addition of list() support was implemented in pull request #500, which also included the setup of proper testing infrastructure for WorkersKvStore using Vitest with @cloudflare/vitest-pool-workers.
Thanks to a contribution from Cho Hasang (@crohasang), the @fedify/nestjs package now supports NestJS 11 environments that use Express 5. The peer dependency range for Express has been widened to ^4.0.0 || ^5.0.0, eliminating peer dependency conflicts in modern NestJS projects while maintaining backward compatibility with Express 4.
This change, implemented in pull request #493, keeps the workspace catalog pinned to Express 4 for internal development and test stability while allowing Express 5 in consuming applications.
Fedify 1.10.0 serves as a stepping stone toward the upcoming 2.0.0 release. The optional list() method introduced in this version will become required in 2.0.0, simplifying the interface contract and allowing Fedify internals to rely on prefix scanning being universally available.
The enhanced #OpenTelemetry instrumentation and FedifySpanExporter provide the foundation for implementing the debug dashboard proposed in issue #234. The next steps include building the web dashboard UI with real-time activity lists, filtering, and JSON inspection capabilities—all as a separate package that leverages the standards-based observability infrastructure introduced in this release.
Depending on the development timeline and feature priorities, there may be additional 1.x releases before the 2.0.0 migration. For developers building custom KvStore implementations, now is the time to add list() support to prepare for the eventual 2.0.0 upgrade. The implementation patterns used in the official backends provide clear guidance for various storage strategies.
Special thanks to Cho Hasang (@crohasang) for the NestJS 11 compatibility improvements, and to all community members who provided feedback and testing for the new observability features.
For the complete list of changes, bug fixes, and improvements, please refer to the CHANGES.md file in the repository.
@fedify@hollo.social
Fedify is a #TypeScript framework for building #ActivityPub servers that participate in the #fediverse. It reduces the complexity and boilerplate typically required for ActivityPub implementation while providing comprehensive federation capabilities.
We're excited to announce #Fedify 1.10.0, a focused release that lays critical groundwork for future debugging and observability features. Released on December 24, 2025, this version introduces infrastructure improvements that will enable the upcoming debug dashboard while maintaining full backward compatibility with existing Fedify applications.
This release represents a transitional step toward Fedify 2.0.0, introducing optional capabilities that will become standard in the next major version. The changes focus on enabling richer observability through OpenTelemetry enhancements and adding prefix scanning capabilities to the key–value store interface.
Fedify 1.10.0 significantly expands OpenTelemetry instrumentation with span events that capture detailed ActivityPub data. These enhancements enable richer observability and debugging capabilities without relying solely on span attributes, which are limited to primitive values.
The new span events provide complete activity payloads and verification status, making it possible to build comprehensive debugging tools that show the full context of federation operations:
activitypub.activity.received event on activitypub.inbox span — records the full activity JSON, verification status (activity verified, HTTP signatures verified, Linked Data signatures verified), and actor informationactivitypub.activity.sent event on activitypub.send_activity span — records the full activity JSON and target inbox URLactivitypub.object.fetched event on activitypub.lookup_object span — records the fetched object's type and complete JSON-LD representationAdditionally, Fedify now instruments previously uncovered operations:
activitypub.fetch_document span for document loader operations, tracking URL fetching, HTTP redirects, and final document URLsactivitypub.verify_key_ownership span for cryptographic key ownership verification, recording actor ID, key ID, verification result, and the verification method usedThese instrumentation improvements emerged from work on issue #234 (Real-time ActivityPub debug dashboard). Rather than introducing a custom observer interface as originally proposed in #323, we leveraged Fedify's existing OpenTelemetry infrastructure to capture rich federation data through span events. This approach provides a standards-based foundation that's composable with existing observability tools like Jaeger, Zipkin, and Grafana Tempo.
FedifySpanExporterBuilding on the enhanced instrumentation, Fedify 1.10.0 introduces FedifySpanExporter, a new OpenTelemetry SpanExporter that persists ActivityPub activity traces to a KvStore. This enables distributed tracing support across multiple nodes in a Fedify deployment, which is essential for building debug dashboards that can show complete request flows across web servers and background workers.
The new @fedify/fedify/otel module provides the following types and interfaces:
import { MemoryKvStore } from "@fedify/fedify";
import { FedifySpanExporter } from "@fedify/fedify/otel";
import {
BasicTracerProvider,
SimpleSpanProcessor,
} from "@opentelemetry/sdk-trace-base";
const kv = new MemoryKvStore();
const exporter = new FedifySpanExporter(kv, {
ttl: Temporal.Duration.from({ hours: 1 }),
});
const provider = new BasicTracerProvider();
provider.addSpanProcessor(new SimpleSpanProcessor(exporter));The stored traces can be queried for display in debugging interfaces:
// Get all activities for a specific trace
const activities = await exporter.getActivitiesByTraceId(traceId);
// Get recent traces with summary information
const recentTraces = await exporter.getRecentTraces({ limit: 100 });The exporter supports two storage strategies depending on the KvStore capabilities. When the list() method is available (preferred), it stores individual records with keys like [prefix, traceId, spanId]. When only cas() is available, it uses compare-and-swap operations to append records to arrays stored per trace.
This infrastructure provides the foundation for implementing a comprehensive debug dashboard as a custom SpanExporter, as outlined in the updated implementation plan for issue #234.
list() method for KvStore interfaceFedify 1.10.0 adds an optional list() method to the KvStore interface for enumerating entries by key prefix. This method enables efficient prefix scanning, which is useful for implementing features like distributed trace storage, cache invalidation by prefix, and listing related entries.
interface KvStore {
// ... existing methods
list?(prefix?: KvKey): AsyncIterable<KvStoreListEntry>;
}When the prefix parameter is omitted or empty, list() returns all entries in the store. This is useful for debugging and administrative purposes. All official KvStore implementations have been updated to support this method:
MemoryKvStore — filters in-memory keys by prefixSqliteKvStore — uses LIKE query with JSON key patternPostgresKvStore — uses array slice comparisonRedisKvStore — uses SCAN with pattern matching and key deserializationDenoKvStore — delegates to Deno KV's built-in list() APIWorkersKvStore — uses Cloudflare Workers KV list() with JSON key prefix patternWhile list() is currently optional to give existing custom KvStore implementations time to add support, it will become a required method in Fedify 2.0.0 (tracked in issue #499). This migration path allows implementers to gradually adopt the new capability throughout the 1.x release cycle.
The addition of list() support was implemented in pull request #500, which also included the setup of proper testing infrastructure for WorkersKvStore using Vitest with @cloudflare/vitest-pool-workers.
Thanks to a contribution from Cho Hasang (@crohasang), the @fedify/nestjs package now supports NestJS 11 environments that use Express 5. The peer dependency range for Express has been widened to ^4.0.0 || ^5.0.0, eliminating peer dependency conflicts in modern NestJS projects while maintaining backward compatibility with Express 4.
This change, implemented in pull request #493, keeps the workspace catalog pinned to Express 4 for internal development and test stability while allowing Express 5 in consuming applications.
Fedify 1.10.0 serves as a stepping stone toward the upcoming 2.0.0 release. The optional list() method introduced in this version will become required in 2.0.0, simplifying the interface contract and allowing Fedify internals to rely on prefix scanning being universally available.
The enhanced #OpenTelemetry instrumentation and FedifySpanExporter provide the foundation for implementing the debug dashboard proposed in issue #234. The next steps include building the web dashboard UI with real-time activity lists, filtering, and JSON inspection capabilities—all as a separate package that leverages the standards-based observability infrastructure introduced in this release.
Depending on the development timeline and feature priorities, there may be additional 1.x releases before the 2.0.0 migration. For developers building custom KvStore implementations, now is the time to add list() support to prepare for the eventual 2.0.0 upgrade. The implementation patterns used in the official backends provide clear guidance for various storage strategies.
Special thanks to Cho Hasang (@crohasang) for the NestJS 11 compatibility improvements, and to all community members who provided feedback and testing for the new observability features.
For the complete list of changes, bug fixes, and improvements, please refer to the CHANGES.md file in the repository.
@lobsters@mastodon.social
Introducing Open Forms via @federicoschonborn https://lobste.rs/s/mvqno1 #release
https://www.aryank.in/posts/2025-12-21-introducing-open-forms/
@hugovk@mastodon.social · Reply to Hugo van Kemenade's post
Just released! 🚀
🤖 Humanize 4.15.0
This does stuff like turning a number into a fuzzy human-readable duration ("3 minutes ago")
https://github.com/python-humanize/humanize/releases/tag/4.15.0
* Add locale support for decimal separator in `intword`
* Add support for Python 3.15
* `naturaldelta`: round the value to nearest unit that makes sense
* Fix plural form for `intword` and improve performance
* Replace `Exception` with more specific `FileNotFoundError`
* Replace pre-commit with prek
@britown@mastodon.gamedev.place
OUT NOW: Dungeon Puzzle Sweeper!
The perfect game to play at the airport or under the dinner table this holiday season 🎄 It auto-saves, is optimized for mobile, and has online leaderboards!
This little remake has been kicking around all year and I wanted to finish up the rest of the presentation and get it out there. Free on itch!!
https://britown.itch.io/sweeper
Please boost and tell your friends!
@britown@mastodon.gamedev.place
OUT NOW: Dungeon Puzzle Sweeper!
The perfect game to play at the airport or under the dinner table this holiday season 🎄 It auto-saves, is optimized for mobile, and has online leaderboards!
This little remake has been kicking around all year and I wanted to finish up the rest of the presentation and get it out there. Free on itch!!
https://britown.itch.io/sweeper
Please boost and tell your friends!
@hugovk@mastodon.social · Reply to Hugo van Kemenade's post
Just released! 🚀
🐍 Python 3.15 alpha 3!
https://discuss.python.org/t/python-3-15-0-alpha-3/105325?u=hugovk
🔬 PEP 799: A new high-frequency statistical sampling profiler and dedicated profiling package
💬 PEP 686: Python now uses UTF-8 as the default encoding
🌊 PEP 782: A new PyBytesWriter C API to create a Python bytes object
🎨 Colour code snippets in argparse help: https://bsky.app/profile/savannah.dev/post/3m7svdqdeqs2x
⚠️ Better error messages
#Python #Python315 #CPython #release #PEP799 #PEP686 #PEP782 #argparse
@melroy@mastodon.melroy.org
Mbin 1.9.0 stable is finally out! Thank you everybody who made this release possible!
See the link for the full upgrade instructions.
@vernissage@mastodon.social
🚀 Vernissage 1.26.0 is out today!
API updates:
- Migration to Swift 6.2
- Renamed unit test titles (less code duplication)
- GPT-5.2 support (optional ALT text & hashtag generation by the photo author)
- All dependencies updated
Web client:
- Upgrade to Angular 21 (getting closer to zoneless 😉)
- Fixed bug after canceling photo upload
- All dependencies updated
🙏 Thanks for all the help and valuable feedback!
#Vernissage #Release #Swift #Angular #Fediverse #Photography #PhotoSharing
@vernissage@mastodon.social
🚀 Vernissage 1.26.0 is out today!
API updates:
- Migration to Swift 6.2
- Renamed unit test titles (less code duplication)
- GPT-5.2 support (optional ALT text & hashtag generation by the photo author)
- All dependencies updated
Web client:
- Upgrade to Angular 21 (getting closer to zoneless 😉)
- Fixed bug after canceling photo upload
- All dependencies updated
🙏 Thanks for all the help and valuable feedback!
#Vernissage #Release #Swift #Angular #Fediverse #Photography #PhotoSharing
@vernissage@mastodon.social
🚀 Vernissage 1.26.0 is out today!
API updates:
- Migration to Swift 6.2
- Renamed unit test titles (less code duplication)
- GPT-5.2 support (optional ALT text & hashtag generation by the photo author)
- All dependencies updated
Web client:
- Upgrade to Angular 21 (getting closer to zoneless 😉)
- Fixed bug after canceling photo upload
- All dependencies updated
🙏 Thanks for all the help and valuable feedback!
#Vernissage #Release #Swift #Angular #Fediverse #Photography #PhotoSharing
@vernissage@mastodon.social
🚀 Vernissage 1.26.0 is out today!
API updates:
- Migration to Swift 6.2
- Renamed unit test titles (less code duplication)
- GPT-5.2 support (optional ALT text & hashtag generation by the photo author)
- All dependencies updated
Web client:
- Upgrade to Angular 21 (getting closer to zoneless 😉)
- Fixed bug after canceling photo upload
- All dependencies updated
🙏 Thanks for all the help and valuable feedback!
#Vernissage #Release #Swift #Angular #Fediverse #Photography #PhotoSharing
@hugovk@mastodon.social · Reply to Hugo van Kemenade's post
Just released! 🚀
Python Docs Sphinx Theme
This is the theme for the Python documentation (and others)
* Add support for green, red and yellow side borders for code examples
* Add Portuguese translation
* Add support for Python 3.15
https://github.com/python/python-docs-theme/releases/tag/2025.12

@Nitrux_NX@mastodon.cloud
We've further improved Cinderward, our simple, no-nonsense, init-agnostic, Wayland-friendly GUI for firewalld, and released it as Cinderward v. 0.0.2.
The next release of Nitrux will include Cinderward (and thus, firewalld) by default.
@hugovk@mastodon.social · Reply to Hugo van Kemenade's post
Just released! 🚀🐍
Python 3.14.2 (and 3.13.11)
Waiting for the .2 to upgrade? This one's especially for you!
So soon? We found some regressions, so here’s an expedited pair of releases. They also come with bonus security fixes.
https://discuss.python.org/t/python-3-14-2-and-3-13-11-are-now-available/105214?u=hugovk
@hugovk@mastodon.social · Reply to Hugo van Kemenade's post
Just released! 🚀🐍
Python 3.14.1
Waiting for the .1 to upgrade? This one's especially for you!
🥧 Deferred type annotation evaluation!
🥧 T-strings!
🥧 Zstandard!
🥧 Syntax highlighting in the REPL!
🥧 Colour in unittest, argparse, json and calendar CLIs!
🥧 UUID v6-8!
🥧 And much more!
https://discuss.python.org/t/python-3-14-1-is-now-available/105163
@hugovk@mastodon.social · Reply to Hugo van Kemenade's post
Just released! 🚀🐍
Python 3.14.1
Waiting for the .1 to upgrade? This one's especially for you!
🥧 Deferred type annotation evaluation!
🥧 T-strings!
🥧 Zstandard!
🥧 Syntax highlighting in the REPL!
🥧 Colour in unittest, argparse, json and calendar CLIs!
🥧 UUID v6-8!
🥧 And much more!
https://discuss.python.org/t/python-3-14-1-is-now-available/105163
@pandoc@fosstodon.org
🆕 pandoc 3.8.3 🎉
This release adds three new input formats (#Asciidoc, #PPTX, and #XLSX) and one new output format (#BBCode + variants).
It also fixes a number of bugs (including some regressions in 3.8). See the changelog for full details.
Thanks to all who contributed!
@OpenCloud@social.opencloud.eu
🎉 New production release of OpenCloud
We are very excited about the new release, which features multi-tenancy, new Helm charts, Files on Demand, and a new UI design with dark mode.
A big thank you goes to our development team and everyone involved who made this release possible. 💚
Learn more about the new features: https://opencloud.eu/en/news/opencloud-production-release-multi-tenancy-helm-charts
#OpenCloud #Release #OpenSource #DigitalSovereignty #Teamwork
@OpenCloud@social.opencloud.eu
🎉 Neues Production Release von OpenCloud
Wir freuen uns sehr über das neue Release, mit Mandantenfähigkeit, neuen Helm-Charts, Files on Demand und einem neuen UI-Design mit Dark Mode.
Ein großer Dank geht an unser Entwicklerteam und alle Beteiligten, die dieses Release möglich gemacht haben. 💚
Erfahren Sie mehr über die Neuerungen: https://opencloud.eu/de/news/opencloud-production-release-von-mandantenfaehigkeit-bis-helm-charts
#OpenCloud #Release #OpenSource #DigitaleSouveränität #Teamwork
@vermaden@bsd.cafe
New 𝗩𝗮𝗹𝘂𝗮𝗯𝗹𝗲 𝗙𝗿𝗲𝗲𝗕𝗦𝗗 𝟭𝟱.𝟬-𝗥𝗘𝗟𝗘𝗔𝗦𝗘 𝗨𝗽𝗱𝗮𝘁𝗲𝘀 [Valuable FreeBSD 15.0-RELEASE Updates] article.
https://vermaden.wordpress.com/2025/11/30/valuable-freebsd-15-0-release-updates/
@WoodpeckerCI@floss.social
🚀 Woodpecker 3.10.0 is live!
- Pull‑request metadata & task‑UUID labels for tighter CI pipelines
- New org‑listing API (CLI & Go SDK) + milestone support
- Smarter error traces, CLI auto‑completion & human‑readable queue info
- Dozens of dependency fixes
Upgrade now for a smoother CI experience! 🎉 #CI #DevOps #woodpeckerci #release
https://github.com/woodpecker-ci/woodpecker/releases/tag/v3.10.0
@hugovk@mastodon.social · Reply to Hugo van Kemenade's post
Just released! 🚀
🎶 pylast 7.0.0
🎤 A #Python interface to @lastfm and Libre.fm
🗑️ Remove `SCROBBLE_SOURCE_*` and `SCROBBLE_MODE_*` constants. Last used in 2017, you probably weren't using them
📻 Add `chosen_by_user` parameter to `scrobble`. Set to false if you don't have "direct" control over the source, like radio or a stream.
🐍 Add support for Python 3.15
📼 Test against recorded API instead of live
🦀 Replace pre-commit with prek
Thanks to @scy!
https://github.com/pylast/pylast/releases/tag/7.0.0
#release #LastFM
@php@fosstodon.org
🥳 PHP 8.5 Released!
In this new release, we have:
🌐 URI Extension
▶️ Pipe Operator
📑 Clone With
⚠️ A New #[\NoDiscard] Attribute
🆕 Closures and First-Class Callables in Constant Expressions
🌀 Persistent cURL Share Handles
👓 Read all about it on: https://www.php.net/releases/8.5/
🔗 https://php.net/ChangeLog-8#8.5.0
📦 https://php.net/downloads
@php@fosstodon.org
🥳 PHP 8.5 Released!
In this new release, we have:
🌐 URI Extension
▶️ Pipe Operator
📑 Clone With
⚠️ A New #[\NoDiscard] Attribute
🆕 Closures and First-Class Callables in Constant Expressions
🌀 Persistent cURL Share Handles
👓 Read all about it on: https://www.php.net/releases/8.5/
🔗 https://php.net/ChangeLog-8#8.5.0
📦 https://php.net/downloads
@php@fosstodon.org
🥳 PHP 8.5 Released!
In this new release, we have:
🌐 URI Extension
▶️ Pipe Operator
📑 Clone With
⚠️ A New #[\NoDiscard] Attribute
🆕 Closures and First-Class Callables in Constant Expressions
🌀 Persistent cURL Share Handles
👓 Read all about it on: https://www.php.net/releases/8.5/
🔗 https://php.net/ChangeLog-8#8.5.0
📦 https://php.net/downloads
@php@fosstodon.org
🥳 PHP 8.5 Released!
In this new release, we have:
🌐 URI Extension
▶️ Pipe Operator
📑 Clone With
⚠️ A New #[\NoDiscard] Attribute
🆕 Closures and First-Class Callables in Constant Expressions
🌀 Persistent cURL Share Handles
👓 Read all about it on: https://www.php.net/releases/8.5/
🔗 https://php.net/ChangeLog-8#8.5.0
📦 https://php.net/downloads
@GTK@floss.social
A new GTK 4 development snapshot with lots and lots of features is available: https://gitlab.gnome.org/GNOME/gtk/-/releases/4.21.2
@hugovk@mastodon.social · Reply to Hugo van Kemenade's post
Just released! 🚀
After one sequential-only CI failure, two artifacts builds, one GitHub outage, two fixes for the Windows installer build, four Windows builds, and a NuGet outage:
🐍 Python 3.15 alpha 2!
🔬 PEP 799: A new high-frequency statistical sampling profiler
💬 PEP 686: Python now uses UTF-8 as the default encoding
🌊 PEP 782: A new PyBytesWriter C API to create a Python bytes object
⚠️ Better error messages
https://discuss.python.org/t/python-3-15-0a2/104948?u=hugovk
@hugovk@mastodon.social · Reply to Hugo van Kemenade's post
Just released! 🚀
After one sequential-only CI failure, two artifacts builds, one GitHub outage, two fixes for the Windows installer build, four Windows builds, and a NuGet outage:
🐍 Python 3.15 alpha 2!
🔬 PEP 799: A new high-frequency statistical sampling profiler
💬 PEP 686: Python now uses UTF-8 as the default encoding
🌊 PEP 782: A new PyBytesWriter C API to create a Python bytes object
⚠️ Better error messages
https://discuss.python.org/t/python-3-15-0a2/104948?u=hugovk
@WoodpeckerCI@floss.social
🚀 WoodpeckerCI 3.12.0 is here! Get full commit changes in Bitbucket pushes, support file changes in Bitbucket Cloud, agent version logging & improved log streaming. Plus many bug fixes & security updates! Upgrade now! 🔒🐦 #WoodpeckerCI #release #CI #DevOps #Changelog
@movim@piaille.fr
Movim 0.32, codename Wilk is out ✨
This might be one of the biggest release ever made on the project.
We improved the way to follow, publish, upload share and comment content 🗒️but also redesigned the chat layout 🗨️, refactored the end-to-end-encryption code 🔒, improved our bridges integration 🌉, dropping dependencies 🧹 and improving video-conferencing performances 📹
Checkout the release note to have all the details of this exciting release 🤩
https://mov.im/community/pubsub.movim.eu/Movim/here-comes-movim-0-32-codename-wilk-CBbSYh
If you really like the project don't forget to share the good new around and support us, you will find all the link on our main website ❤️
@movim@piaille.fr
Movim 0.32, codename Wilk is out ✨
This might be one of the biggest release ever made on the project.
We improved the way to follow, publish, upload share and comment content 🗒️but also redesigned the chat layout 🗨️, refactored the end-to-end-encryption code 🔒, improved our bridges integration 🌉, dropping dependencies 🧹 and improving video-conferencing performances 📹
Checkout the release note to have all the details of this exciting release 🤩
https://mov.im/community/pubsub.movim.eu/Movim/here-comes-movim-0-32-codename-wilk-CBbSYh
If you really like the project don't forget to share the good new around and support us, you will find all the link on our main website ❤️
@hugovk@mastodon.social · Reply to Hugo van Kemenade's post
Just released! 🚀
🪑 PrettyTable 3.17.0
https://github.com/prettytable/prettytable/releases/tag/3.17.0
Add support for Python 3.15, drop 3.9, test 3.13t-3.15t
Set dicts with column-specific config for all column-specific attrs
Update type hints
Replace pre-commit with prek
& more!
@mastodon_mobile_apps@stefanbohacek.online
New Android release (v2.11.4)!
- You can now quote other people’s posts (if they permit it) when connected to a server that supports it
- Other minor fixes and improvements
- https://github.com/mastodon/mastodon-android/releases
- https://play.google.com/store/apps/details?id=org.joinmastodon.android
@mastodon_mobile_apps@stefanbohacek.online
New Android release (v2.11.4)!
- You can now quote other people’s posts (if they permit it) when connected to a server that supports it
- Other minor fixes and improvements
- https://github.com/mastodon/mastodon-android/releases
- https://play.google.com/store/apps/details?id=org.joinmastodon.android
@bgamari@mastodon.social
After a long wait, GHC 9.14.1-rc1 is now available. This includes an important fix which ensures compatibility with macOS 26 and later. We expect that this same fix will be backported to GHC 9.12 and 9.10 in the coming months.
Happy Haskelling!
https:/ /www.haskell.org/ghc/blog/20251030-ghc-9.14.1-rc1-released.html
@bgamari@mastodon.social
After a long wait, GHC 9.14.1-rc1 is now available. This includes an important fix which ensures compatibility with macOS 26 and later. We expect that this same fix will be backported to GHC 9.12 and 9.10 in the coming months.
Happy Haskelling!
https:/ /www.haskell.org/ghc/blog/20251030-ghc-9.14.1-rc1-released.html

@janriemer@floss.social
Boa release v0.21:
https://boajs.dev/blog/2025/10/22/boa-release-21
#Boa is an experimental #JavaScript lexer, #parser and #compiler written in #Rust. It now passes 94.12% of conformance tests in the official #ECMAScript Test Suite (Test262).
@hugovk@mastodon.social · Reply to Hugo van Kemenade's post
Just released! 🚀
🎨 termcolor 3.2.0
https://github.com/termcolor/termcolor/releases/tag/3.2.0
🟣 Expose `can_colorize` as public API
🟢 Add support for Python 3.15 (🥉 at https://pyreadiness.org/3.15/)
🔴 Drop support for EOLish Python 3.9
@hugovk@mastodon.social · Reply to Hugo van Kemenade's post
Just released! 🚀
📜 Python Docs Sphinx Theme, with added Arabic, French, Romanian and Russian translations.
https://github.com/python/python-docs-theme/releases/tag/2025.10
#Python #release #PythonDocsSphinxTheme #Sphinx #theme #translations
@kde@floss.social
Plasma 6.5 is out! Look forward to cool interface re-designs (rounded corners! Automatic smooth light-to-dark transitions!), features (smart KRunner searches! Pinned clipboard items!) and tons of usability and accessibility improvements:
@openbsdnow@bsd.network
OpenBSD 7.8 released
Release notes: https://www.openbsd.org/78.html
Announce: https://marc.info/?l=openbsd-announce&m=176109731212545&w=2
@openbsdnow@bsd.network
OpenBSD 7.8 released
Release notes: https://www.openbsd.org/78.html
Announce: https://marc.info/?l=openbsd-announce&m=176109731212545&w=2
@kde@floss.social
Plasma 6.5 is out! Look forward to cool interface re-designs (rounded corners! Automatic smooth light-to-dark transitions!), features (smart KRunner searches! Pinned clipboard items!) and tons of usability and accessibility improvements:
@kde@floss.social
Plasma 6.5 is out! Look forward to cool interface re-designs (rounded corners! Automatic smooth light-to-dark transitions!), features (smart KRunner searches! Pinned clipboard items!) and tons of usability and accessibility improvements:
@kde@floss.social
Plasma 6.5 is out! Look forward to cool interface re-designs (rounded corners! Automatic smooth light-to-dark transitions!), features (smart KRunner searches! Pinned clipboard items!) and tons of usability and accessibility improvements:
@kde@floss.social
Plasma 6.5 is out! Look forward to cool interface re-designs (rounded corners! Automatic smooth light-to-dark transitions!), features (smart KRunner searches! Pinned clipboard items!) and tons of usability and accessibility improvements:
@pandoc@fosstodon.org
🆕 pandoc 3.8.2.1
This release fixes a citeproc-related performance regression.
The only document conversion change is support for dynamic blocks and block attributes in Org-mode.
Thanks to all who contributed!
@WoodpeckerCI@floss.social
WoodpeckerCI v3.11.0 is here! 🎉 Configure repo-specific config extensions, enjoy smoother logs, paginated repos & teams, and enhanced Bitbucket build status. Plus, bug fixes & docs updates for a better experience! 🚀 #WoodpeckerCI #release #DevOps #CI_CD
@hugovk@mastodon.social · Reply to Hugo van Kemenade's post
Just released! 🚀🚀🚀🚀🚀
Pillow 12.0.0
https://fosstodon.org/@pillow/115379893139846791
norwegianblue 0.23.0
https://github.com/hugovk/norwegianblue/releases/tag/0.23.0
pypinfo 23.0.0
https://github.com/ofek/pypinfo/blob/master/CHANGELOG.rst#2300
Humanize 4.14.0
https://github.com/python-humanize/humanize/releases/tag/4.14.0
Tablib 3.9.0
https://github.com/jazzband/tablib/releases/tag/v3.9.0
#Python #release #Pillow #pypinfo #Humanize #norwegianblue #Tablib
@hugovk@mastodon.social · Reply to Hugo van Kemenade's post
Just released! 🚀🚀🚀🚀🚀
Pillow 12.0.0
https://fosstodon.org/@pillow/115379893139846791
norwegianblue 0.23.0
https://github.com/hugovk/norwegianblue/releases/tag/0.23.0
pypinfo 23.0.0
https://github.com/ofek/pypinfo/blob/master/CHANGELOG.rst#2300
Humanize 4.14.0
https://github.com/python-humanize/humanize/releases/tag/4.14.0
Tablib 3.9.0
https://github.com/jazzband/tablib/releases/tag/v3.9.0
#Python #release #Pillow #pypinfo #Humanize #norwegianblue #Tablib
@hugovk@mastodon.social · Reply to Hugo van Kemenade's post
Forget* about Python 3.14, all the cool kids are trying out Python 3.15.0 alpha 1 (but not on production)! 🚀
🔬 PEP 799: A dedicated profiling package for Python profiling tools
💬 PEP 686: Python now uses UTF-8 as the default encoding
🌊 PEP 782: A new PyBytesWriter C API to create a Python bytes object
⚠️ Better error messages
https://discuss.python.org/t/python-3-15-alpha-1/104358?u=hugovk
* Please don't forget about 3.14...
@evanprodromou@socialwebfoundation.org
We were excited to see the recent release of Ghost 6 with ActivityPub features. The Ghost team have been an active participant in our Long-form Text project. John O’Nolan, founder and CEO of Ghost.org, was kind enough to answer our questions about the software and its community.

SWF: For our readers who don’t know Ghost, how would you describe the platform?
JO: Ghost is an independent publishing platform for people who take writing seriously. We’re open source, non-profit, and built to give creators complete ownership of their content and their audience. We’ve helped indie publishers generate over $100 million in revenue from sustainable modern media businesses like 404Media, Platformer and Tangle News.
SWF: Tell us about your user community. Can you paint a picture of them with a broad brush? What kind of people choose Ghost?
JO: Ghost attracts people who care about owning their home on the internet, rather than having another profile on a social media platform. Our publishers range from solo journalists and creators, to established news outlets and large businesses. They value independence, and they’re willing to do the work to maintain control of their brand, distribution, data, and relationship with readers.
SWF: What is it like to be a Ghost user in 2025? What kind of problems are your users facing today?
JO: The big challenge today is the same one that’s haunted independent publishers for two decades: discovery. You can own your platform and serve your audience beautifully, but if people can’t find you, none of it matters. Email newsletters have been a solid answer, but they’re still dependent on deliverability and inbox placement. Algorithms on social platforms actively suppress links now, so sharing your work there is like shouting into a hurricane.
SWF: Tell us about your experience with ActivityPub. Why did you decide to add ActivityPub support to your software?
JO: Ghost has had support for delivering content by email newsletters for a number of years, and email has remained an unassailable distribution platform for publishers because it’s an open protocol. No company controls your email list except you, so it’s one of the best investments you can make. ActivityPub is now doing the same thing for social technology. It allows publishers to own and control a distribution channel that allows their work to spread and be discovered by others. For the first time, you can publish independently and grow faster than ever before.
SWF: What stack is Ghost built on? What development tools does your team use?
JO: Ghost is all built in modern JavaScript; mainly Node and React. Our ActivityPub service is built on Fedify, and everything we build is released under an open source MIT license. Our development tools are constantly evolving, and now more quickly than ever before with the advent of AI tools, which seem to change on a near weekly basis.
SWF: What was the development process like?
JO: Challenging, honestly. ActivityPub is beautifully designed but the spec leaves room for interpretation, and when you’re building something new, there’s no roadmap. Building interoperability between other platforms, who’ve all interpreted the spec in their own unique ways, has been a real challenge. The approach we took was to ship early versions as quickly as possible to beta testers so we could learn as we go, using real-world data and issues to guide our process. We’re in a good spot, now, but there’s still a lot to do!
SWF: Ghost produces long-form blog posts, articles and newsletters. How was the experience adapting Ghost articles to the microblogging interfaces of Mastodon and Threads?
JO: In some ways really easy, and in other ways quite tricky. We’re at a pretty early stage for long-form content on ActivityPub, and the majority of other products out there don’t necessarily have interfaces for supporting it yet. The easy part is that we can provide fallbacks, so if you’re scrolling on Mastodon you might see an article title and excerpt, with a link to read the full post – and that works pretty well! The dream, though, is to make it so you can just consume the full article within whatever app you happen to be using, and doing that requires more collaboration between different platforms to agree on how to make that possible.
SWF: You’ve been an active participant in the ActivityPub community since you decided to implement the standard. Why?
JO: ActivityPub is a movement as much as a technology protocol, and behind it is a group of people who all believe in making the web a weird, wonderful open place for collaboration. Getting to know those humans and being a part of that movement has been every bit as important to the success of our work as writing the code that powers our software. We’ve received incredible support from the Mastodon team, AP spec authors, and other platforms who are building ActivityPub support. Without actively participating in the community, I don’t know if we would’ve gotten as far as we have already.
SWF: Ghost has implemented not only a publishing interface, but also a reading experience. Why?
JO: The big difference between ActivityPub and email is that it’s a 2-way protocol. When you send an email newsletter, that’s it. You’re done. But with ActivityPub, it’s possible to achieve what – in the olden days – we fondly referred to as ‘the blogosphere’. People all over the world writing and reading each other’s work. If an email newsletter is like standing on a stage giving a keynote to an audience, participating in a network is more like mingling at the afterparty. You can’t just talk the whole time, you have to listen, too. Being successful within the context of a network has always involved following and engaging with others, as peers, so it felt really important to make sure that we brought that aspect into the product.
SWF: Your reader is, frankly, one of the most interesting UIs for ActivityPub we’ve seen. Tell us about why you put the time and effort into making a beautiful reading experience for Ghost.
JO: We didn’t want to just tick the “ActivityPub support” checkbox – we wanted to create something that actually feels great to use every day. The idea was to bring some of the product ideas over from RSS readers and kindles, where people currently consume long-form content, and use them as the basis for an ActivityPub-native reading experience. We experimented with multiple different approaches to try and create an experience with a mix of familiarity and novelty. People intuitively understand a list of articles and a view for opening and reading them, but then when you start to see inline replies and live notifications happening around those stories – suddenly it feels like something new and different.
SWF: If people want to get a taste of the kind of content Ghost publishers produce, what are some good examples to follow?
JO: Tough question! There are so many out there, and it really depends on what you’re into. The best place to start would be on ghost.org/explore – when you can browse through all sorts of different categories of creators and content, and explore the things that interest you the most.
SWF: If I’m a Fediverse enthusiast, what can I do to help make Ghost 6 a success?
JO: Follow Ghost publishers and engage with their content – likes, replies, reposts all help! Most importantly, help us spread the word about what’s possible when platforms collaborate rather than compete. And if you’re technical, our ActivityPub implementation is entirely open source on GitHub – contributions, bug reports, and feedback make the whole ecosystem stronger.
@evanprodromou@socialwebfoundation.org
We were excited to see the recent release of Ghost 6 with ActivityPub features. The Ghost team have been an active participant in our Long-form Text project. John O’Nolan, founder and CEO of Ghost.org, was kind enough to answer our questions about the software and its community.

SWF: For our readers who don’t know Ghost, how would you describe the platform?
JO: Ghost is an independent publishing platform for people who take writing seriously. We’re open source, non-profit, and built to give creators complete ownership of their content and their audience. We’ve helped indie publishers generate over $100 million in revenue from sustainable modern media businesses like 404Media, Platformer and Tangle News.
SWF: Tell us about your user community. Can you paint a picture of them with a broad brush? What kind of people choose Ghost?
JO: Ghost attracts people who care about owning their home on the internet, rather than having another profile on a social media platform. Our publishers range from solo journalists and creators, to established news outlets and large businesses. They value independence, and they’re willing to do the work to maintain control of their brand, distribution, data, and relationship with readers.
SWF: What is it like to be a Ghost user in 2025? What kind of problems are your users facing today?
JO: The big challenge today is the same one that’s haunted independent publishers for two decades: discovery. You can own your platform and serve your audience beautifully, but if people can’t find you, none of it matters. Email newsletters have been a solid answer, but they’re still dependent on deliverability and inbox placement. Algorithms on social platforms actively suppress links now, so sharing your work there is like shouting into a hurricane.
SWF: Tell us about your experience with ActivityPub. Why did you decide to add ActivityPub support to your software?
JO: Ghost has had support for delivering content by email newsletters for a number of years, and email has remained an unassailable distribution platform for publishers because it’s an open protocol. No company controls your email list except you, so it’s one of the best investments you can make. ActivityPub is now doing the same thing for social technology. It allows publishers to own and control a distribution channel that allows their work to spread and be discovered by others. For the first time, you can publish independently and grow faster than ever before.
SWF: What stack is Ghost built on? What development tools does your team use?
JO: Ghost is all built in modern JavaScript; mainly Node and React. Our ActivityPub service is built on Fedify, and everything we build is released under an open source MIT license. Our development tools are constantly evolving, and now more quickly than ever before with the advent of AI tools, which seem to change on a near weekly basis.
SWF: What was the development process like?
JO: Challenging, honestly. ActivityPub is beautifully designed but the spec leaves room for interpretation, and when you’re building something new, there’s no roadmap. Building interoperability between other platforms, who’ve all interpreted the spec in their own unique ways, has been a real challenge. The approach we took was to ship early versions as quickly as possible to beta testers so we could learn as we go, using real-world data and issues to guide our process. We’re in a good spot, now, but there’s still a lot to do!
SWF: Ghost produces long-form blog posts, articles and newsletters. How was the experience adapting Ghost articles to the microblogging interfaces of Mastodon and Threads?
JO: In some ways really easy, and in other ways quite tricky. We’re at a pretty early stage for long-form content on ActivityPub, and the majority of other products out there don’t necessarily have interfaces for supporting it yet. The easy part is that we can provide fallbacks, so if you’re scrolling on Mastodon you might see an article title and excerpt, with a link to read the full post – and that works pretty well! The dream, though, is to make it so you can just consume the full article within whatever app you happen to be using, and doing that requires more collaboration between different platforms to agree on how to make that possible.
SWF: You’ve been an active participant in the ActivityPub community since you decided to implement the standard. Why?
JO: ActivityPub is a movement as much as a technology protocol, and behind it is a group of people who all believe in making the web a weird, wonderful open place for collaboration. Getting to know those humans and being a part of that movement has been every bit as important to the success of our work as writing the code that powers our software. We’ve received incredible support from the Mastodon team, AP spec authors, and other platforms who are building ActivityPub support. Without actively participating in the community, I don’t know if we would’ve gotten as far as we have already.
SWF: Ghost has implemented not only a publishing interface, but also a reading experience. Why?
JO: The big difference between ActivityPub and email is that it’s a 2-way protocol. When you send an email newsletter, that’s it. You’re done. But with ActivityPub, it’s possible to achieve what – in the olden days – we fondly referred to as ‘the blogosphere’. People all over the world writing and reading each other’s work. If an email newsletter is like standing on a stage giving a keynote to an audience, participating in a network is more like mingling at the afterparty. You can’t just talk the whole time, you have to listen, too. Being successful within the context of a network has always involved following and engaging with others, as peers, so it felt really important to make sure that we brought that aspect into the product.
SWF: Your reader is, frankly, one of the most interesting UIs for ActivityPub we’ve seen. Tell us about why you put the time and effort into making a beautiful reading experience for Ghost.
JO: We didn’t want to just tick the “ActivityPub support” checkbox – we wanted to create something that actually feels great to use every day. The idea was to bring some of the product ideas over from RSS readers and kindles, where people currently consume long-form content, and use them as the basis for an ActivityPub-native reading experience. We experimented with multiple different approaches to try and create an experience with a mix of familiarity and novelty. People intuitively understand a list of articles and a view for opening and reading them, but then when you start to see inline replies and live notifications happening around those stories – suddenly it feels like something new and different.
SWF: If people want to get a taste of the kind of content Ghost publishers produce, what are some good examples to follow?
JO: Tough question! There are so many out there, and it really depends on what you’re into. The best place to start would be on ghost.org/explore – when you can browse through all sorts of different categories of creators and content, and explore the things that interest you the most.
SWF: If I’m a Fediverse enthusiast, what can I do to help make Ghost 6 a success?
JO: Follow Ghost publishers and engage with their content – likes, replies, reposts all help! Most importantly, help us spread the word about what’s possible when platforms collaborate rather than compete. And if you’re technical, our ActivityPub implementation is entirely open source on GitHub – contributions, bug reports, and feedback make the whole ecosystem stronger.
@evanprodromou@socialwebfoundation.org
We were excited to see the recent release of Ghost 6 with ActivityPub features. The Ghost team have been an active participant in our Long-form Text project. John O’Nolan, founder and CEO of Ghost.org, was kind enough to answer our questions about the software and its community.

SWF: For our readers who don’t know Ghost, how would you describe the platform?
JO: Ghost is an independent publishing platform for people who take writing seriously. We’re open source, non-profit, and built to give creators complete ownership of their content and their audience. We’ve helped indie publishers generate over $100 million in revenue from sustainable modern media businesses like 404Media, Platformer and Tangle News.
SWF: Tell us about your user community. Can you paint a picture of them with a broad brush? What kind of people choose Ghost?
JO: Ghost attracts people who care about owning their home on the internet, rather than having another profile on a social media platform. Our publishers range from solo journalists and creators, to established news outlets and large businesses. They value independence, and they’re willing to do the work to maintain control of their brand, distribution, data, and relationship with readers.
SWF: What is it like to be a Ghost user in 2025? What kind of problems are your users facing today?
JO: The big challenge today is the same one that’s haunted independent publishers for two decades: discovery. You can own your platform and serve your audience beautifully, but if people can’t find you, none of it matters. Email newsletters have been a solid answer, but they’re still dependent on deliverability and inbox placement. Algorithms on social platforms actively suppress links now, so sharing your work there is like shouting into a hurricane.
SWF: Tell us about your experience with ActivityPub. Why did you decide to add ActivityPub support to your software?
JO: Ghost has had support for delivering content by email newsletters for a number of years, and email has remained an unassailable distribution platform for publishers because it’s an open protocol. No company controls your email list except you, so it’s one of the best investments you can make. ActivityPub is now doing the same thing for social technology. It allows publishers to own and control a distribution channel that allows their work to spread and be discovered by others. For the first time, you can publish independently and grow faster than ever before.
SWF: What stack is Ghost built on? What development tools does your team use?
JO: Ghost is all built in modern JavaScript; mainly Node and React. Our ActivityPub service is built on Fedify, and everything we build is released under an open source MIT license. Our development tools are constantly evolving, and now more quickly than ever before with the advent of AI tools, which seem to change on a near weekly basis.
SWF: What was the development process like?
JO: Challenging, honestly. ActivityPub is beautifully designed but the spec leaves room for interpretation, and when you’re building something new, there’s no roadmap. Building interoperability between other platforms, who’ve all interpreted the spec in their own unique ways, has been a real challenge. The approach we took was to ship early versions as quickly as possible to beta testers so we could learn as we go, using real-world data and issues to guide our process. We’re in a good spot, now, but there’s still a lot to do!
SWF: Ghost produces long-form blog posts, articles and newsletters. How was the experience adapting Ghost articles to the microblogging interfaces of Mastodon and Threads?
JO: In some ways really easy, and in other ways quite tricky. We’re at a pretty early stage for long-form content on ActivityPub, and the majority of other products out there don’t necessarily have interfaces for supporting it yet. The easy part is that we can provide fallbacks, so if you’re scrolling on Mastodon you might see an article title and excerpt, with a link to read the full post – and that works pretty well! The dream, though, is to make it so you can just consume the full article within whatever app you happen to be using, and doing that requires more collaboration between different platforms to agree on how to make that possible.
SWF: You’ve been an active participant in the ActivityPub community since you decided to implement the standard. Why?
JO: ActivityPub is a movement as much as a technology protocol, and behind it is a group of people who all believe in making the web a weird, wonderful open place for collaboration. Getting to know those humans and being a part of that movement has been every bit as important to the success of our work as writing the code that powers our software. We’ve received incredible support from the Mastodon team, AP spec authors, and other platforms who are building ActivityPub support. Without actively participating in the community, I don’t know if we would’ve gotten as far as we have already.
SWF: Ghost has implemented not only a publishing interface, but also a reading experience. Why?
JO: The big difference between ActivityPub and email is that it’s a 2-way protocol. When you send an email newsletter, that’s it. You’re done. But with ActivityPub, it’s possible to achieve what – in the olden days – we fondly referred to as ‘the blogosphere’. People all over the world writing and reading each other’s work. If an email newsletter is like standing on a stage giving a keynote to an audience, participating in a network is more like mingling at the afterparty. You can’t just talk the whole time, you have to listen, too. Being successful within the context of a network has always involved following and engaging with others, as peers, so it felt really important to make sure that we brought that aspect into the product.
SWF: Your reader is, frankly, one of the most interesting UIs for ActivityPub we’ve seen. Tell us about why you put the time and effort into making a beautiful reading experience for Ghost.
JO: We didn’t want to just tick the “ActivityPub support” checkbox – we wanted to create something that actually feels great to use every day. The idea was to bring some of the product ideas over from RSS readers and kindles, where people currently consume long-form content, and use them as the basis for an ActivityPub-native reading experience. We experimented with multiple different approaches to try and create an experience with a mix of familiarity and novelty. People intuitively understand a list of articles and a view for opening and reading them, but then when you start to see inline replies and live notifications happening around those stories – suddenly it feels like something new and different.
SWF: If people want to get a taste of the kind of content Ghost publishers produce, what are some good examples to follow?
JO: Tough question! There are so many out there, and it really depends on what you’re into. The best place to start would be on ghost.org/explore – when you can browse through all sorts of different categories of creators and content, and explore the things that interest you the most.
SWF: If I’m a Fediverse enthusiast, what can I do to help make Ghost 6 a success?
JO: Follow Ghost publishers and engage with their content – likes, replies, reposts all help! Most importantly, help us spread the word about what’s possible when platforms collaborate rather than compete. And if you’re technical, our ActivityPub implementation is entirely open source on GitHub – contributions, bug reports, and feedback make the whole ecosystem stronger.
@evanprodromou@socialwebfoundation.org
We were excited to see the recent release of Ghost 6 with ActivityPub features. The Ghost team have been an active participant in our Long-form Text project. John O’Nolan, founder and CEO of Ghost.org, was kind enough to answer our questions about the software and its community.

SWF: For our readers who don’t know Ghost, how would you describe the platform?
JO: Ghost is an independent publishing platform for people who take writing seriously. We’re open source, non-profit, and built to give creators complete ownership of their content and their audience. We’ve helped indie publishers generate over $100 million in revenue from sustainable modern media businesses like 404Media, Platformer and Tangle News.
SWF: Tell us about your user community. Can you paint a picture of them with a broad brush? What kind of people choose Ghost?
JO: Ghost attracts people who care about owning their home on the internet, rather than having another profile on a social media platform. Our publishers range from solo journalists and creators, to established news outlets and large businesses. They value independence, and they’re willing to do the work to maintain control of their brand, distribution, data, and relationship with readers.
SWF: What is it like to be a Ghost user in 2025? What kind of problems are your users facing today?
JO: The big challenge today is the same one that’s haunted independent publishers for two decades: discovery. You can own your platform and serve your audience beautifully, but if people can’t find you, none of it matters. Email newsletters have been a solid answer, but they’re still dependent on deliverability and inbox placement. Algorithms on social platforms actively suppress links now, so sharing your work there is like shouting into a hurricane.
SWF: Tell us about your experience with ActivityPub. Why did you decide to add ActivityPub support to your software?
JO: Ghost has had support for delivering content by email newsletters for a number of years, and email has remained an unassailable distribution platform for publishers because it’s an open protocol. No company controls your email list except you, so it’s one of the best investments you can make. ActivityPub is now doing the same thing for social technology. It allows publishers to own and control a distribution channel that allows their work to spread and be discovered by others. For the first time, you can publish independently and grow faster than ever before.
SWF: What stack is Ghost built on? What development tools does your team use?
JO: Ghost is all built in modern JavaScript; mainly Node and React. Our ActivityPub service is built on Fedify, and everything we build is released under an open source MIT license. Our development tools are constantly evolving, and now more quickly than ever before with the advent of AI tools, which seem to change on a near weekly basis.
SWF: What was the development process like?
JO: Challenging, honestly. ActivityPub is beautifully designed but the spec leaves room for interpretation, and when you’re building something new, there’s no roadmap. Building interoperability between other platforms, who’ve all interpreted the spec in their own unique ways, has been a real challenge. The approach we took was to ship early versions as quickly as possible to beta testers so we could learn as we go, using real-world data and issues to guide our process. We’re in a good spot, now, but there’s still a lot to do!
SWF: Ghost produces long-form blog posts, articles and newsletters. How was the experience adapting Ghost articles to the microblogging interfaces of Mastodon and Threads?
JO: In some ways really easy, and in other ways quite tricky. We’re at a pretty early stage for long-form content on ActivityPub, and the majority of other products out there don’t necessarily have interfaces for supporting it yet. The easy part is that we can provide fallbacks, so if you’re scrolling on Mastodon you might see an article title and excerpt, with a link to read the full post – and that works pretty well! The dream, though, is to make it so you can just consume the full article within whatever app you happen to be using, and doing that requires more collaboration between different platforms to agree on how to make that possible.
SWF: You’ve been an active participant in the ActivityPub community since you decided to implement the standard. Why?
JO: ActivityPub is a movement as much as a technology protocol, and behind it is a group of people who all believe in making the web a weird, wonderful open place for collaboration. Getting to know those humans and being a part of that movement has been every bit as important to the success of our work as writing the code that powers our software. We’ve received incredible support from the Mastodon team, AP spec authors, and other platforms who are building ActivityPub support. Without actively participating in the community, I don’t know if we would’ve gotten as far as we have already.
SWF: Ghost has implemented not only a publishing interface, but also a reading experience. Why?
JO: The big difference between ActivityPub and email is that it’s a 2-way protocol. When you send an email newsletter, that’s it. You’re done. But with ActivityPub, it’s possible to achieve what – in the olden days – we fondly referred to as ‘the blogosphere’. People all over the world writing and reading each other’s work. If an email newsletter is like standing on a stage giving a keynote to an audience, participating in a network is more like mingling at the afterparty. You can’t just talk the whole time, you have to listen, too. Being successful within the context of a network has always involved following and engaging with others, as peers, so it felt really important to make sure that we brought that aspect into the product.
SWF: Your reader is, frankly, one of the most interesting UIs for ActivityPub we’ve seen. Tell us about why you put the time and effort into making a beautiful reading experience for Ghost.
JO: We didn’t want to just tick the “ActivityPub support” checkbox – we wanted to create something that actually feels great to use every day. The idea was to bring some of the product ideas over from RSS readers and kindles, where people currently consume long-form content, and use them as the basis for an ActivityPub-native reading experience. We experimented with multiple different approaches to try and create an experience with a mix of familiarity and novelty. People intuitively understand a list of articles and a view for opening and reading them, but then when you start to see inline replies and live notifications happening around those stories – suddenly it feels like something new and different.
SWF: If people want to get a taste of the kind of content Ghost publishers produce, what are some good examples to follow?
JO: Tough question! There are so many out there, and it really depends on what you’re into. The best place to start would be on ghost.org/explore – when you can browse through all sorts of different categories of creators and content, and explore the things that interest you the most.
SWF: If I’m a Fediverse enthusiast, what can I do to help make Ghost 6 a success?
JO: Follow Ghost publishers and engage with their content – likes, replies, reposts all help! Most importantly, help us spread the word about what’s possible when platforms collaborate rather than compete. And if you’re technical, our ActivityPub implementation is entirely open source on GitHub – contributions, bug reports, and feedback make the whole ecosystem stronger.
@evanprodromou@socialwebfoundation.org
We were excited to see the recent release of Ghost 6 with ActivityPub features. The Ghost team have been an active participant in our Long-form Text project. John O’Nolan, founder and CEO of Ghost.org, was kind enough to answer our questions about the software and its community.

SWF: For our readers who don’t know Ghost, how would you describe the platform?
JO: Ghost is an independent publishing platform for people who take writing seriously. We’re open source, non-profit, and built to give creators complete ownership of their content and their audience. We’ve helped indie publishers generate over $100 million in revenue from sustainable modern media businesses like 404Media, Platformer and Tangle News.
SWF: Tell us about your user community. Can you paint a picture of them with a broad brush? What kind of people choose Ghost?
JO: Ghost attracts people who care about owning their home on the internet, rather than having another profile on a social media platform. Our publishers range from solo journalists and creators, to established news outlets and large businesses. They value independence, and they’re willing to do the work to maintain control of their brand, distribution, data, and relationship with readers.
SWF: What is it like to be a Ghost user in 2025? What kind of problems are your users facing today?
JO: The big challenge today is the same one that’s haunted independent publishers for two decades: discovery. You can own your platform and serve your audience beautifully, but if people can’t find you, none of it matters. Email newsletters have been a solid answer, but they’re still dependent on deliverability and inbox placement. Algorithms on social platforms actively suppress links now, so sharing your work there is like shouting into a hurricane.
SWF: Tell us about your experience with ActivityPub. Why did you decide to add ActivityPub support to your software?
JO: Ghost has had support for delivering content by email newsletters for a number of years, and email has remained an unassailable distribution platform for publishers because it’s an open protocol. No company controls your email list except you, so it’s one of the best investments you can make. ActivityPub is now doing the same thing for social technology. It allows publishers to own and control a distribution channel that allows their work to spread and be discovered by others. For the first time, you can publish independently and grow faster than ever before.
SWF: What stack is Ghost built on? What development tools does your team use?
JO: Ghost is all built in modern JavaScript; mainly Node and React. Our ActivityPub service is built on Fedify, and everything we build is released under an open source MIT license. Our development tools are constantly evolving, and now more quickly than ever before with the advent of AI tools, which seem to change on a near weekly basis.
SWF: What was the development process like?
JO: Challenging, honestly. ActivityPub is beautifully designed but the spec leaves room for interpretation, and when you’re building something new, there’s no roadmap. Building interoperability between other platforms, who’ve all interpreted the spec in their own unique ways, has been a real challenge. The approach we took was to ship early versions as quickly as possible to beta testers so we could learn as we go, using real-world data and issues to guide our process. We’re in a good spot, now, but there’s still a lot to do!
SWF: Ghost produces long-form blog posts, articles and newsletters. How was the experience adapting Ghost articles to the microblogging interfaces of Mastodon and Threads?
JO: In some ways really easy, and in other ways quite tricky. We’re at a pretty early stage for long-form content on ActivityPub, and the majority of other products out there don’t necessarily have interfaces for supporting it yet. The easy part is that we can provide fallbacks, so if you’re scrolling on Mastodon you might see an article title and excerpt, with a link to read the full post – and that works pretty well! The dream, though, is to make it so you can just consume the full article within whatever app you happen to be using, and doing that requires more collaboration between different platforms to agree on how to make that possible.
SWF: You’ve been an active participant in the ActivityPub community since you decided to implement the standard. Why?
JO: ActivityPub is a movement as much as a technology protocol, and behind it is a group of people who all believe in making the web a weird, wonderful open place for collaboration. Getting to know those humans and being a part of that movement has been every bit as important to the success of our work as writing the code that powers our software. We’ve received incredible support from the Mastodon team, AP spec authors, and other platforms who are building ActivityPub support. Without actively participating in the community, I don’t know if we would’ve gotten as far as we have already.
SWF: Ghost has implemented not only a publishing interface, but also a reading experience. Why?
JO: The big difference between ActivityPub and email is that it’s a 2-way protocol. When you send an email newsletter, that’s it. You’re done. But with ActivityPub, it’s possible to achieve what – in the olden days – we fondly referred to as ‘the blogosphere’. People all over the world writing and reading each other’s work. If an email newsletter is like standing on a stage giving a keynote to an audience, participating in a network is more like mingling at the afterparty. You can’t just talk the whole time, you have to listen, too. Being successful within the context of a network has always involved following and engaging with others, as peers, so it felt really important to make sure that we brought that aspect into the product.
SWF: Your reader is, frankly, one of the most interesting UIs for ActivityPub we’ve seen. Tell us about why you put the time and effort into making a beautiful reading experience for Ghost.
JO: We didn’t want to just tick the “ActivityPub support” checkbox – we wanted to create something that actually feels great to use every day. The idea was to bring some of the product ideas over from RSS readers and kindles, where people currently consume long-form content, and use them as the basis for an ActivityPub-native reading experience. We experimented with multiple different approaches to try and create an experience with a mix of familiarity and novelty. People intuitively understand a list of articles and a view for opening and reading them, but then when you start to see inline replies and live notifications happening around those stories – suddenly it feels like something new and different.
SWF: If people want to get a taste of the kind of content Ghost publishers produce, what are some good examples to follow?
JO: Tough question! There are so many out there, and it really depends on what you’re into. The best place to start would be on ghost.org/explore – when you can browse through all sorts of different categories of creators and content, and explore the things that interest you the most.
SWF: If I’m a Fediverse enthusiast, what can I do to help make Ghost 6 a success?
JO: Follow Ghost publishers and engage with their content – likes, replies, reposts all help! Most importantly, help us spread the word about what’s possible when platforms collaborate rather than compete. And if you’re technical, our ActivityPub implementation is entirely open source on GitHub – contributions, bug reports, and feedback make the whole ecosystem stronger.
@pandoc@fosstodon.org
Release pandoc 3.8.2
This release fixes a regression in the Typst template (since 3.8), which caused links to be omitted.
It also adds a new default Markdown extension, `table_attributes`, which allows attributes to be added to tables by putting them after the caption.
@pandoc@fosstodon.org
Release pandoc 3.8.2
This release fixes a regression in the Typst template (since 3.8), which caused links to be omitted.
It also adds a new default Markdown extension, `table_attributes`, which allows attributes to be added to tables by putting them after the caption.
@hugovk@mastodon.social · Reply to Hugo van Kemenade's post
🚀 It's out!
🥧 Please install and enjoy Python 3.14!
https://discuss.python.org/t/python-3-14-0-final-is-here/104210?u=hugovk
@hugovk@mastodon.social · Reply to Hugo van Kemenade's post
🚀 It's out!
🥧 Please install and enjoy Python 3.14!
https://discuss.python.org/t/python-3-14-0-final-is-here/104210?u=hugovk
@hugovk@mastodon.social · Reply to Hugo van Kemenade's post
🚀 It's out!
🥧 Please install and enjoy Python 3.14!
https://discuss.python.org/t/python-3-14-0-final-is-here/104210?u=hugovk
@hugovk@mastodon.social · Reply to Hugo van Kemenade's post
🚀 It's out!
🥧 Please install and enjoy Python 3.14!
https://discuss.python.org/t/python-3-14-0-final-is-here/104210?u=hugovk
@hugovk@mastodon.social · Reply to Hugo van Kemenade's post
🚀 It's out!
🥧 Please install and enjoy Python 3.14!
https://discuss.python.org/t/python-3-14-0-final-is-here/104210?u=hugovk
@hugovk@mastodon.social · Reply to Hugo van Kemenade's post
🚀 It's out!
🥧 Please install and enjoy Python 3.14!
https://discuss.python.org/t/python-3-14-0-final-is-here/104210?u=hugovk
@hugovk@mastodon.social · Reply to Hugo van Kemenade's post
macOS installer done, next on the final publishing and announcing steps.
@hugovk@mastodon.social · Reply to Hugo van Kemenade's post
The Windows build is ready and macOS is underway.
@hugovk@mastodon.social · Reply to Hugo van Kemenade's post
The Windows build has been started.
The jobs with profile-guided optimisation (PGO) build once, then collect a profile by running the tests, and then build again using that profile, to see how "real" code executes and optimises for that.
https://dev.azure.com/Python/cpython/_build/results?buildId=164907&view=results
Meanwhile, the docs+source+Android build has finished and the artifacts have been copied to where they need to go with SBOMs created.
@hugovk@mastodon.social · Reply to Hugo van Kemenade's post
(That's actually the second CI attempt, we had to update some script arguments following an Android test runner update.)
This build takes about half an hour.
I've also informed the Windows and macOS release managers about the tag and they will start up installer builds.
This takes a few hours, so I've got time to finish up the release notes.
PEP 101 is the full process, but much is automated and we don't need to follow it all manually.
@hugovk@mastodon.social · Reply to Hugo van Kemenade's post
Next up, merge and backport the final change to What's New in Python 3.14 to declare it latest stable.
https://github.com/python/cpython/pull/139631
Now start run_release.py, the main release automation script, which does a bunch of pre-checks, runs blurb to create a merged changelog, bumps some numbers, and pushes a branch and tag to my fork. It'll go upstream at the end of a successful build.
Then kick off the CI to build source zips, docs and Android binaries.
https://github.com/python/release-tools/actions/runs/18308460797
@hugovk@mastodon.social · Reply to Hugo van Kemenade's post
Release day!
First off, check blockers and buildbots.
A new release-blocker appeared yesterday (because of course) but it can wait until 3.14.1.
https://github.com/python/cpython/labels/release-blocker
Three deferred-blockers are also waiting until 3.14.1.
https://github.com/python/cpython/labels/deferred-blocker
A new tier-2 buildbot failure appeared yesterday (because of course) but it had previously been offline for a month and will need some reconfiguration. Can ignore.
https://buildbot.python.org/#/release_status
OK, let's make a Python!
@bonfire@indieweb.social
🔥 RSS/Atom support opens up data portability beyond the fediverse.
You can now subscribe to user feeds, thread comments, posts, articles, events, media feeds, or custom feeds directly in your RSS client.
Read more about 1.0 RC3: https://bonfirenetworks.org/posts/bonfire-social-1-0rc3/
@bonfire@indieweb.social
🔥 RSS/Atom support opens up data portability beyond the fediverse.
You can now subscribe to user feeds, thread comments, posts, articles, events, media feeds, or custom feeds directly in your RSS client.
Read more about 1.0 RC3: https://bonfirenetworks.org/posts/bonfire-social-1-0rc3/
@hugovk@mastodon.social · Reply to Hugo van Kemenade's post
Just released! 🚀
flake8-implicit-str-concat 0.6.0
A Flake8 plugin to identify those unjoined strings that a first Black run leaves behind:
"111111111111111111111" "222222222222222222222"
I hear there's another big release tomorrow? This release adds support for Python 3.14 and for once code changes were needed due to AST deprecation removals.
Also drop support for almost-very-nearly-EOL Python 3.9.
https://github.com/flake8-implicit-str-concat/flake8-implicit-str-concat/releases/tag/0.6.0
#Python #flake8 #release #Python314 #Python39
@bonfire@indieweb.social
🔥 More anti-enshittification features now live in Bonfire
✨ Complete data portability: Export/import now supports circles/lists, bookmarks, likes, and boosts alongside follows, blocks, and posts.
✨ Transparency by design: A dedicated real-time dashboard to monitor migration progress in detail and troubleshoot issues.
Read more about 1.0 RC3: https://bonfirenetworks.org/posts/bonfire-social-1-0rc3/
#enshittification #release
@bonfire@indieweb.social
🔥 More anti-enshittification features now live in Bonfire
✨ Complete data portability: Export/import now supports circles/lists, bookmarks, likes, and boosts alongside follows, blocks, and posts.
✨ Transparency by design: A dedicated real-time dashboard to monitor migration progress in detail and troubleshoot issues.
Read more about 1.0 RC3: https://bonfirenetworks.org/posts/bonfire-social-1-0rc3/
#enshittification #release
@bonfire@indieweb.social
🔥 More anti-enshittification features now live in Bonfire
✨ Complete data portability: Export/import now supports circles/lists, bookmarks, likes, and boosts alongside follows, blocks, and posts.
✨ Transparency by design: A dedicated real-time dashboard to monitor migration progress in detail and troubleshoot issues.
Read more about 1.0 RC3: https://bonfirenetworks.org/posts/bonfire-social-1-0rc3/
#enshittification #release
@lobsters@mastodon.social
Optique 0.6.0: Shell completion support for type-safe CLI parsers https://lobste.rs/s/rnekre #javascript #release
https://hackers.pub/@hongminhee/2025/optique-060
@lobsters@mastodon.social
Optique 0.6.0: Shell completion support for type-safe CLI parsers https://lobste.rs/s/rnekre #javascript #release
https://hackers.pub/@hongminhee/2025/optique-060
@lobsters@mastodon.social
Optique 0.6.0: Shell completion support for type-safe CLI parsers https://lobste.rs/s/rnekre #javascript #release
https://hackers.pub/@hongminhee/2025/optique-060
@bonfire@indieweb.social
🔥 More anti-enshittification features now live in Bonfire
✨ Complete data portability: Export/import now supports circles/lists, bookmarks, likes, and boosts alongside follows, blocks, and posts.
✨ Transparency by design: A dedicated real-time dashboard to monitor migration progress in detail and troubleshoot issues.
Read more about 1.0 RC3: https://bonfirenetworks.org/posts/bonfire-social-1-0rc3/
#enshittification #release
@lobsters@mastodon.social
Optique 0.6.0: Shell completion support for type-safe CLI parsers https://lobste.rs/s/rnekre #javascript #release
https://hackers.pub/@hongminhee/2025/optique-060
@WoodpeckerCI@floss.social
🚀 Woodpecker 3.10.0 is live!
- Pull‑request metadata & task‑UUID labels for tighter CI pipelines
- New org‑listing API (CLI & Go SDK) + milestone support
- Smarter error traces, CLI auto‑completion & human‑readable queue info
- Dozens of dependency fixes
Upgrade now for a smoother CI experience! 🎉 #CI #DevOps #woodpeckerci #release
https://github.com/woodpecker-ci/woodpecker/releases/tag/v3.10.0
@hugovk@mastodon.social · Reply to Hugo van Kemenade's post
Just released! 🚀
em-keyboard 5.3.0
🎲 Pick a random emoji from a search. For example:
❯ em --search music --random
Copied! 👩🎤 woman_singer
🧛♂️ Drop support for Python 3.9
@hugovk@mastodon.social · Reply to Hugo van Kemenade's post
Just released! 🚀
🎶 pylast 6.0.0
🎤 A Python interface to Last.fm and Libre.fm
📯 Restore proxy support (potential breaking change: proxies are now always stored as a dict, before it was a str or dict)
🪇 Drop support for almost-EOL Python 3.9
@php@fosstodon.org
🎉 PHP 8.5.0 RC 1 is available for testing!
This is the first release candidate for PHP 8.5, including
- Implementation of remaining deprecations and warnings
- Finishing up the new Uri extension
- Bug fixes thanks to your testing and feedback
… and more!
➕ Do: Test your projects!
➖ Don't: Run it in production. It's not fully ready yet.
Congratulations to Daniel, @edorian, and @adoy
@php@fosstodon.org
🎉 PHP 8.5.0 RC 1 is available for testing!
This is the first release candidate for PHP 8.5, including
- Implementation of remaining deprecations and warnings
- Finishing up the new Uri extension
- Bug fixes thanks to your testing and feedback
… and more!
➕ Do: Test your projects!
➖ Don't: Run it in production. It's not fully ready yet.
Congratulations to Daniel, @edorian, and @adoy
@mastodon_mobile_apps@stefanbohacek.online
New Android release (v2.11.0)!
- You can now quote other people’s posts (if they permit it) when connected to a server that supports it
- Other minor fixes and improvements
- https://github.com/mastodon/mastodon-android/releases
- https://play.google.com/store/apps/details?id=org.joinmastodon.android
@mastodon_mobile_apps@stefanbohacek.online
New Android release (v2.11.0)!
- You can now quote other people’s posts (if they permit it) when connected to a server that supports it
- Other minor fixes and improvements
- https://github.com/mastodon/mastodon-android/releases
- https://play.google.com/store/apps/details?id=org.joinmastodon.android
@hugovk@mastodon.social · Reply to Hugo van Kemenade's post
Just released: Python 3.14.0 release candidate 3! 🚀🐍
🪄 Finally, the final release candidate
🪄 We fixed *another* bug that required the ".pyc magic number" to be increased
🪄 The ABI isn't changing, and wheels built for rc1 and rc2 should still work
👤 This was the first release @savannah shadowed!
🏆 Please test and report bugs!
https://discuss.python.org/t/python-3-14-0rc3-is-go/103815?u=hugovk
@lobsters@mastodon.social
@lobsters@mastodon.social
@hongminhee@hackers.pub
LogTape 1.1.0 is here, and it focuses on making your logging smarter and more flexible. This release introduces two major features we think you'll love.
Tired of noisy production logs? Wish you had the full story when an error finally pops up? Our new “fingers crossed” logging pattern was built for exactly that.
With fingers crossed logging, LogTape buffers your debug and low-level logs in memory instead of immediately outputting them. When an error occurs, it flushes the entire buffer—giving you the complete sequence of events leading up to the problem. Once the error is logged, subsequent logs pass through normally until the next trigger event.
import { configure, fingersCrossed, getConsoleSink } from "@logtape/logtape";
await configure({
sinks: {
console: fingersCrossed(getConsoleSink(), {
triggerLevel: "error", // Buffer until an error occurs
maxBufferSize: 500, // Keep last 500 records
}),
},
loggers: [
{ category: [], sinks: ["console"], lowestLevel: "debug" },
],
});
It's the best of both worlds: clean logs when things are running smoothly, and rich, detailed context the moment an issue occurs. Stop choosing between too much noise and not enough information.
For applications with multiple modules or services, the new category isolation feature prevents one component's errors from flushing unrelated logs:
fingersCrossed(getConsoleSink(), {
isolateByCategory: "descendant", // Only flush related categories
})
You can choose how categories relate to each other—flush child categories when a parent triggers, parent categories when a child triggers, or both. This surgical precision keeps your logs focused and relevant.
Integrating logs from external systems just got a lot easier. With the new Logger.emit() method, you can now feed logs from Kafka, legacy applications, or any other source directly into LogTape while preserving their original timestamps and metadata.
const logger = getLogger(["my-app", "integration"]);
// Preserve the original timestamp from an external system
logger.emit({
timestamp: kafkaMessage.originalTimestamp,
level: "info",
message: [kafkaMessage.content],
rawMessage: kafkaMessage.content,
properties: {
source: "kafka",
partition: kafkaMessage.partition,
offset: kafkaMessage.offset,
},
});
This new low-level API gives you full control over the log record, allowing you to leverage LogTape's powerful filtering, formatting, and sink ecosystem for any log source. It's particularly valuable for:
Beyond the headline features, we've strengthened LogTape's reliability across the ecosystem. Check out the full changelog for complete details.
getStreamFileSink() to properly implement AsyncDisposable for cleaner resource managementUpgrading to 1.1.0 is a no-brainer. It's fully backward-compatible and makes your setup more powerful. The fingers crossed feature alone will change how you debug in production. Imagine getting a complete stack trace with full context for every error, without the performance hit of constant verbose logging.
If you're new to LogTape, this release shows what we're all about: building tools that solve real-world problems. We don't think you should have to choose between noisy logs and insufficient context. LogTape adapts to what you need, buffering logs when things are quiet and providing rich detail when it matters most.
Upgrade to LogTape 1.1.0:
npm update @logtape/logtape
# or
deno add jsr:@logtape/logtape@^1.1.0
The new features are opt-in, so your existing configuration continues working exactly as before. When you're ready, explore fingers crossed logging for cleaner production logs or use emit() for advanced integration scenarios.
Let us know what you think of the new features! We're always active in our GitHub discussions and would love to hear your feedback.
@hongminhee@hackers.pub
LogTape 1.1.0 is here, and it focuses on making your logging smarter and more flexible. This release introduces two major features we think you'll love.
Tired of noisy production logs? Wish you had the full story when an error finally pops up? Our new “fingers crossed” logging pattern was built for exactly that.
With fingers crossed logging, LogTape buffers your debug and low-level logs in memory instead of immediately outputting them. When an error occurs, it flushes the entire buffer—giving you the complete sequence of events leading up to the problem. Once the error is logged, subsequent logs pass through normally until the next trigger event.
import { configure, fingersCrossed, getConsoleSink } from "@logtape/logtape";
await configure({
sinks: {
console: fingersCrossed(getConsoleSink(), {
triggerLevel: "error", // Buffer until an error occurs
maxBufferSize: 500, // Keep last 500 records
}),
},
loggers: [
{ category: [], sinks: ["console"], lowestLevel: "debug" },
],
});
It's the best of both worlds: clean logs when things are running smoothly, and rich, detailed context the moment an issue occurs. Stop choosing between too much noise and not enough information.
For applications with multiple modules or services, the new category isolation feature prevents one component's errors from flushing unrelated logs:
fingersCrossed(getConsoleSink(), {
isolateByCategory: "descendant", // Only flush related categories
})
You can choose how categories relate to each other—flush child categories when a parent triggers, parent categories when a child triggers, or both. This surgical precision keeps your logs focused and relevant.
Integrating logs from external systems just got a lot easier. With the new Logger.emit() method, you can now feed logs from Kafka, legacy applications, or any other source directly into LogTape while preserving their original timestamps and metadata.
const logger = getLogger(["my-app", "integration"]);
// Preserve the original timestamp from an external system
logger.emit({
timestamp: kafkaMessage.originalTimestamp,
level: "info",
message: [kafkaMessage.content],
rawMessage: kafkaMessage.content,
properties: {
source: "kafka",
partition: kafkaMessage.partition,
offset: kafkaMessage.offset,
},
});
This new low-level API gives you full control over the log record, allowing you to leverage LogTape's powerful filtering, formatting, and sink ecosystem for any log source. It's particularly valuable for:
Beyond the headline features, we've strengthened LogTape's reliability across the ecosystem. Check out the full changelog for complete details.
getStreamFileSink() to properly implement AsyncDisposable for cleaner resource managementUpgrading to 1.1.0 is a no-brainer. It's fully backward-compatible and makes your setup more powerful. The fingers crossed feature alone will change how you debug in production. Imagine getting a complete stack trace with full context for every error, without the performance hit of constant verbose logging.
If you're new to LogTape, this release shows what we're all about: building tools that solve real-world problems. We don't think you should have to choose between noisy logs and insufficient context. LogTape adapts to what you need, buffering logs when things are quiet and providing rich detail when it matters most.
Upgrade to LogTape 1.1.0:
npm update @logtape/logtape
# or
deno add jsr:@logtape/logtape@^1.1.0
The new features are opt-in, so your existing configuration continues working exactly as before. When you're ready, explore fingers crossed logging for cleaner production logs or use emit() for advanced integration scenarios.
Let us know what you think of the new features! We're always active in our GitHub discussions and would love to hear your feedback.
@hongminhee@hackers.pub
LogTape 1.1.0 is here, and it focuses on making your logging smarter and more flexible. This release introduces two major features we think you'll love.
Tired of noisy production logs? Wish you had the full story when an error finally pops up? Our new “fingers crossed” logging pattern was built for exactly that.
With fingers crossed logging, LogTape buffers your debug and low-level logs in memory instead of immediately outputting them. When an error occurs, it flushes the entire buffer—giving you the complete sequence of events leading up to the problem. Once the error is logged, subsequent logs pass through normally until the next trigger event.
import { configure, fingersCrossed, getConsoleSink } from "@logtape/logtape";
await configure({
sinks: {
console: fingersCrossed(getConsoleSink(), {
triggerLevel: "error", // Buffer until an error occurs
maxBufferSize: 500, // Keep last 500 records
}),
},
loggers: [
{ category: [], sinks: ["console"], lowestLevel: "debug" },
],
});
It's the best of both worlds: clean logs when things are running smoothly, and rich, detailed context the moment an issue occurs. Stop choosing between too much noise and not enough information.
For applications with multiple modules or services, the new category isolation feature prevents one component's errors from flushing unrelated logs:
fingersCrossed(getConsoleSink(), {
isolateByCategory: "descendant", // Only flush related categories
})
You can choose how categories relate to each other—flush child categories when a parent triggers, parent categories when a child triggers, or both. This surgical precision keeps your logs focused and relevant.
Integrating logs from external systems just got a lot easier. With the new Logger.emit() method, you can now feed logs from Kafka, legacy applications, or any other source directly into LogTape while preserving their original timestamps and metadata.
const logger = getLogger(["my-app", "integration"]);
// Preserve the original timestamp from an external system
logger.emit({
timestamp: kafkaMessage.originalTimestamp,
level: "info",
message: [kafkaMessage.content],
rawMessage: kafkaMessage.content,
properties: {
source: "kafka",
partition: kafkaMessage.partition,
offset: kafkaMessage.offset,
},
});
This new low-level API gives you full control over the log record, allowing you to leverage LogTape's powerful filtering, formatting, and sink ecosystem for any log source. It's particularly valuable for:
Beyond the headline features, we've strengthened LogTape's reliability across the ecosystem. Check out the full changelog for complete details.
getStreamFileSink() to properly implement AsyncDisposable for cleaner resource managementUpgrading to 1.1.0 is a no-brainer. It's fully backward-compatible and makes your setup more powerful. The fingers crossed feature alone will change how you debug in production. Imagine getting a complete stack trace with full context for every error, without the performance hit of constant verbose logging.
If you're new to LogTape, this release shows what we're all about: building tools that solve real-world problems. We don't think you should have to choose between noisy logs and insufficient context. LogTape adapts to what you need, buffering logs when things are quiet and providing rich detail when it matters most.
Upgrade to LogTape 1.1.0:
npm update @logtape/logtape
# or
deno add jsr:@logtape/logtape@^1.1.0
The new features are opt-in, so your existing configuration continues working exactly as before. When you're ready, explore fingers crossed logging for cleaner production logs or use emit() for advanced integration scenarios.
Let us know what you think of the new features! We're always active in our GitHub discussions and would love to hear your feedback.
@hongminhee@hackers.pub
LogTape 1.1.0 is here, and it focuses on making your logging smarter and more flexible. This release introduces two major features we think you'll love.
Tired of noisy production logs? Wish you had the full story when an error finally pops up? Our new “fingers crossed” logging pattern was built for exactly that.
With fingers crossed logging, LogTape buffers your debug and low-level logs in memory instead of immediately outputting them. When an error occurs, it flushes the entire buffer—giving you the complete sequence of events leading up to the problem. Once the error is logged, subsequent logs pass through normally until the next trigger event.
import { configure, fingersCrossed, getConsoleSink } from "@logtape/logtape";
await configure({
sinks: {
console: fingersCrossed(getConsoleSink(), {
triggerLevel: "error", // Buffer until an error occurs
maxBufferSize: 500, // Keep last 500 records
}),
},
loggers: [
{ category: [], sinks: ["console"], lowestLevel: "debug" },
],
});
It's the best of both worlds: clean logs when things are running smoothly, and rich, detailed context the moment an issue occurs. Stop choosing between too much noise and not enough information.
For applications with multiple modules or services, the new category isolation feature prevents one component's errors from flushing unrelated logs:
fingersCrossed(getConsoleSink(), {
isolateByCategory: "descendant", // Only flush related categories
})
You can choose how categories relate to each other—flush child categories when a parent triggers, parent categories when a child triggers, or both. This surgical precision keeps your logs focused and relevant.
Integrating logs from external systems just got a lot easier. With the new Logger.emit() method, you can now feed logs from Kafka, legacy applications, or any other source directly into LogTape while preserving their original timestamps and metadata.
const logger = getLogger(["my-app", "integration"]);
// Preserve the original timestamp from an external system
logger.emit({
timestamp: kafkaMessage.originalTimestamp,
level: "info",
message: [kafkaMessage.content],
rawMessage: kafkaMessage.content,
properties: {
source: "kafka",
partition: kafkaMessage.partition,
offset: kafkaMessage.offset,
},
});
This new low-level API gives you full control over the log record, allowing you to leverage LogTape's powerful filtering, formatting, and sink ecosystem for any log source. It's particularly valuable for:
Beyond the headline features, we've strengthened LogTape's reliability across the ecosystem. Check out the full changelog for complete details.
getStreamFileSink() to properly implement AsyncDisposable for cleaner resource managementUpgrading to 1.1.0 is a no-brainer. It's fully backward-compatible and makes your setup more powerful. The fingers crossed feature alone will change how you debug in production. Imagine getting a complete stack trace with full context for every error, without the performance hit of constant verbose logging.
If you're new to LogTape, this release shows what we're all about: building tools that solve real-world problems. We don't think you should have to choose between noisy logs and insufficient context. LogTape adapts to what you need, buffering logs when things are quiet and providing rich detail when it matters most.
Upgrade to LogTape 1.1.0:
npm update @logtape/logtape
# or
deno add jsr:@logtape/logtape@^1.1.0
The new features are opt-in, so your existing configuration continues working exactly as before. When you're ready, explore fingers crossed logging for cleaner production logs or use emit() for advanced integration scenarios.
Let us know what you think of the new features! We're always active in our GitHub discussions and would love to hear your feedback.
@hongminhee@hackers.pub
LogTape 1.1.0 is here, and it focuses on making your logging smarter and more flexible. This release introduces two major features we think you'll love.
Tired of noisy production logs? Wish you had the full story when an error finally pops up? Our new “fingers crossed” logging pattern was built for exactly that.
With fingers crossed logging, LogTape buffers your debug and low-level logs in memory instead of immediately outputting them. When an error occurs, it flushes the entire buffer—giving you the complete sequence of events leading up to the problem. Once the error is logged, subsequent logs pass through normally until the next trigger event.
import { configure, fingersCrossed, getConsoleSink } from "@logtape/logtape";
await configure({
sinks: {
console: fingersCrossed(getConsoleSink(), {
triggerLevel: "error", // Buffer until an error occurs
maxBufferSize: 500, // Keep last 500 records
}),
},
loggers: [
{ category: [], sinks: ["console"], lowestLevel: "debug" },
],
});
It's the best of both worlds: clean logs when things are running smoothly, and rich, detailed context the moment an issue occurs. Stop choosing between too much noise and not enough information.
For applications with multiple modules or services, the new category isolation feature prevents one component's errors from flushing unrelated logs:
fingersCrossed(getConsoleSink(), {
isolateByCategory: "descendant", // Only flush related categories
})
You can choose how categories relate to each other—flush child categories when a parent triggers, parent categories when a child triggers, or both. This surgical precision keeps your logs focused and relevant.
Integrating logs from external systems just got a lot easier. With the new Logger.emit() method, you can now feed logs from Kafka, legacy applications, or any other source directly into LogTape while preserving their original timestamps and metadata.
const logger = getLogger(["my-app", "integration"]);
// Preserve the original timestamp from an external system
logger.emit({
timestamp: kafkaMessage.originalTimestamp,
level: "info",
message: [kafkaMessage.content],
rawMessage: kafkaMessage.content,
properties: {
source: "kafka",
partition: kafkaMessage.partition,
offset: kafkaMessage.offset,
},
});
This new low-level API gives you full control over the log record, allowing you to leverage LogTape's powerful filtering, formatting, and sink ecosystem for any log source. It's particularly valuable for:
Beyond the headline features, we've strengthened LogTape's reliability across the ecosystem. Check out the full changelog for complete details.
getStreamFileSink() to properly implement AsyncDisposable for cleaner resource managementUpgrading to 1.1.0 is a no-brainer. It's fully backward-compatible and makes your setup more powerful. The fingers crossed feature alone will change how you debug in production. Imagine getting a complete stack trace with full context for every error, without the performance hit of constant verbose logging.
If you're new to LogTape, this release shows what we're all about: building tools that solve real-world problems. We don't think you should have to choose between noisy logs and insufficient context. LogTape adapts to what you need, buffering logs when things are quiet and providing rich detail when it matters most.
Upgrade to LogTape 1.1.0:
npm update @logtape/logtape
# or
deno add jsr:@logtape/logtape@^1.1.0
The new features are opt-in, so your existing configuration continues working exactly as before. When you're ready, explore fingers crossed logging for cleaner production logs or use emit() for advanced integration scenarios.
Let us know what you think of the new features! We're always active in our GitHub discussions and would love to hear your feedback.
@hongminhee@hackers.pub
LogTape 1.1.0 is here, and it focuses on making your logging smarter and more flexible. This release introduces two major features we think you'll love.
Tired of noisy production logs? Wish you had the full story when an error finally pops up? Our new “fingers crossed” logging pattern was built for exactly that.
With fingers crossed logging, LogTape buffers your debug and low-level logs in memory instead of immediately outputting them. When an error occurs, it flushes the entire buffer—giving you the complete sequence of events leading up to the problem. Once the error is logged, subsequent logs pass through normally until the next trigger event.
import { configure, fingersCrossed, getConsoleSink } from "@logtape/logtape";
await configure({
sinks: {
console: fingersCrossed(getConsoleSink(), {
triggerLevel: "error", // Buffer until an error occurs
maxBufferSize: 500, // Keep last 500 records
}),
},
loggers: [
{ category: [], sinks: ["console"], lowestLevel: "debug" },
],
});
It's the best of both worlds: clean logs when things are running smoothly, and rich, detailed context the moment an issue occurs. Stop choosing between too much noise and not enough information.
For applications with multiple modules or services, the new category isolation feature prevents one component's errors from flushing unrelated logs:
fingersCrossed(getConsoleSink(), {
isolateByCategory: "descendant", // Only flush related categories
})
You can choose how categories relate to each other—flush child categories when a parent triggers, parent categories when a child triggers, or both. This surgical precision keeps your logs focused and relevant.
Integrating logs from external systems just got a lot easier. With the new Logger.emit() method, you can now feed logs from Kafka, legacy applications, or any other source directly into LogTape while preserving their original timestamps and metadata.
const logger = getLogger(["my-app", "integration"]);
// Preserve the original timestamp from an external system
logger.emit({
timestamp: kafkaMessage.originalTimestamp,
level: "info",
message: [kafkaMessage.content],
rawMessage: kafkaMessage.content,
properties: {
source: "kafka",
partition: kafkaMessage.partition,
offset: kafkaMessage.offset,
},
});
This new low-level API gives you full control over the log record, allowing you to leverage LogTape's powerful filtering, formatting, and sink ecosystem for any log source. It's particularly valuable for:
Beyond the headline features, we've strengthened LogTape's reliability across the ecosystem. Check out the full changelog for complete details.
getStreamFileSink() to properly implement AsyncDisposable for cleaner resource managementUpgrading to 1.1.0 is a no-brainer. It's fully backward-compatible and makes your setup more powerful. The fingers crossed feature alone will change how you debug in production. Imagine getting a complete stack trace with full context for every error, without the performance hit of constant verbose logging.
If you're new to LogTape, this release shows what we're all about: building tools that solve real-world problems. We don't think you should have to choose between noisy logs and insufficient context. LogTape adapts to what you need, buffering logs when things are quiet and providing rich detail when it matters most.
Upgrade to LogTape 1.1.0:
npm update @logtape/logtape
# or
deno add jsr:@logtape/logtape@^1.1.0
The new features are opt-in, so your existing configuration continues working exactly as before. When you're ready, explore fingers crossed logging for cleaner production logs or use emit() for advanced integration scenarios.
Let us know what you think of the new features! We're always active in our GitHub discussions and would love to hear your feedback.
@lobsters@mastodon.social
term.everything: Run any GUI app in the terminal https://lobste.rs/s/9m1tto #show #release
https://github.com/mmulet/term.everything
@pandoc@fosstodon.org
🆕 release: pandoc 3.8 🎉
This release comes with many small improvements and a few larger ones.
Among the more visible changes:
• A new input/output format `xml`, which represents a pandoc AST in XML.
• Syntax highlighting updates, including a new command line option `--syntax-highlighting`.
• New extensions `smart_quotes` and `special_strings` for org mode, bringing pandoc's parsing closer to Emacs org-mode's behavior.
Thanks to all who contributed!
@Cockpit@fosstodon.org
Today's Cockpit #release brings Stratis V2 support, better distro branding support, persistent serial VM consoles, and more. Enjoy!
@Cockpit@fosstodon.org
Today's Cockpit #release brings Stratis V2 support, better distro branding support, persistent serial VM consoles, and more. Enjoy!
@lobsters@mastodon.social
zfsbackrest: pgbackrest style encrypted backups for ZFS filesystems via @sphericalkat https://lobste.rs/s/ewbgui #release
https://github.com/gargakshit/zfsbackrest
@lobsters@mastodon.social
zfsbackrest: pgbackrest style encrypted backups for ZFS filesystems via @sphericalkat https://lobste.rs/s/ewbgui #release
https://github.com/gargakshit/zfsbackrest
@hongminhee@hackers.pub
We're releasing Optique 0.3.0 with several improvements that make building complex CLI applications more straightforward. This release focuses on expanding parser flexibility and improving the help system based on feedback from the community, particularly from the Fedify project's migration from Cliffy to Optique. Special thanks to @z9mb1 for her invaluable insights during this process.
flag() parser for dependent options patternswithDefault() supporting union types for conditional CLI structuresor() capacity now supporting up to 10 parsers (previously 5)merge() combinator that works with any object-producing parser, not just object()longestMatch() combinator@optique/core and @optique/runflag() The new flag() parser creates Boolean flags that must be explicitly provided. While option() defaults to false when absent, flag() fails parsing entirely if not present. This subtle difference enables cleaner patterns for dependent options.
Consider a scenario where certain options only make sense when a mode is explicitly enabled:
import { flag, object, option, withDefault } from "@optique/core/parser";
import { integer } from "@optique/core/valueparser";
// Without the --advanced flag, these options aren't available
const parser = withDefault(
object({
advanced: flag("--advanced"),
maxThreads: option("--threads", integer()),
cacheSize: option("--cache-size", integer())
}),
{ advanced: false as const }
);
// Usage:
// myapp → { advanced: false }
// myapp --advanced → Error: --threads and --cache-size required
// myapp --advanced --threads 4 --cache-size 100 → Success
This pattern is particularly useful for confirmation flags (--yes-i-am-sure) or mode switches that fundamentally change how your CLI behaves.
withDefault() Previously, withDefault() required the default value to match the parser's type exactly. Now it supports different types, creating union types that enable conditional CLI structures:
const conditionalParser = withDefault(
object({
server: flag("-s", "--server"),
port: option("-p", "--port", integer()),
host: option("-h", "--host", string())
}),
{ server: false as const }
);
// Result type is now a union:
// | { server: false }
// | { server: true, port: number, host: string }
This change makes it much easier to build CLIs where different flags enable different sets of options, without resorting to complex or() chains.
merge() combinator The merge() combinator now accepts any parser that produces object-like values. Previously limited to object() parsers, it now works with withDefault(), map(), and other transformative parsers:
const transformedConfig = map(
object({
host: option("--host", string()),
port: option("--port", integer())
}),
({ host, port }) => ({ endpoint: `${host}:${port}` })
);
const conditionalFeatures = withDefault(
object({
experimental: flag("--experimental"),
debugLevel: option("--debug-level", integer())
}),
{ experimental: false as const }
);
// Can now merge different parser types
const appConfig = merge(
transformedConfig, // map() result
conditionalFeatures, // withDefault() parser
object({ // traditional object()
verbose: option("-v", "--verbose")
})
);
This improvement came from recognizing that many parsers ultimately produce objects, and artificially restricting merge() to only object() parsers was limiting composition patterns.
longestMatch() The new longestMatch() combinator selects the parser that consumes the most input tokens. This enables sophisticated help systems where command --help shows help for that specific command rather than global help:
const normalParser = object({
help: constant(false),
command: or(
command("list", listOptions),
command("add", addOptions)
)
});
const contextualHelp = object({
help: constant(true),
commands: multiple(argument(string())),
helpFlag: flag("--help")
});
const cli = longestMatch(normalParser, contextualHelp);
// myapp --help → Shows global help
// myapp list --help → Shows help for 'list' command
// myapp add --help → Shows help for 'add' command
The run() functions in both @optique/core/facade and @optique/run now use this pattern automatically, so your CLI gets context-aware help without any additional configuration.
Both @optique/core/facade and @optique/run now support version display through --version flags and version commands. See the runners documentation for details:
// @optique/run - simple API
run(parser, {
version: "1.0.0", // Adds --version flag
help: "both"
});
// @optique/core/facade - detailed control
run(parser, "myapp", args, {
version: {
mode: "both", // --version flag AND version command
value: "1.0.0",
onShow: process.exit
}
});
The API follows the same pattern as help configuration, keeping things consistent and predictable.
The new output functions in @optique/run provide consistent terminal formatting with automatic capability detection. Learn more in the messages documentation:
import { print, printError, createPrinter } from "@optique/run";
import { message } from "@optique/core/message";
// Standard output with automatic formatting
print(message`Processing ${filename}...`);
// Error output to stderr with optional exit
printError(message`File ${filename} not found`, { exitCode: 1 });
// Custom printer for specific needs
const debugPrint = createPrinter({
stream: "stderr",
colors: true,
maxWidth: 80
});
debugPrint(message`Debug: ${details}`);
These functions automatically detect terminal capabilities and apply appropriate formatting, making your CLI output consistent across different environments.
While we've tried to maintain backward compatibility, there are a few changes to be aware of:
help option in @optique/run no longer accepts "none". Simply omit the option to disable help.getDocFragments() need to update their signature to use DocState<TState> instead of direct state values.object() parser now uses greedy parsing, attempting to consume all matching fields in one pass. This shouldn't affect most use cases but may change parsing order in complex scenarios.To upgrade to Optique 0.3.0, update both packages:
# Deno (JSR)
deno add @optique/core@^0.3.0 @optique/run@^0.3.0
# npm
npm update @optique/core @optique/run
# pnpm
pnpm update @optique/core @optique/run
# Yarn
yarn upgrade @optique/core @optique/run
# Bun
bun update @optique/core @optique/run
If you're only using the core package:
# Deno (JSR)
deno add @optique/core@^0.3.0
# npm
npm update @optique/core
These improvements came from real-world usage and community feedback. We're particularly interested in hearing how the new dependent options patterns work for your use cases, and whether the context-aware help system meets your needs.
As always, you can find complete documentation at optique.dev and file issues or suggestions on GitHub.
@GTK@floss.social
The new stable release cycle of GTK is now available, in time for GNOME 49:
https://gitlab.gnome.org/GNOME/gtk/-/releases/4.20.0
Relevant improvements:
- YUV support
- Better symbolic icons
- CSS media queries for color scheme and contrast
- Path intersection
- Rely on portals for session management
- Better support for Wayland, macOS, Android, and Windows
@hongminhee@hackers.pub
We're releasing Optique 0.3.0 with several improvements that make building complex CLI applications more straightforward. This release focuses on expanding parser flexibility and improving the help system based on feedback from the community, particularly from the Fedify project's migration from Cliffy to Optique. Special thanks to @z9mb1 for her invaluable insights during this process.
flag() parser for dependent options patternswithDefault() supporting union types for conditional CLI structuresor() capacity now supporting up to 10 parsers (previously 5)merge() combinator that works with any object-producing parser, not just object()longestMatch() combinator@optique/core and @optique/runflag() The new flag() parser creates Boolean flags that must be explicitly provided. While option() defaults to false when absent, flag() fails parsing entirely if not present. This subtle difference enables cleaner patterns for dependent options.
Consider a scenario where certain options only make sense when a mode is explicitly enabled:
import { flag, object, option, withDefault } from "@optique/core/parser";
import { integer } from "@optique/core/valueparser";
// Without the --advanced flag, these options aren't available
const parser = withDefault(
object({
advanced: flag("--advanced"),
maxThreads: option("--threads", integer()),
cacheSize: option("--cache-size", integer())
}),
{ advanced: false as const }
);
// Usage:
// myapp → { advanced: false }
// myapp --advanced → Error: --threads and --cache-size required
// myapp --advanced --threads 4 --cache-size 100 → Success
This pattern is particularly useful for confirmation flags (--yes-i-am-sure) or mode switches that fundamentally change how your CLI behaves.
withDefault() Previously, withDefault() required the default value to match the parser's type exactly. Now it supports different types, creating union types that enable conditional CLI structures:
const conditionalParser = withDefault(
object({
server: flag("-s", "--server"),
port: option("-p", "--port", integer()),
host: option("-h", "--host", string())
}),
{ server: false as const }
);
// Result type is now a union:
// | { server: false }
// | { server: true, port: number, host: string }
This change makes it much easier to build CLIs where different flags enable different sets of options, without resorting to complex or() chains.
merge() combinator The merge() combinator now accepts any parser that produces object-like values. Previously limited to object() parsers, it now works with withDefault(), map(), and other transformative parsers:
const transformedConfig = map(
object({
host: option("--host", string()),
port: option("--port", integer())
}),
({ host, port }) => ({ endpoint: `${host}:${port}` })
);
const conditionalFeatures = withDefault(
object({
experimental: flag("--experimental"),
debugLevel: option("--debug-level", integer())
}),
{ experimental: false as const }
);
// Can now merge different parser types
const appConfig = merge(
transformedConfig, // map() result
conditionalFeatures, // withDefault() parser
object({ // traditional object()
verbose: option("-v", "--verbose")
})
);
This improvement came from recognizing that many parsers ultimately produce objects, and artificially restricting merge() to only object() parsers was limiting composition patterns.
longestMatch() The new longestMatch() combinator selects the parser that consumes the most input tokens. This enables sophisticated help systems where command --help shows help for that specific command rather than global help:
const normalParser = object({
help: constant(false),
command: or(
command("list", listOptions),
command("add", addOptions)
)
});
const contextualHelp = object({
help: constant(true),
commands: multiple(argument(string())),
helpFlag: flag("--help")
});
const cli = longestMatch(normalParser, contextualHelp);
// myapp --help → Shows global help
// myapp list --help → Shows help for 'list' command
// myapp add --help → Shows help for 'add' command
The run() functions in both @optique/core/facade and @optique/run now use this pattern automatically, so your CLI gets context-aware help without any additional configuration.
Both @optique/core/facade and @optique/run now support version display through --version flags and version commands. See the runners documentation for details:
// @optique/run - simple API
run(parser, {
version: "1.0.0", // Adds --version flag
help: "both"
});
// @optique/core/facade - detailed control
run(parser, "myapp", args, {
version: {
mode: "both", // --version flag AND version command
value: "1.0.0",
onShow: process.exit
}
});
The API follows the same pattern as help configuration, keeping things consistent and predictable.
The new output functions in @optique/run provide consistent terminal formatting with automatic capability detection. Learn more in the messages documentation:
import { print, printError, createPrinter } from "@optique/run";
import { message } from "@optique/core/message";
// Standard output with automatic formatting
print(message`Processing ${filename}...`);
// Error output to stderr with optional exit
printError(message`File ${filename} not found`, { exitCode: 1 });
// Custom printer for specific needs
const debugPrint = createPrinter({
stream: "stderr",
colors: true,
maxWidth: 80
});
debugPrint(message`Debug: ${details}`);
These functions automatically detect terminal capabilities and apply appropriate formatting, making your CLI output consistent across different environments.
While we've tried to maintain backward compatibility, there are a few changes to be aware of:
help option in @optique/run no longer accepts "none". Simply omit the option to disable help.getDocFragments() need to update their signature to use DocState<TState> instead of direct state values.object() parser now uses greedy parsing, attempting to consume all matching fields in one pass. This shouldn't affect most use cases but may change parsing order in complex scenarios.To upgrade to Optique 0.3.0, update both packages:
# Deno (JSR)
deno add @optique/core@^0.3.0 @optique/run@^0.3.0
# npm
npm update @optique/core @optique/run
# pnpm
pnpm update @optique/core @optique/run
# Yarn
yarn upgrade @optique/core @optique/run
# Bun
bun update @optique/core @optique/run
If you're only using the core package:
# Deno (JSR)
deno add @optique/core@^0.3.0
# npm
npm update @optique/core
These improvements came from real-world usage and community feedback. We're particularly interested in hearing how the new dependent options patterns work for your use cases, and whether the context-aware help system meets your needs.
As always, you can find complete documentation at optique.dev and file issues or suggestions on GitHub.
@hugovk@mastodon.social · Reply to Hugo van Kemenade's post
Just released: humanize 4.13.0! 🚀
🤖 Optimise `naturalsize` algorithm by using `math.log`
🤖 Fix `precisedelta` rounding
https://github.com/python-humanize/humanize/releases/tag/4.13.0
#Python #humanize #release
@hugovk@mastodon.social · Reply to Hugo van Kemenade's post
Just released: OSMViz 4.5.0! 🚀
An OpenStreetMap visualization toolkit for Python
🥧 Support for Python 3.14
🪪 Replace deprecated classifier with licence expression (PEP 639)
🔍 Remove GitHub attestation, PyPI attestation is enough
@hugovk@mastodon.social · Reply to Hugo van Kemenade's post
Just released: Cherry Picker 2.6.0! 🚀
🌸 Fix bug when local branch does not exist (thanks, @webknjaz!)
🌸 Use PEP 639 licence expression and remove deprecated Trove classifier
https://github.com/python/cherry-picker/releases/tag/cherry-picker-v2.6.0
@hugovk@mastodon.social · Reply to Hugo van Kemenade's post
Just released: UltraJSON 5.11.0! 🚀
⌨️ Inline type stubs
🐍 Support for Python 3.14 & PyPy3.11
🛞 Windows ARM64 wheels (thanks @tonybaloney!)
💧Drop EOL Python 3.8 & PyPy3.8-PyPy3.10
➕ And more!
https://github.com/ultrajson/ultrajson/releases/tag/5.11.0
#Python #release #ujson #UltraJSON
@metin@graphics.social
@flameshot@fosstodon.org
📣 We have released a minor version (v13.1.0) with some bug fixes:
+ Another fix for savePath slashes on Windows
+ Updated shell completion and manpage
+ AppImage build
+ Fix multi-monitor offset bug in Qt6 for X11 (yes we support both
and
)
+ Translations update from Hosted @weblate
Flatpak on Flathub is also on the way for this version. Will be updated soon on Flathub.
https://github.com/flameshot-org/flameshot/releases/tag/v13.1.0
@flameshot@fosstodon.org
📣 We have released a minor version (v13.1.0) with some bug fixes:
+ Another fix for savePath slashes on Windows
+ Updated shell completion and manpage
+ AppImage build
+ Fix multi-monitor offset bug in Qt6 for X11 (yes we support both
and
)
+ Translations update from Hosted @weblate
Flatpak on Flathub is also on the way for this version. Will be updated soon on Flathub.
https://github.com/flameshot-org/flameshot/releases/tag/v13.1.0
@hugovk@mastodon.social · Reply to Hugo van Kemenade's post
Just released: Python 3.14.0 release candidate 2! 🚀🐍
🪄 This was planned for 2025-08-26, but we fixed a bug that required bumping the magic number stored in bytecode (.pyc) files
🪄 This means .pyc files created for rc1 will be recompiled for rc2
🪄 The ABI isn’t changing
🪄 Wheels built for rc1 should be fine for rc2, rc3 and 3.14.x
🤖 Did I mention Android binaries?
🏆 Bonus: We also released an early Python 3.13.7!
https://discuss.python.org/t/python-3-14-0rc2-and-3-13-7-are-go/102403
#Python #CPython #Python314 #Python313 #release
@lobsters@mastodon.social
@lobsters@mastodon.social
@lobsters@mastodon.social
@hugovk@mastodon.social
Python 3.13.6 has been released:
"Python 3.13 is the newest major release of the Python programming language, and it contains many new features and optimizations compared to Python 3.12. 3.13.6 is the sixth maintenance release of 3.13, containing around 200 bugfixes, build improvements and documentation changes since 3.13.5."
https://discuss.python.org/t/python-3-13-6-has-been-released/101482
@hugovk@mastodon.social
Python 3.13.6 has been released:
"Python 3.13 is the newest major release of the Python programming language, and it contains many new features and optimizations compared to Python 3.12. 3.13.6 is the sixth maintenance release of 3.13, containing around 200 bugfixes, build improvements and documentation changes since 3.13.5."
https://discuss.python.org/t/python-3-13-6-has-been-released/101482
@daseinslaborant@berlin.social
We've made an album about #ants. Not sure how accurate it is, but we thought our quirky #instrumental #electronica #jazz does some enjoyable storytellling. Here's the first song of 'Terra Formica', to be released on 12.9. https://soundcloud.com/sebastianarnold/extraflorale-nektarien
@metin@graphics.social
@metin@graphics.social
@metin@graphics.social
@metin@graphics.social
@boilingsteam@mastodon.cloud
@boilingsteam@mastodon.cloud
@boilingsteam@mastodon.cloud
Mbin v1.8.3 Released: https://github.com/MbinOrg/mbin/releases/tag/v1.8.3 #linux #update #release #foss #mbin #activitypub
@boilingsteam@mastodon.cloud
@henryiii@fosstodon.org
We just released cibuildwheel 3.1, which builds Python 3.14/3.14t wheels by default (with yesterday's RC 1)! Also we added Android support, @pyodide 0.28 (3.13), 32-bit modern manylinux, riscv64 defaults, and beautiful new summaries! https://github.com/pypa/cibuildwheel/releases/tag/v3.1.0 #python #release
@henryiii@fosstodon.org
We just released cibuildwheel 3.1, which builds Python 3.14/3.14t wheels by default (with yesterday's RC 1)! Also we added Android support, @pyodide 0.28 (3.13), 32-bit modern manylinux, riscv64 defaults, and beautiful new summaries! https://github.com/pypa/cibuildwheel/releases/tag/v3.1.0 #python #release
@hugovk@mastodon.social · Reply to Hugo van Kemenade's post
Just released: Python 3.14.0 release candidate 1! 🚀🐍
🫖 T-strings!
🧵 Free-threading is officially supported!
🚇 Subinterpreters in the stdlib!
🗜️ Zstandard compression!
🎨 REPL syntax highlighting and tab autocomplete!
⚠️ Better error messages!
📦 Are you a package maintainer? Prepare for 3.14 and report bugs!
🛞 No ABI changes: upload 3.14 wheels to PyPI
🥧 And much, much more!
https://discuss.python.org/t/python-3-14-release-candidate-1-is-go/99754?u=hugovk
#Python #CPython #Python314 #release
@hugovk@mastodon.social · Reply to Hugo van Kemenade's post
Just released: Python 3.14.0 release candidate 1! 🚀🐍
🫖 T-strings!
🧵 Free-threading is officially supported!
🚇 Subinterpreters in the stdlib!
🗜️ Zstandard compression!
🎨 REPL syntax highlighting and tab autocomplete!
⚠️ Better error messages!
📦 Are you a package maintainer? Prepare for 3.14 and report bugs!
🛞 No ABI changes: upload 3.14 wheels to PyPI
🥧 And much, much more!
https://discuss.python.org/t/python-3-14-release-candidate-1-is-go/99754?u=hugovk
#Python #CPython #Python314 #release
@hugovk@mastodon.social · Reply to Hugo van Kemenade's post
Just released: Python 3.14.0 release candidate 1! 🚀🐍
🫖 T-strings!
🧵 Free-threading is officially supported!
🚇 Subinterpreters in the stdlib!
🗜️ Zstandard compression!
🎨 REPL syntax highlighting and tab autocomplete!
⚠️ Better error messages!
📦 Are you a package maintainer? Prepare for 3.14 and report bugs!
🛞 No ABI changes: upload 3.14 wheels to PyPI
🥧 And much, much more!
https://discuss.python.org/t/python-3-14-release-candidate-1-is-go/99754?u=hugovk
#Python #CPython #Python314 #release
@hugovk@mastodon.social · Reply to Hugo van Kemenade's post
Just released: Python 3.14.0 beta 4! 🚀🐍
🥧 Last beta!
🥧 Do you maintain a Python package? Please test and report bugs!
🥧 This includes creating pre-release wheels for 3.14, as it helps other projects to do their own testing.
https://discuss.python.org/t/python-3-14-0-beta-4-is-here/98092/1?u=hugovk
#Python #CPython #Python314 #release
@hugovk@mastodon.social · Reply to Hugo van Kemenade's post
Just released: linkotron 0.6.0!
🔗 Adds OSC 8 formatting so you can do make those clickable links in terminal emulators.
https://pypi.org/project/linkotron/
#Python #release #linkotron
@php@fosstodon.org
🎉 PHP 8.5.0 Alpha 1 is available for testing!
In this very initial preview for PHP 8.5, we have:
- Pipe operator (|>)
- Final property promotion
- New array_first() and array_last() functions
- New #[\NoDiscard] attribute
… and more!
➕ Do: Test your projects!
➖ Don't: Run it in production. It's not fully ready yet.
Congratulations to Daniel, @edorian, and @adoy
@GTK@floss.social
The new development snapshot towards GTK 4.20 is now available: https://gitlab.gnome.org/GNOME/gtk/-/releases/4.19.2
Lots of changes, mainly related to improvements in SVG symbolic icons; CSS gradients, keyframe selectors, and text shadows; caching masks for fill and stroke nodes; and Windows support in the form of D3D textures, rendering, and composition
Full release notes available: https://download.gnome.org/sources/gtk/4.19/gtk-4.19.2.news
@hongminhee@hackers.pub
LogTape is a logging library designed specifically for the modern JavaScript ecosystem. It stands out with its zero-dependency architecture, universal runtime support across Node.js, Deno, Bun, browsers, and edge functions, and a library-first design philosophy that allows library authors to add logging without imposing any burden on their users. When LogTape isn't configured, logging calls have virtually no performance impact, making it the only truly unobtrusive logging solution available.
For a comprehensive overview of LogTape's capabilities and philosophy, see our introduction guide.
We're excited to announce LogTape 1.0.0, marking a significant milestone in the library's development. This release represents our commitment to API stability and long-term support. The 1.0.0 designation signals that LogTape's core APIs are now stable and ready for production use, with any future breaking changes following semantic versioning principles.
This milestone builds upon months of refinement, community feedback, and real-world usage, establishing LogTape as a mature and reliable logging solution for JavaScript applications and libraries.
LogTape 1.0.0 introduces several performance-oriented features designed for high-throughput production environments. The new non-blocking sink option allows console, stream, and file sinks to buffer log records and flush them asynchronously, preventing logging operations from blocking your application's main thread.
import { configure, getConsoleSink } from "@logtape/logtape";
await configure({
sinks: {
console: getConsoleSink({
nonBlocking: {
bufferSize: 1000,
flushInterval: 50
}
})
},
// ...
});
The new fromAsyncSink() function provides a clean way to integrate asynchronous logging operations while maintaining LogTape's synchronous sink interface. This enables scenarios like sending logs to remote servers or databases without blocking your application.
import { fromAsyncSink } from "@logtape/logtape";
const webhookSink = fromAsyncSink(async (record) => {
await fetch("https://logs.example.com", {
method: "POST",
body: JSON.stringify(record)
});
});
For file operations specifically, the new getStreamFileSink() function in the @logtape/file package leverages Node.js PassThrough streams to deliver optimal I/O performance with automatic backpressure management.
This release significantly expands LogTape's integration capabilities with two major new sink packages. The @logtape/cloudwatch-logs package enables direct integration with AWS CloudWatch Logs, featuring intelligent batching, exponential backoff retry strategies, and support for structured logging through JSON Lines formatting.
import { getCloudWatchLogsSink } from "@logtape/cloudwatch-logs";
const sink = getCloudWatchLogsSink({
logGroupName: "/aws/lambda/my-function",
logStreamName: "my-stream",
region: "us-east-1"
});
The @logtape/windows-eventlog package brings native Windows Event Log support with cross-runtime compatibility across Deno, Node.js, and Bun. This integration uses runtime-optimized FFI implementations for maximum performance while maintaining proper error handling and resource cleanup.
The new @logtape/pretty package transforms console logging into a visually appealing experience designed specifically for local development. Inspired by Signale, it features colorful emojis for each log level, smart category truncation that preserves important context, and perfect column alignment that makes logs easy to scan.

import { configure, getConsoleSink } from "@logtape/logtape";
import { prettyFormatter } from "@logtape/pretty";
await configure({
sinks: {
console: getConsoleSink({ formatter: prettyFormatter })
},
// ...
});
As shown above, the pretty formatter supports true color terminals with rich color schemes, configurable icons, and intelligent word wrapping that maintains visual consistency even for long messages.
Perhaps most significantly, LogTape 1.0.0 introduces adapter packages that bridge the gap between LogTape's library-friendly design and existing logging infrastructure. The @logtape/adaptor-winston and @logtape/adaptor-pino packages allow applications using these established logging libraries to seamlessly integrate LogTape-enabled libraries without changing their existing setup.
// Quick setup with winston
import "@logtape/adaptor-winston/install";
// Or with custom configuration
import { install } from "@logtape/adaptor-winston";
import winston from "winston";
const logger = winston.createLogger({/* your config */});
install(logger);
These adapters preserve LogTape's structured logging capabilities while routing everything through your preferred logging system, making adoption of LogTape-enabled libraries frictionless for existing applications.
This release includes several quality-of-life improvements for developers working with LogTape. The new getLogLevels() function provides programmatic access to all available log levels, while the LogMethod type offers better type inference for logging methods.
Browser compatibility has been improved, particularly for the @logtape/otel package, which previously had issues in browser environments due to Node.js-specific imports. The package now works seamlessly across all JavaScript runtimes without throwing module resolution errors.
LogTape 1.0.0 includes one notable breaking change: the removal of the deprecated LoggerConfig.level property. This property was deprecated in version 0.8.0 in favor of the more descriptive LoggerConfig.lowestLevel property.
If your configuration still uses the old property, simply rename it:
// Before (deprecated)
{ category: ["app"], level: "info", sinks: ["console"] }
// After
{ category: ["app"], lowestLevel: "info", sinks: ["console"] }
For more complex filtering requirements, consider using the LoggerConfig.filters option instead, which provides more flexibility and supports inheritance from parent loggers.
LogTape 1.0.0 represents the culmination of a comprehensive package ecosystem, now consisting of 11 specialized packages that address different aspects of logging infrastructure. This modular approach allows you to install only the packages you need, keeping your dependency footprint minimal while accessing powerful logging capabilities when required.
| Package | JSR | npm | Description |
|---|---|---|---|
| @logtape/logtape | JSR | npm | Core logging functionality |
| @logtape/adaptor-pino | JSR | npm | Pino adapter |
| @logtape/adaptor-winston | JSR | npm | winston adapter |
| @logtape/cloudwatch-logs | JSR | npm | AWS CloudWatch Logs sink |
| @logtape/file | JSR | npm | File sinks |
| @logtape/otel | JSR | npm | OpenTelemetry sink |
| @logtape/pretty | JSR | npm | Beautiful text formatter |
| @logtape/redaction | JSR | npm | Data redaction |
| @logtape/sentry | JSR | npm | Sentry sink |
| @logtape/syslog | JSR | npm | Syslog sink |
| @logtape/windows-eventlog | JSR | npm | Windows Event Log sink |
Whether you're new to LogTape or upgrading from a previous version, getting started with 1.0.0 is straightforward. For new projects, begin with a simple configuration and gradually add the packages and features you need:
import { configure, getConsoleSink } from "@logtape/logtape";
await configure({
sinks: { console: getConsoleSink() },
loggers: [
{ category: "my-app", lowestLevel: "info", sinks: ["console"] }
]
});
Existing applications using winston or Pino can immediately benefit from LogTape-enabled libraries by installing the appropriate adapter. For comprehensive migration guidance and detailed feature documentation, visit our documentation site.
The 1.0.0 release represents not just a version number, but a commitment to the stability and maturity that production applications require. We're excited to see what you'll build with LogTape.
@hongminhee@hackers.pub
LogTape is a logging library designed specifically for the modern JavaScript ecosystem. It stands out with its zero-dependency architecture, universal runtime support across Node.js, Deno, Bun, browsers, and edge functions, and a library-first design philosophy that allows library authors to add logging without imposing any burden on their users. When LogTape isn't configured, logging calls have virtually no performance impact, making it the only truly unobtrusive logging solution available.
For a comprehensive overview of LogTape's capabilities and philosophy, see our introduction guide.
We're excited to announce LogTape 1.0.0, marking a significant milestone in the library's development. This release represents our commitment to API stability and long-term support. The 1.0.0 designation signals that LogTape's core APIs are now stable and ready for production use, with any future breaking changes following semantic versioning principles.
This milestone builds upon months of refinement, community feedback, and real-world usage, establishing LogTape as a mature and reliable logging solution for JavaScript applications and libraries.
LogTape 1.0.0 introduces several performance-oriented features designed for high-throughput production environments. The new non-blocking sink option allows console, stream, and file sinks to buffer log records and flush them asynchronously, preventing logging operations from blocking your application's main thread.
import { configure, getConsoleSink } from "@logtape/logtape";
await configure({
sinks: {
console: getConsoleSink({
nonBlocking: {
bufferSize: 1000,
flushInterval: 50
}
})
},
// ...
});
The new fromAsyncSink() function provides a clean way to integrate asynchronous logging operations while maintaining LogTape's synchronous sink interface. This enables scenarios like sending logs to remote servers or databases without blocking your application.
import { fromAsyncSink } from "@logtape/logtape";
const webhookSink = fromAsyncSink(async (record) => {
await fetch("https://logs.example.com", {
method: "POST",
body: JSON.stringify(record)
});
});
For file operations specifically, the new getStreamFileSink() function in the @logtape/file package leverages Node.js PassThrough streams to deliver optimal I/O performance with automatic backpressure management.
This release significantly expands LogTape's integration capabilities with two major new sink packages. The @logtape/cloudwatch-logs package enables direct integration with AWS CloudWatch Logs, featuring intelligent batching, exponential backoff retry strategies, and support for structured logging through JSON Lines formatting.
import { getCloudWatchLogsSink } from "@logtape/cloudwatch-logs";
const sink = getCloudWatchLogsSink({
logGroupName: "/aws/lambda/my-function",
logStreamName: "my-stream",
region: "us-east-1"
});
The @logtape/windows-eventlog package brings native Windows Event Log support with cross-runtime compatibility across Deno, Node.js, and Bun. This integration uses runtime-optimized FFI implementations for maximum performance while maintaining proper error handling and resource cleanup.
The new @logtape/pretty package transforms console logging into a visually appealing experience designed specifically for local development. Inspired by Signale, it features colorful emojis for each log level, smart category truncation that preserves important context, and perfect column alignment that makes logs easy to scan.

import { configure, getConsoleSink } from "@logtape/logtape";
import { prettyFormatter } from "@logtape/pretty";
await configure({
sinks: {
console: getConsoleSink({ formatter: prettyFormatter })
},
// ...
});
As shown above, the pretty formatter supports true color terminals with rich color schemes, configurable icons, and intelligent word wrapping that maintains visual consistency even for long messages.
Perhaps most significantly, LogTape 1.0.0 introduces adapter packages that bridge the gap between LogTape's library-friendly design and existing logging infrastructure. The @logtape/adaptor-winston and @logtape/adaptor-pino packages allow applications using these established logging libraries to seamlessly integrate LogTape-enabled libraries without changing their existing setup.
// Quick setup with winston
import "@logtape/adaptor-winston/install";
// Or with custom configuration
import { install } from "@logtape/adaptor-winston";
import winston from "winston";
const logger = winston.createLogger({/* your config */});
install(logger);
These adapters preserve LogTape's structured logging capabilities while routing everything through your preferred logging system, making adoption of LogTape-enabled libraries frictionless for existing applications.
This release includes several quality-of-life improvements for developers working with LogTape. The new getLogLevels() function provides programmatic access to all available log levels, while the LogMethod type offers better type inference for logging methods.
Browser compatibility has been improved, particularly for the @logtape/otel package, which previously had issues in browser environments due to Node.js-specific imports. The package now works seamlessly across all JavaScript runtimes without throwing module resolution errors.
LogTape 1.0.0 includes one notable breaking change: the removal of the deprecated LoggerConfig.level property. This property was deprecated in version 0.8.0 in favor of the more descriptive LoggerConfig.lowestLevel property.
If your configuration still uses the old property, simply rename it:
// Before (deprecated)
{ category: ["app"], level: "info", sinks: ["console"] }
// After
{ category: ["app"], lowestLevel: "info", sinks: ["console"] }
For more complex filtering requirements, consider using the LoggerConfig.filters option instead, which provides more flexibility and supports inheritance from parent loggers.
LogTape 1.0.0 represents the culmination of a comprehensive package ecosystem, now consisting of 11 specialized packages that address different aspects of logging infrastructure. This modular approach allows you to install only the packages you need, keeping your dependency footprint minimal while accessing powerful logging capabilities when required.
| Package | JSR | npm | Description |
|---|---|---|---|
| @logtape/logtape | JSR | npm | Core logging functionality |
| @logtape/adaptor-pino | JSR | npm | Pino adapter |
| @logtape/adaptor-winston | JSR | npm | winston adapter |
| @logtape/cloudwatch-logs | JSR | npm | AWS CloudWatch Logs sink |
| @logtape/file | JSR | npm | File sinks |
| @logtape/otel | JSR | npm | OpenTelemetry sink |
| @logtape/pretty | JSR | npm | Beautiful text formatter |
| @logtape/redaction | JSR | npm | Data redaction |
| @logtape/sentry | JSR | npm | Sentry sink |
| @logtape/syslog | JSR | npm | Syslog sink |
| @logtape/windows-eventlog | JSR | npm | Windows Event Log sink |
Whether you're new to LogTape or upgrading from a previous version, getting started with 1.0.0 is straightforward. For new projects, begin with a simple configuration and gradually add the packages and features you need:
import { configure, getConsoleSink } from "@logtape/logtape";
await configure({
sinks: { console: getConsoleSink() },
loggers: [
{ category: "my-app", lowestLevel: "info", sinks: ["console"] }
]
});
Existing applications using winston or Pino can immediately benefit from LogTape-enabled libraries by installing the appropriate adapter. For comprehensive migration guidance and detailed feature documentation, visit our documentation site.
The 1.0.0 release represents not just a version number, but a commitment to the stability and maturity that production applications require. We're excited to see what you'll build with LogTape.
@hongminhee@hackers.pub
LogTape is a logging library designed specifically for the modern JavaScript ecosystem. It stands out with its zero-dependency architecture, universal runtime support across Node.js, Deno, Bun, browsers, and edge functions, and a library-first design philosophy that allows library authors to add logging without imposing any burden on their users. When LogTape isn't configured, logging calls have virtually no performance impact, making it the only truly unobtrusive logging solution available.
For a comprehensive overview of LogTape's capabilities and philosophy, see our introduction guide.
We're excited to announce LogTape 1.0.0, marking a significant milestone in the library's development. This release represents our commitment to API stability and long-term support. The 1.0.0 designation signals that LogTape's core APIs are now stable and ready for production use, with any future breaking changes following semantic versioning principles.
This milestone builds upon months of refinement, community feedback, and real-world usage, establishing LogTape as a mature and reliable logging solution for JavaScript applications and libraries.
LogTape 1.0.0 introduces several performance-oriented features designed for high-throughput production environments. The new non-blocking sink option allows console, stream, and file sinks to buffer log records and flush them asynchronously, preventing logging operations from blocking your application's main thread.
import { configure, getConsoleSink } from "@logtape/logtape";
await configure({
sinks: {
console: getConsoleSink({
nonBlocking: {
bufferSize: 1000,
flushInterval: 50
}
})
},
// ...
});
The new fromAsyncSink() function provides a clean way to integrate asynchronous logging operations while maintaining LogTape's synchronous sink interface. This enables scenarios like sending logs to remote servers or databases without blocking your application.
import { fromAsyncSink } from "@logtape/logtape";
const webhookSink = fromAsyncSink(async (record) => {
await fetch("https://logs.example.com", {
method: "POST",
body: JSON.stringify(record)
});
});
For file operations specifically, the new getStreamFileSink() function in the @logtape/file package leverages Node.js PassThrough streams to deliver optimal I/O performance with automatic backpressure management.
This release significantly expands LogTape's integration capabilities with two major new sink packages. The @logtape/cloudwatch-logs package enables direct integration with AWS CloudWatch Logs, featuring intelligent batching, exponential backoff retry strategies, and support for structured logging through JSON Lines formatting.
import { getCloudWatchLogsSink } from "@logtape/cloudwatch-logs";
const sink = getCloudWatchLogsSink({
logGroupName: "/aws/lambda/my-function",
logStreamName: "my-stream",
region: "us-east-1"
});
The @logtape/windows-eventlog package brings native Windows Event Log support with cross-runtime compatibility across Deno, Node.js, and Bun. This integration uses runtime-optimized FFI implementations for maximum performance while maintaining proper error handling and resource cleanup.
The new @logtape/pretty package transforms console logging into a visually appealing experience designed specifically for local development. Inspired by Signale, it features colorful emojis for each log level, smart category truncation that preserves important context, and perfect column alignment that makes logs easy to scan.

import { configure, getConsoleSink } from "@logtape/logtape";
import { prettyFormatter } from "@logtape/pretty";
await configure({
sinks: {
console: getConsoleSink({ formatter: prettyFormatter })
},
// ...
});
As shown above, the pretty formatter supports true color terminals with rich color schemes, configurable icons, and intelligent word wrapping that maintains visual consistency even for long messages.
Perhaps most significantly, LogTape 1.0.0 introduces adapter packages that bridge the gap between LogTape's library-friendly design and existing logging infrastructure. The @logtape/adaptor-winston and @logtape/adaptor-pino packages allow applications using these established logging libraries to seamlessly integrate LogTape-enabled libraries without changing their existing setup.
// Quick setup with winston
import "@logtape/adaptor-winston/install";
// Or with custom configuration
import { install } from "@logtape/adaptor-winston";
import winston from "winston";
const logger = winston.createLogger({/* your config */});
install(logger);
These adapters preserve LogTape's structured logging capabilities while routing everything through your preferred logging system, making adoption of LogTape-enabled libraries frictionless for existing applications.
This release includes several quality-of-life improvements for developers working with LogTape. The new getLogLevels() function provides programmatic access to all available log levels, while the LogMethod type offers better type inference for logging methods.
Browser compatibility has been improved, particularly for the @logtape/otel package, which previously had issues in browser environments due to Node.js-specific imports. The package now works seamlessly across all JavaScript runtimes without throwing module resolution errors.
LogTape 1.0.0 includes one notable breaking change: the removal of the deprecated LoggerConfig.level property. This property was deprecated in version 0.8.0 in favor of the more descriptive LoggerConfig.lowestLevel property.
If your configuration still uses the old property, simply rename it:
// Before (deprecated)
{ category: ["app"], level: "info", sinks: ["console"] }
// After
{ category: ["app"], lowestLevel: "info", sinks: ["console"] }
For more complex filtering requirements, consider using the LoggerConfig.filters option instead, which provides more flexibility and supports inheritance from parent loggers.
LogTape 1.0.0 represents the culmination of a comprehensive package ecosystem, now consisting of 11 specialized packages that address different aspects of logging infrastructure. This modular approach allows you to install only the packages you need, keeping your dependency footprint minimal while accessing powerful logging capabilities when required.
| Package | JSR | npm | Description |
|---|---|---|---|
| @logtape/logtape | JSR | npm | Core logging functionality |
| @logtape/adaptor-pino | JSR | npm | Pino adapter |
| @logtape/adaptor-winston | JSR | npm | winston adapter |
| @logtape/cloudwatch-logs | JSR | npm | AWS CloudWatch Logs sink |
| @logtape/file | JSR | npm | File sinks |
| @logtape/otel | JSR | npm | OpenTelemetry sink |
| @logtape/pretty | JSR | npm | Beautiful text formatter |
| @logtape/redaction | JSR | npm | Data redaction |
| @logtape/sentry | JSR | npm | Sentry sink |
| @logtape/syslog | JSR | npm | Syslog sink |
| @logtape/windows-eventlog | JSR | npm | Windows Event Log sink |
Whether you're new to LogTape or upgrading from a previous version, getting started with 1.0.0 is straightforward. For new projects, begin with a simple configuration and gradually add the packages and features you need:
import { configure, getConsoleSink } from "@logtape/logtape";
await configure({
sinks: { console: getConsoleSink() },
loggers: [
{ category: "my-app", lowestLevel: "info", sinks: ["console"] }
]
});
Existing applications using winston or Pino can immediately benefit from LogTape-enabled libraries by installing the appropriate adapter. For comprehensive migration guidance and detailed feature documentation, visit our documentation site.
The 1.0.0 release represents not just a version number, but a commitment to the stability and maturity that production applications require. We're excited to see what you'll build with LogTape.
@hongminhee@hackers.pub
LogTape is a logging library designed specifically for the modern JavaScript ecosystem. It stands out with its zero-dependency architecture, universal runtime support across Node.js, Deno, Bun, browsers, and edge functions, and a library-first design philosophy that allows library authors to add logging without imposing any burden on their users. When LogTape isn't configured, logging calls have virtually no performance impact, making it the only truly unobtrusive logging solution available.
For a comprehensive overview of LogTape's capabilities and philosophy, see our introduction guide.
We're excited to announce LogTape 1.0.0, marking a significant milestone in the library's development. This release represents our commitment to API stability and long-term support. The 1.0.0 designation signals that LogTape's core APIs are now stable and ready for production use, with any future breaking changes following semantic versioning principles.
This milestone builds upon months of refinement, community feedback, and real-world usage, establishing LogTape as a mature and reliable logging solution for JavaScript applications and libraries.
LogTape 1.0.0 introduces several performance-oriented features designed for high-throughput production environments. The new non-blocking sink option allows console, stream, and file sinks to buffer log records and flush them asynchronously, preventing logging operations from blocking your application's main thread.
import { configure, getConsoleSink } from "@logtape/logtape";
await configure({
sinks: {
console: getConsoleSink({
nonBlocking: {
bufferSize: 1000,
flushInterval: 50
}
})
},
// ...
});
The new fromAsyncSink() function provides a clean way to integrate asynchronous logging operations while maintaining LogTape's synchronous sink interface. This enables scenarios like sending logs to remote servers or databases without blocking your application.
import { fromAsyncSink } from "@logtape/logtape";
const webhookSink = fromAsyncSink(async (record) => {
await fetch("https://logs.example.com", {
method: "POST",
body: JSON.stringify(record)
});
});
For file operations specifically, the new getStreamFileSink() function in the @logtape/file package leverages Node.js PassThrough streams to deliver optimal I/O performance with automatic backpressure management.
This release significantly expands LogTape's integration capabilities with two major new sink packages. The @logtape/cloudwatch-logs package enables direct integration with AWS CloudWatch Logs, featuring intelligent batching, exponential backoff retry strategies, and support for structured logging through JSON Lines formatting.
import { getCloudWatchLogsSink } from "@logtape/cloudwatch-logs";
const sink = getCloudWatchLogsSink({
logGroupName: "/aws/lambda/my-function",
logStreamName: "my-stream",
region: "us-east-1"
});
The @logtape/windows-eventlog package brings native Windows Event Log support with cross-runtime compatibility across Deno, Node.js, and Bun. This integration uses runtime-optimized FFI implementations for maximum performance while maintaining proper error handling and resource cleanup.
The new @logtape/pretty package transforms console logging into a visually appealing experience designed specifically for local development. Inspired by Signale, it features colorful emojis for each log level, smart category truncation that preserves important context, and perfect column alignment that makes logs easy to scan.

import { configure, getConsoleSink } from "@logtape/logtape";
import { prettyFormatter } from "@logtape/pretty";
await configure({
sinks: {
console: getConsoleSink({ formatter: prettyFormatter })
},
// ...
});
As shown above, the pretty formatter supports true color terminals with rich color schemes, configurable icons, and intelligent word wrapping that maintains visual consistency even for long messages.
Perhaps most significantly, LogTape 1.0.0 introduces adapter packages that bridge the gap between LogTape's library-friendly design and existing logging infrastructure. The @logtape/adaptor-winston and @logtape/adaptor-pino packages allow applications using these established logging libraries to seamlessly integrate LogTape-enabled libraries without changing their existing setup.
// Quick setup with winston
import "@logtape/adaptor-winston/install";
// Or with custom configuration
import { install } from "@logtape/adaptor-winston";
import winston from "winston";
const logger = winston.createLogger({/* your config */});
install(logger);
These adapters preserve LogTape's structured logging capabilities while routing everything through your preferred logging system, making adoption of LogTape-enabled libraries frictionless for existing applications.
This release includes several quality-of-life improvements for developers working with LogTape. The new getLogLevels() function provides programmatic access to all available log levels, while the LogMethod type offers better type inference for logging methods.
Browser compatibility has been improved, particularly for the @logtape/otel package, which previously had issues in browser environments due to Node.js-specific imports. The package now works seamlessly across all JavaScript runtimes without throwing module resolution errors.
LogTape 1.0.0 includes one notable breaking change: the removal of the deprecated LoggerConfig.level property. This property was deprecated in version 0.8.0 in favor of the more descriptive LoggerConfig.lowestLevel property.
If your configuration still uses the old property, simply rename it:
// Before (deprecated)
{ category: ["app"], level: "info", sinks: ["console"] }
// After
{ category: ["app"], lowestLevel: "info", sinks: ["console"] }
For more complex filtering requirements, consider using the LoggerConfig.filters option instead, which provides more flexibility and supports inheritance from parent loggers.
LogTape 1.0.0 represents the culmination of a comprehensive package ecosystem, now consisting of 11 specialized packages that address different aspects of logging infrastructure. This modular approach allows you to install only the packages you need, keeping your dependency footprint minimal while accessing powerful logging capabilities when required.
| Package | JSR | npm | Description |
|---|---|---|---|
| @logtape/logtape | JSR | npm | Core logging functionality |
| @logtape/adaptor-pino | JSR | npm | Pino adapter |
| @logtape/adaptor-winston | JSR | npm | winston adapter |
| @logtape/cloudwatch-logs | JSR | npm | AWS CloudWatch Logs sink |
| @logtape/file | JSR | npm | File sinks |
| @logtape/otel | JSR | npm | OpenTelemetry sink |
| @logtape/pretty | JSR | npm | Beautiful text formatter |
| @logtape/redaction | JSR | npm | Data redaction |
| @logtape/sentry | JSR | npm | Sentry sink |
| @logtape/syslog | JSR | npm | Syslog sink |
| @logtape/windows-eventlog | JSR | npm | Windows Event Log sink |
Whether you're new to LogTape or upgrading from a previous version, getting started with 1.0.0 is straightforward. For new projects, begin with a simple configuration and gradually add the packages and features you need:
import { configure, getConsoleSink } from "@logtape/logtape";
await configure({
sinks: { console: getConsoleSink() },
loggers: [
{ category: "my-app", lowestLevel: "info", sinks: ["console"] }
]
});
Existing applications using winston or Pino can immediately benefit from LogTape-enabled libraries by installing the appropriate adapter. For comprehensive migration guidance and detailed feature documentation, visit our documentation site.
The 1.0.0 release represents not just a version number, but a commitment to the stability and maturity that production applications require. We're excited to see what you'll build with LogTape.
@hongminhee@hackers.pub
LogTape is a logging library designed specifically for the modern JavaScript ecosystem. It stands out with its zero-dependency architecture, universal runtime support across Node.js, Deno, Bun, browsers, and edge functions, and a library-first design philosophy that allows library authors to add logging without imposing any burden on their users. When LogTape isn't configured, logging calls have virtually no performance impact, making it the only truly unobtrusive logging solution available.
For a comprehensive overview of LogTape's capabilities and philosophy, see our introduction guide.
We're excited to announce LogTape 1.0.0, marking a significant milestone in the library's development. This release represents our commitment to API stability and long-term support. The 1.0.0 designation signals that LogTape's core APIs are now stable and ready for production use, with any future breaking changes following semantic versioning principles.
This milestone builds upon months of refinement, community feedback, and real-world usage, establishing LogTape as a mature and reliable logging solution for JavaScript applications and libraries.
LogTape 1.0.0 introduces several performance-oriented features designed for high-throughput production environments. The new non-blocking sink option allows console, stream, and file sinks to buffer log records and flush them asynchronously, preventing logging operations from blocking your application's main thread.
import { configure, getConsoleSink } from "@logtape/logtape";
await configure({
sinks: {
console: getConsoleSink({
nonBlocking: {
bufferSize: 1000,
flushInterval: 50
}
})
},
// ...
});
The new fromAsyncSink() function provides a clean way to integrate asynchronous logging operations while maintaining LogTape's synchronous sink interface. This enables scenarios like sending logs to remote servers or databases without blocking your application.
import { fromAsyncSink } from "@logtape/logtape";
const webhookSink = fromAsyncSink(async (record) => {
await fetch("https://logs.example.com", {
method: "POST",
body: JSON.stringify(record)
});
});
For file operations specifically, the new getStreamFileSink() function in the @logtape/file package leverages Node.js PassThrough streams to deliver optimal I/O performance with automatic backpressure management.
This release significantly expands LogTape's integration capabilities with two major new sink packages. The @logtape/cloudwatch-logs package enables direct integration with AWS CloudWatch Logs, featuring intelligent batching, exponential backoff retry strategies, and support for structured logging through JSON Lines formatting.
import { getCloudWatchLogsSink } from "@logtape/cloudwatch-logs";
const sink = getCloudWatchLogsSink({
logGroupName: "/aws/lambda/my-function",
logStreamName: "my-stream",
region: "us-east-1"
});
The @logtape/windows-eventlog package brings native Windows Event Log support with cross-runtime compatibility across Deno, Node.js, and Bun. This integration uses runtime-optimized FFI implementations for maximum performance while maintaining proper error handling and resource cleanup.
The new @logtape/pretty package transforms console logging into a visually appealing experience designed specifically for local development. Inspired by Signale, it features colorful emojis for each log level, smart category truncation that preserves important context, and perfect column alignment that makes logs easy to scan.

import { configure, getConsoleSink } from "@logtape/logtape";
import { prettyFormatter } from "@logtape/pretty";
await configure({
sinks: {
console: getConsoleSink({ formatter: prettyFormatter })
},
// ...
});
As shown above, the pretty formatter supports true color terminals with rich color schemes, configurable icons, and intelligent word wrapping that maintains visual consistency even for long messages.
Perhaps most significantly, LogTape 1.0.0 introduces adapter packages that bridge the gap between LogTape's library-friendly design and existing logging infrastructure. The @logtape/adaptor-winston and @logtape/adaptor-pino packages allow applications using these established logging libraries to seamlessly integrate LogTape-enabled libraries without changing their existing setup.
// Quick setup with winston
import "@logtape/adaptor-winston/install";
// Or with custom configuration
import { install } from "@logtape/adaptor-winston";
import winston from "winston";
const logger = winston.createLogger({/* your config */});
install(logger);
These adapters preserve LogTape's structured logging capabilities while routing everything through your preferred logging system, making adoption of LogTape-enabled libraries frictionless for existing applications.
This release includes several quality-of-life improvements for developers working with LogTape. The new getLogLevels() function provides programmatic access to all available log levels, while the LogMethod type offers better type inference for logging methods.
Browser compatibility has been improved, particularly for the @logtape/otel package, which previously had issues in browser environments due to Node.js-specific imports. The package now works seamlessly across all JavaScript runtimes without throwing module resolution errors.
LogTape 1.0.0 includes one notable breaking change: the removal of the deprecated LoggerConfig.level property. This property was deprecated in version 0.8.0 in favor of the more descriptive LoggerConfig.lowestLevel property.
If your configuration still uses the old property, simply rename it:
// Before (deprecated)
{ category: ["app"], level: "info", sinks: ["console"] }
// After
{ category: ["app"], lowestLevel: "info", sinks: ["console"] }
For more complex filtering requirements, consider using the LoggerConfig.filters option instead, which provides more flexibility and supports inheritance from parent loggers.
LogTape 1.0.0 represents the culmination of a comprehensive package ecosystem, now consisting of 11 specialized packages that address different aspects of logging infrastructure. This modular approach allows you to install only the packages you need, keeping your dependency footprint minimal while accessing powerful logging capabilities when required.
| Package | JSR | npm | Description |
|---|---|---|---|
| @logtape/logtape | JSR | npm | Core logging functionality |
| @logtape/adaptor-pino | JSR | npm | Pino adapter |
| @logtape/adaptor-winston | JSR | npm | winston adapter |
| @logtape/cloudwatch-logs | JSR | npm | AWS CloudWatch Logs sink |
| @logtape/file | JSR | npm | File sinks |
| @logtape/otel | JSR | npm | OpenTelemetry sink |
| @logtape/pretty | JSR | npm | Beautiful text formatter |
| @logtape/redaction | JSR | npm | Data redaction |
| @logtape/sentry | JSR | npm | Sentry sink |
| @logtape/syslog | JSR | npm | Syslog sink |
| @logtape/windows-eventlog | JSR | npm | Windows Event Log sink |
Whether you're new to LogTape or upgrading from a previous version, getting started with 1.0.0 is straightforward. For new projects, begin with a simple configuration and gradually add the packages and features you need:
import { configure, getConsoleSink } from "@logtape/logtape";
await configure({
sinks: { console: getConsoleSink() },
loggers: [
{ category: "my-app", lowestLevel: "info", sinks: ["console"] }
]
});
Existing applications using winston or Pino can immediately benefit from LogTape-enabled libraries by installing the appropriate adapter. For comprehensive migration guidance and detailed feature documentation, visit our documentation site.
The 1.0.0 release represents not just a version number, but a commitment to the stability and maturity that production applications require. We're excited to see what you'll build with LogTape.
@hongminhee@hackers.pub
LogTape is a logging library designed specifically for the modern JavaScript ecosystem. It stands out with its zero-dependency architecture, universal runtime support across Node.js, Deno, Bun, browsers, and edge functions, and a library-first design philosophy that allows library authors to add logging without imposing any burden on their users. When LogTape isn't configured, logging calls have virtually no performance impact, making it the only truly unobtrusive logging solution available.
For a comprehensive overview of LogTape's capabilities and philosophy, see our introduction guide.
We're excited to announce LogTape 1.0.0, marking a significant milestone in the library's development. This release represents our commitment to API stability and long-term support. The 1.0.0 designation signals that LogTape's core APIs are now stable and ready for production use, with any future breaking changes following semantic versioning principles.
This milestone builds upon months of refinement, community feedback, and real-world usage, establishing LogTape as a mature and reliable logging solution for JavaScript applications and libraries.
LogTape 1.0.0 introduces several performance-oriented features designed for high-throughput production environments. The new non-blocking sink option allows console, stream, and file sinks to buffer log records and flush them asynchronously, preventing logging operations from blocking your application's main thread.
import { configure, getConsoleSink } from "@logtape/logtape";
await configure({
sinks: {
console: getConsoleSink({
nonBlocking: {
bufferSize: 1000,
flushInterval: 50
}
})
},
// ...
});
The new fromAsyncSink() function provides a clean way to integrate asynchronous logging operations while maintaining LogTape's synchronous sink interface. This enables scenarios like sending logs to remote servers or databases without blocking your application.
import { fromAsyncSink } from "@logtape/logtape";
const webhookSink = fromAsyncSink(async (record) => {
await fetch("https://logs.example.com", {
method: "POST",
body: JSON.stringify(record)
});
});
For file operations specifically, the new getStreamFileSink() function in the @logtape/file package leverages Node.js PassThrough streams to deliver optimal I/O performance with automatic backpressure management.
This release significantly expands LogTape's integration capabilities with two major new sink packages. The @logtape/cloudwatch-logs package enables direct integration with AWS CloudWatch Logs, featuring intelligent batching, exponential backoff retry strategies, and support for structured logging through JSON Lines formatting.
import { getCloudWatchLogsSink } from "@logtape/cloudwatch-logs";
const sink = getCloudWatchLogsSink({
logGroupName: "/aws/lambda/my-function",
logStreamName: "my-stream",
region: "us-east-1"
});
The @logtape/windows-eventlog package brings native Windows Event Log support with cross-runtime compatibility across Deno, Node.js, and Bun. This integration uses runtime-optimized FFI implementations for maximum performance while maintaining proper error handling and resource cleanup.
The new @logtape/pretty package transforms console logging into a visually appealing experience designed specifically for local development. Inspired by Signale, it features colorful emojis for each log level, smart category truncation that preserves important context, and perfect column alignment that makes logs easy to scan.

import { configure, getConsoleSink } from "@logtape/logtape";
import { prettyFormatter } from "@logtape/pretty";
await configure({
sinks: {
console: getConsoleSink({ formatter: prettyFormatter })
},
// ...
});
As shown above, the pretty formatter supports true color terminals with rich color schemes, configurable icons, and intelligent word wrapping that maintains visual consistency even for long messages.
Perhaps most significantly, LogTape 1.0.0 introduces adapter packages that bridge the gap between LogTape's library-friendly design and existing logging infrastructure. The @logtape/adaptor-winston and @logtape/adaptor-pino packages allow applications using these established logging libraries to seamlessly integrate LogTape-enabled libraries without changing their existing setup.
// Quick setup with winston
import "@logtape/adaptor-winston/install";
// Or with custom configuration
import { install } from "@logtape/adaptor-winston";
import winston from "winston";
const logger = winston.createLogger({/* your config */});
install(logger);
These adapters preserve LogTape's structured logging capabilities while routing everything through your preferred logging system, making adoption of LogTape-enabled libraries frictionless for existing applications.
This release includes several quality-of-life improvements for developers working with LogTape. The new getLogLevels() function provides programmatic access to all available log levels, while the LogMethod type offers better type inference for logging methods.
Browser compatibility has been improved, particularly for the @logtape/otel package, which previously had issues in browser environments due to Node.js-specific imports. The package now works seamlessly across all JavaScript runtimes without throwing module resolution errors.
LogTape 1.0.0 includes one notable breaking change: the removal of the deprecated LoggerConfig.level property. This property was deprecated in version 0.8.0 in favor of the more descriptive LoggerConfig.lowestLevel property.
If your configuration still uses the old property, simply rename it:
// Before (deprecated)
{ category: ["app"], level: "info", sinks: ["console"] }
// After
{ category: ["app"], lowestLevel: "info", sinks: ["console"] }
For more complex filtering requirements, consider using the LoggerConfig.filters option instead, which provides more flexibility and supports inheritance from parent loggers.
LogTape 1.0.0 represents the culmination of a comprehensive package ecosystem, now consisting of 11 specialized packages that address different aspects of logging infrastructure. This modular approach allows you to install only the packages you need, keeping your dependency footprint minimal while accessing powerful logging capabilities when required.
| Package | JSR | npm | Description |
|---|---|---|---|
| @logtape/logtape | JSR | npm | Core logging functionality |
| @logtape/adaptor-pino | JSR | npm | Pino adapter |
| @logtape/adaptor-winston | JSR | npm | winston adapter |
| @logtape/cloudwatch-logs | JSR | npm | AWS CloudWatch Logs sink |
| @logtape/file | JSR | npm | File sinks |
| @logtape/otel | JSR | npm | OpenTelemetry sink |
| @logtape/pretty | JSR | npm | Beautiful text formatter |
| @logtape/redaction | JSR | npm | Data redaction |
| @logtape/sentry | JSR | npm | Sentry sink |
| @logtape/syslog | JSR | npm | Syslog sink |
| @logtape/windows-eventlog | JSR | npm | Windows Event Log sink |
Whether you're new to LogTape or upgrading from a previous version, getting started with 1.0.0 is straightforward. For new projects, begin with a simple configuration and gradually add the packages and features you need:
import { configure, getConsoleSink } from "@logtape/logtape";
await configure({
sinks: { console: getConsoleSink() },
loggers: [
{ category: "my-app", lowestLevel: "info", sinks: ["console"] }
]
});
Existing applications using winston or Pino can immediately benefit from LogTape-enabled libraries by installing the appropriate adapter. For comprehensive migration guidance and detailed feature documentation, visit our documentation site.
The 1.0.0 release represents not just a version number, but a commitment to the stability and maturity that production applications require. We're excited to see what you'll build with LogTape.
@hugovk@mastodon.social · Reply to Hugo van Kemenade's post
Just released: Python 3.14.0 beta 3! 🚀🐍
🥧 All the good stuff of b2 but also:
🥧 Free-threaded Python is officially supported! (PEP 779)
🥧 Subinterpreters in the stdlib! (PEP 734)
Do you maintain a Python package? Please test 3.14.
If you find a bug now, we can fix it before October, which helps everyone. And you might find some places in your code to update as well, which helps you.
https://discuss.python.org/t/python-3-14-0-beta-3-is-here/95843?u=hugovk
#Python #CPython #Python314 #release #PEP779 #PEP734 #FreeThreaded #subinterpreters
@henryiii@fosstodon.org
cibuildwheel 3.0 is out! New support for Python 3.14 (and 3.14t) betas, GraalPy, and iOS! New defaults, new config options, beautiful docs updates, and more! https://iscinumpy.dev/post/cibuildwheel-3-0-0/ #python #release
@henryiii@fosstodon.org
cibuildwheel 3.0 is out! New support for Python 3.14 (and 3.14t) betas, GraalPy, and iOS! New defaults, new config options, beautiful docs updates, and more! https://iscinumpy.dev/post/cibuildwheel-3-0-0/ #python #release
@lobsters@mastodon.social
@lobsters@mastodon.social
@kubikpixel@chaos.social
"2025-05: GNU Taler v1.0 released – We are happy to announce the release of GNU Taler v1.0."
This provide a payment system that makes privacy-friendly online transactions fast and easy.
🥳 https://www.taler.net/en/news/2025-01.html
#gnutaler #Version1 #v1 #gnu #taler #switzerland #release #alternative #privacy #friendly #fastandeasy
@pandoc@fosstodon.org
Patch release: pandoc 3.7.0.2.
“This release fixes some regressions in grid table rendering introduced in 3.7. There are a few other nice improvements as well; see the changelog for details.”
Thanks to all who contributed!
https://github.com/jgm/pandoc/releases/tag/3.7.0.2
@hugovk@mastodon.social · Reply to Hugo van Kemenade's post
Just released: Python 3.14.0 beta 2! 🚀🐍
🥧 Deferred type annotation evaluation!
🥧 T-strings!
🥧 Zstandard!
🥧 Syntax highlighting in the REPL!
🥧 Colour in unittest, argparse, json and calendar CLIs!
🥧 UUID v6-8!
🥧 And much more!
Do you maintain a Python package? Please test 3.14. If you find a bug now, we can fix it before October, which helps everyone. And you might find some places in your code to update as well, which helps you.
https://discuss.python.org/t/python-3-14-0-beta-2-is-here/93396?u=hugovk
@newsmast@newsmast.social
Exciting update 👉 We're inviting a handful of select users to https://Channel.org now 🎉
https://Channel.org aims to bring together knowledge across the open social web, whilst offering organisations the ability to build a social home instead of renting from Big Tech dictators.
If you'd like to join the beta waitlist, let us know at support@channel.org
#SocialWeb #Release #FediDev #Fediverse #SocialMedia #Mastodon #Channelorg #Newsmast
@newsmast@newsmast.social
Exciting update 👉 We're inviting a handful of select users to https://Channel.org now 🎉
https://Channel.org aims to bring together knowledge across the open social web, whilst offering organisations the ability to build a social home instead of renting from Big Tech dictators.
If you'd like to join the beta waitlist, let us know at support@channel.org
#SocialWeb #Release #FediDev #Fediverse #SocialMedia #Mastodon #Channelorg #Newsmast
@hongminhee@hackers.pub
We're pleased to announce the release of LogTape 0.10.0 today. This version introduces several significant enhancements to improve security, flexibility, and usability.
What is LogTape?
LogTape is a simple, zero-dependency logging library for JavaScript with support for multiple runtimes (Node.js, Deno, Bun, browsers, and edge functions). It features structured logging, hierarchical categories, template literals, and is designed to be used in both applications and libraries.
The most notable addition in this release is the new @logtape/redaction package, designed to help protect sensitive information in your logs. This package provides two complementary approaches to redaction:
The package includes several built-in patterns for common sensitive data types:
Both approaches can be used independently or combined for maximum security. Comprehensive documentation for these features is available in the Data redaction section of the manual.
Text formatters now support omitting timestamps entirely from formatted messages. The TextFormatterOptions.timestamp option has been extended to include "none" and "disabled" values, giving you more control over log output format.
A new FileSinkOptions.lazy option has been added, allowing file sinks to open files only when actually needed, which can improve resource utilization.
The configure() and configureSync() functions now check for duplicate logger configurations with the same category and throw a ConfigError when detected. This prevents unintended overriding of logger configurations.
We'd like to thank our external contributors who helped make this release possible:
We encourage all users to upgrade to this version to take advantage of these improvements. As always, we welcome your feedback and contributions.
For more details on these changes, see the full changelog.
@hongminhee@hackers.pub
We're pleased to announce the release of LogTape 0.10.0 today. This version introduces several significant enhancements to improve security, flexibility, and usability.
What is LogTape?
LogTape is a simple, zero-dependency logging library for JavaScript with support for multiple runtimes (Node.js, Deno, Bun, browsers, and edge functions). It features structured logging, hierarchical categories, template literals, and is designed to be used in both applications and libraries.
The most notable addition in this release is the new @logtape/redaction package, designed to help protect sensitive information in your logs. This package provides two complementary approaches to redaction:
The package includes several built-in patterns for common sensitive data types:
Both approaches can be used independently or combined for maximum security. Comprehensive documentation for these features is available in the Data redaction section of the manual.
Text formatters now support omitting timestamps entirely from formatted messages. The TextFormatterOptions.timestamp option has been extended to include "none" and "disabled" values, giving you more control over log output format.
A new FileSinkOptions.lazy option has been added, allowing file sinks to open files only when actually needed, which can improve resource utilization.
The configure() and configureSync() functions now check for duplicate logger configurations with the same category and throw a ConfigError when detected. This prevents unintended overriding of logger configurations.
We'd like to thank our external contributors who helped make this release possible:
We encourage all users to upgrade to this version to take advantage of these improvements. As always, we welcome your feedback and contributions.
For more details on these changes, see the full changelog.
@hongminhee@hackers.pub
We're pleased to announce the release of LogTape 0.10.0 today. This version introduces several significant enhancements to improve security, flexibility, and usability.
What is LogTape?
LogTape is a simple, zero-dependency logging library for JavaScript with support for multiple runtimes (Node.js, Deno, Bun, browsers, and edge functions). It features structured logging, hierarchical categories, template literals, and is designed to be used in both applications and libraries.
The most notable addition in this release is the new @logtape/redaction package, designed to help protect sensitive information in your logs. This package provides two complementary approaches to redaction:
The package includes several built-in patterns for common sensitive data types:
Both approaches can be used independently or combined for maximum security. Comprehensive documentation for these features is available in the Data redaction section of the manual.
Text formatters now support omitting timestamps entirely from formatted messages. The TextFormatterOptions.timestamp option has been extended to include "none" and "disabled" values, giving you more control over log output format.
A new FileSinkOptions.lazy option has been added, allowing file sinks to open files only when actually needed, which can improve resource utilization.
The configure() and configureSync() functions now check for duplicate logger configurations with the same category and throw a ConfigError when detected. This prevents unintended overriding of logger configurations.
We'd like to thank our external contributors who helped make this release possible:
We encourage all users to upgrade to this version to take advantage of these improvements. As always, we welcome your feedback and contributions.
For more details on these changes, see the full changelog.
@hongminhee@hackers.pub
We're pleased to announce the release of LogTape 0.10.0 today. This version introduces several significant enhancements to improve security, flexibility, and usability.
What is LogTape?
LogTape is a simple, zero-dependency logging library for JavaScript with support for multiple runtimes (Node.js, Deno, Bun, browsers, and edge functions). It features structured logging, hierarchical categories, template literals, and is designed to be used in both applications and libraries.
The most notable addition in this release is the new @logtape/redaction package, designed to help protect sensitive information in your logs. This package provides two complementary approaches to redaction:
The package includes several built-in patterns for common sensitive data types:
Both approaches can be used independently or combined for maximum security. Comprehensive documentation for these features is available in the Data redaction section of the manual.
Text formatters now support omitting timestamps entirely from formatted messages. The TextFormatterOptions.timestamp option has been extended to include "none" and "disabled" values, giving you more control over log output format.
A new FileSinkOptions.lazy option has been added, allowing file sinks to open files only when actually needed, which can improve resource utilization.
The configure() and configureSync() functions now check for duplicate logger configurations with the same category and throw a ConfigError when detected. This prevents unintended overriding of logger configurations.
We'd like to thank our external contributors who helped make this release possible:
We encourage all users to upgrade to this version to take advantage of these improvements. As always, we welcome your feedback and contributions.
For more details on these changes, see the full changelog.
@hongminhee@hackers.pub
We're pleased to announce the release of LogTape 0.10.0 today. This version introduces several significant enhancements to improve security, flexibility, and usability.
What is LogTape?
LogTape is a simple, zero-dependency logging library for JavaScript with support for multiple runtimes (Node.js, Deno, Bun, browsers, and edge functions). It features structured logging, hierarchical categories, template literals, and is designed to be used in both applications and libraries.
The most notable addition in this release is the new @logtape/redaction package, designed to help protect sensitive information in your logs. This package provides two complementary approaches to redaction:
The package includes several built-in patterns for common sensitive data types:
Both approaches can be used independently or combined for maximum security. Comprehensive documentation for these features is available in the Data redaction section of the manual.
Text formatters now support omitting timestamps entirely from formatted messages. The TextFormatterOptions.timestamp option has been extended to include "none" and "disabled" values, giving you more control over log output format.
A new FileSinkOptions.lazy option has been added, allowing file sinks to open files only when actually needed, which can improve resource utilization.
The configure() and configureSync() functions now check for duplicate logger configurations with the same category and throw a ConfigError when detected. This prevents unintended overriding of logger configurations.
We'd like to thank our external contributors who helped make this release possible:
We encourage all users to upgrade to this version to take advantage of these improvements. As always, we welcome your feedback and contributions.
For more details on these changes, see the full changelog.
@haskell_discussions@mastodon.social
[ANN] GHCup 0.1.50.2 release (LD breakage)
https://discourse.haskell.org/t/ann-ghcup-0-1-50-2-release-ld-breakage/12114
Discussions: https://discu.eu/q/https://discourse.haskell.org/t/ann-ghcup-0-1-50-2-release-ld-breakage/12114
@kubikpixel@chaos.social
"2025-05: GNU Taler v1.0 released – We are happy to announce the release of GNU Taler v1.0."
This provide a payment system that makes privacy-friendly online transactions fast and easy.
🥳 https://www.taler.net/en/news/2025-01.html
#gnutaler #Version1 #v1 #gnu #taler #switzerland #release #alternative #privacy #friendly #fastandeasy
@hugovk@mastodon.social · Reply to Hugo van Kemenade's post
Just released! 🚀
Enabled colour help for Python 3.14:
🎨 em-keyboard 5.2.0
🎨 linkotron 0.5.0
🎨 norwegianblue 0.22.0
🎨 pepotron 1.5.0
🎨 pypistats 1.10.0
Also added Python 3.15 to pepotron: `pep 3.15` opens PEP 790.
#release #python314 #colour #CLI #EmKeyboard #linkotron #norwegianblue #pepotron #pypistats #help
@hugovk@mastodon.social · Reply to Hugo van Kemenade's post
Just released: Python 3.14.0 beta 1! 🚀🐍
🥧 Deferred type annotation evaluation!
🥧 T-strings!
🥧 Zstandard!
🥧 Syntax highlighting in the REPL!
🥧 Colour in unittest, argparse, json and calendar CLIs!
🥧 UUID v6-8!
🥧 And much more!
https://discuss.python.org/t/python-3-14-0-beta-1-is-here/91117?u=hugovk
@hugovk@mastodon.social · Reply to Hugo van Kemenade's post
Just released: Python 3.14.0 beta 1! 🚀🐍
🥧 Deferred type annotation evaluation!
🥧 T-strings!
🥧 Zstandard!
🥧 Syntax highlighting in the REPL!
🥧 Colour in unittest, argparse, json and calendar CLIs!
🥧 UUID v6-8!
🥧 And much more!
https://discuss.python.org/t/python-3-14-0-beta-1-is-here/91117?u=hugovk
@hugovk@mastodon.social · Reply to Hugo van Kemenade's post
Just released: Python 3.14.0 beta 1! 🚀🐍
🥧 Deferred type annotation evaluation!
🥧 T-strings!
🥧 Zstandard!
🥧 Syntax highlighting in the REPL!
🥧 Colour in unittest, argparse, json and calendar CLIs!
🥧 UUID v6-8!
🥧 And much more!
https://discuss.python.org/t/python-3-14-0-beta-1-is-here/91117?u=hugovk
@hugovk@mastodon.social
#Python 3.14.0 beta 1 release day! `main` branch is locked!
It's also the feature freeze, meaning lots of stuff got merged yesterday so it can be released in 3.14 in October 2025 and not 3.15 in October 2026. But first, a couple of reverts for not-so-important things that weren't quite ready and last-minute fixes.
@hugovk@mastodon.social
#Python 3.14.0 beta 1 release day! `main` branch is locked!
It's also the feature freeze, meaning lots of stuff got merged yesterday so it can be released in 3.14 in October 2025 and not 3.15 in October 2026. But first, a couple of reverts for not-so-important things that weren't quite ready and last-minute fixes.
@hugovk@mastodon.social · Reply to Hugo van Kemenade's post
🙈 https://www.youtube.com/watch?v=2cxSP90gj8c [Vappu is May Day]
Just released! 🚀🚀🚀🚀
termcolor 3.1.0
Add true colour, cache system lookups
https://github.com/termcolor/termcolor/releases/tag/3.1.0
em-keyboard 5.1.0
Add Emoji 16.0: 🇨🇶
https://github.com/hugovk/em-keyboard/releases/tag/v5.1.0
Humanize 4.12.3
Fix regression in naturalsize, improve French translation
https://github.com/python-humanize/humanize/releases/tag/4.12.3
Python Docs Theme 2025.4.1
Fix copy button with multiple tracebacks
https://github.com/python/python-docs-theme/releases/tag/2025.4.1
#Python #release #termcolor #humanize #Sphinx #theme #EmKeyboard #PythonDocsTheme
@getsolus@floss.social
Our latest release is Solus 4.7 Endurance, released at the start of 2025. This release focuses on updating our editions, and refreshing the default kernels. We’ve called this release Endurance to highlight our promise to users that we will continue to deliver timely updates to keep their systems stable and beautiful.
Check out the full blog post here: https://getsol.us/2025/01/26/solus-4-7-released/
Download page: https://getsol.us/download/
#Solus #Linux #FOSS #OpenSource #Release
- Evan
@hugovk@mastodon.social · Reply to Hugo van Kemenade's post
Just released: Python Docs Theme 2025.4 🚀
📚 Require Sphinx 7.3
📚 Add support for Python 3.14
📚 Drop support for Python 3.10-3.11
📚 Copy button for code samples
📚 PEP 639 licence metadata
📚 and more!
https://github.com/python/python-docs-theme/releases
Thanks to Tomas Roun for the copy button! Demo:
@movim@piaille.fr
Good news everyone, Movim 0.30 codename Encke ☄️ is finally there! 🥳
This release is actually way bigger than you might think! Movim is bringing group-call to all your devices and still rely 100% on the XMPP standard (it is even compatible with @dino ✨).
In this new version you'll also find a lot of improvements in the UI, a better integration of the Stories and a new way to personalize how Movim looks 🎨 .
Thanks to @nlnet and for their support ❤️.
Share the good new around and invite your friends to join Movim 😊 !
The complete release-note: https://mov.im/community/pubsub.movim.eu/Movim/good-news-everyone-movim-0-30-encke-is-there-xMvYPr
@aral@mastodon.ar.al
New Kitten release 🥳
Fixes:
• Components with slotted content in Markdown pages¹ are now properly supported.
• Backticks in content slotted into components in Markdown pages are now automatically escaped.
Enjoy!
💕
#Kitten #SmallWeb #release #markdown #fixes #components #web #dev
¹ https://kitten.small-web.org/reference/#markdown-pages-page-md-files
@Pixelix@mastodon.social
@hugovk@mastodon.social · Reply to Hugo van Kemenade's post
Just released: Pillow 11.2.1 🚀
There was meant to be a 11.2.0 on 1st April, but we put too much good stuff in the wheels and hit the @pypi.org project limit before it could all be uploaded. That was yanked and now deleted and 11.2.1 is back to normal size.
We'll try and put the good stuff back for 11.3.0 on 1st July but take up less space.
@pillow@fosstodon.org
🐍🚀🎨 Pillow 11.2.1 has been released!
What happened to 11.2.0?
Two things: we added AVIF support which made the wheels much bigger, and we hit the PyPI project size limit before the release could be fully updated.
11.2.1 instead has AVIF support but needs to be built from source. We'll look into including AVIF in wheels in a future release so that the size doesn't increase so much.
This release also adds Arrow support and more:
https://pillow.readthedocs.io/en/stable/releasenotes/11.2.1.html
@hugovk@mastodon.social · Reply to Hugo van Kemenade's post
Just released: Python 3.14.0a7 🚀
Just released: Python 3.13.3 🚀🚀
Just released: Python 3.12.10 🚀🚀🚀
Just released: Python 3.11.12 🚀🚀🚀🚀
Just released: Python 3.10.17 🚀🚀🚀🚀🚀
Just released: Python 3.9.22 🚀🚀🚀🚀🚀🚀
Last 3.14 alpha! Less than a month to get new features in before beta!
Last 3.12 bugfix release! Now in security fix only!
And security releases of 3.9-3.11.
Please upgrade 3.9-3.13!
Please test 3.14!
@Pixelix@mastodon.social
@Pixelix@mastodon.social
@Pixelix@mastodon.social
@Pixelix@mastodon.social
@movim@piaille.fr
Good news everyone, Movim 0.30 codename Encke ☄️ is finally there! 🥳
This release is actually way bigger than you might think! Movim is bringing group-call to all your devices and still rely 100% on the XMPP standard (it is even compatible with @dino ✨).
In this new version you'll also find a lot of improvements in the UI, a better integration of the Stories and a new way to personalize how Movim looks 🎨 .
Thanks to @nlnet and for their support ❤️.
Share the good new around and invite your friends to join Movim 😊 !
The complete release-note: https://mov.im/community/pubsub.movim.eu/Movim/good-news-everyone-movim-0-30-encke-is-there-xMvYPr
@movim@piaille.fr
Good news everyone, Movim 0.30 codename Encke ☄️ is finally there! 🥳
This release is actually way bigger than you might think! Movim is bringing group-call to all your devices and still rely 100% on the XMPP standard (it is even compatible with @dino ✨).
In this new version you'll also find a lot of improvements in the UI, a better integration of the Stories and a new way to personalize how Movim looks 🎨 .
Thanks to @nlnet and for their support ❤️.
Share the good new around and invite your friends to join Movim 😊 !
The complete release-note: https://mov.im/community/pubsub.movim.eu/Movim/good-news-everyone-movim-0-30-encke-is-there-xMvYPr
@lobsters@mastodon.social
Pidgin 3.0 Experimental 2 (2.91.0) has been released https://lobste.rs/s/7h1c2a #release
https://discourse.imfreedom.org/t/pidgin-3-0-experimental-2-2-91-0-has-been-released/262
@hugovk@mastodon.social · Reply to Hugo van Kemenade's post
Just released: termcolor 3.0.0 🚀
ANSI colour formatting for the terminal.
🎨 Add support for Python 3.14
🎨 Only apply FORCE_COLOR, NO_COLOR & ANSI_COLORS_DISABLED env vars when present & not an empty string
🎨 Replace literal types with strings
🎨 Replace deprecated classifier with licence expression (PEP 639)
🎨 Speedup: move typing imports into type-checking block
🎨 Remove deprecated __ALL__, use __all__ instead
@hugovk@mastodon.social · Reply to Hugo van Kemenade's post
Just released: PrettyTable 3.16 🚀
Just released: norwegianblue 0.21.0 🚀
Add support for OSC 8 hyperlinks in the terminal.
https://github.com/prettytable/prettytable/releases/tag/3.16.0
norwegianblue now uses this to create hyperlinks in the terminal instead of printing a wide column of links. Use command+click with iTerm.
Also create hyperlinks for Markdown, reStructuredText and HTML output.
https://github.com/hugovk/norwegianblue/releases/tag/0.21.0
Attached are before and after images.
@haskell_discussions@mastodon.social
[ANN] ollama-haskell - 0.1.3.0 released!
https://github.com/tusharad/ollama-haskell/releases/tag/V0.1.3.0
Discussions: https://discu.eu/q/https://github.com/tusharad/ollama-haskell/releases/tag/V0.1.3.0
@hugovk@mastodon.social · Reply to Hugo van Kemenade's post
Just released: humanize 4.12.2 🚀
Bugfix release, mainly fixing the spelling of licence/license so the file is properly included in the package.
Reminder how to do PEP 639 metadata: https://hugovk.dev/blog/2025/improving-licence-metadata/
@haskell_discussions@mastodon.social
[ANN] GHCup 0.1.50.0 released - Announcements
https://discourse.haskell.org/t/ann-ghcup-0-1-50-0-released/11695
Discussions: https://discu.eu/q/https://discourse.haskell.org/t/ann-ghcup-0-1-50-0-released/11695
@hugovk@mastodon.social · Reply to Hugo van Kemenade's post
Just released: pypistats 1.9.0 🚀
pypistats is CLI to show download stats from PyPI
https://pypi.org/project/pypistats/1.9.0/
* Replace deprecated classifier with licence expression (PEP 639)
* Remove GitHub attestation, uses PyPI attestations instead (PEP 740)
* Add input validation for total and fix --monthly with no mirror
* Update docs for recent command
@hugovk@mastodon.social · Reply to Hugo van Kemenade's post
Especially for π day and #FediDonutFriday!
Just released: Python 3.14.0a6 🚀
https://discuss.python.org/t/python-3-14-0-alpha-6/84513
https://docs.python.org/3.14/whatsnew/3.14.html
This release brought to you by a Karelian pie (Karjalanpiirakka), a strawberry and gooseberry pie (mansikka-karviais piirakka) and a slice of blueberry pie (mustikkapiirakka).
#Python #CPython #Python314 #release #food #PiDay #PiiPäivä #pie #FediDonutFriday
@hugovk@mastodon.social · Reply to Hugo van Kemenade's post
Especially for π day and #FediDonutFriday!
Just released: Python 3.14.0a6 🚀
https://discuss.python.org/t/python-3-14-0-alpha-6/84513
https://docs.python.org/3.14/whatsnew/3.14.html
This release brought to you by a Karelian pie (Karjalanpiirakka), a strawberry and gooseberry pie (mansikka-karviais piirakka) and a slice of blueberry pie (mustikkapiirakka).
#Python #CPython #Python314 #release #food #PiDay #PiiPäivä #pie #FediDonutFriday
@gstreamer@floss.social
📢 We're thrilled to announce GStreamer 1.26
... a new major stable feature release!
Check out
https://gstreamer.freedesktop.org/releases/1.26/
for details of all the exciting new features and improvements!
Many thanks to everyone who contributed to this release!
📦 GStreamer 1.26.0 binary packages for Windows, macOS, iOS and Android are also available now at
@gstreamer@floss.social
📢 We're thrilled to announce GStreamer 1.26
... a new major stable feature release!
Check out
https://gstreamer.freedesktop.org/releases/1.26/
for details of all the exciting new features and improvements!
Many thanks to everyone who contributed to this release!
📦 GStreamer 1.26.0 binary packages for Windows, macOS, iOS and Android are also available now at
@gstreamer@floss.social
📢 We're thrilled to announce GStreamer 1.26
... a new major stable feature release!
Check out
https://gstreamer.freedesktop.org/releases/1.26/
for details of all the exciting new features and improvements!
Many thanks to everyone who contributed to this release!
📦 GStreamer 1.26.0 binary packages for Windows, macOS, iOS and Android are also available now at
@lobsters@mastodon.social
@liw@toot.liw.fi · Reply to Gergely Nagy 🐁's post
@algernon Automating releases is tricky business, and in my experience somewhat tied to the project. There are generalities, of course.
This is an area where I'll want to add support to Ambient to automate the mechanical parts as best I can, but that's not happening soon. Too many other things to do first.
#release #softwareDevelopment #continuousIntegration #AmbientCI
@rust_discussions@mastodon.social
Release fish shell 4.0.0, now ported to Rust
https://github.com/fish-shell/fish-shell/releases/tag/4.0.0
Discussions: https://discu.eu/q/https://github.com/fish-shell/fish-shell/releases/tag/4.0.0
@rust_discussions@mastodon.social
Release fish shell 4.0.0, now ported to Rust
https://github.com/fish-shell/fish-shell/releases/tag/4.0.0
Discussions: https://discu.eu/q/https://github.com/fish-shell/fish-shell/releases/tag/4.0.0
@boilingsteam@mastodon.cloud
Microsoft announces Phi-4-multimodal and Phi-4-mini: https://azure.microsoft.com/en-us/blog/empowering-innovation-the-next-generation-of-the-phi-family/
#llm #phi4 #multimodal #release #instruct #ai
@boilingsteam@mastodon.cloud
Microsoft announces Phi-4-multimodal and Phi-4-mini: https://azure.microsoft.com/en-us/blog/empowering-innovation-the-next-generation-of-the-phi-family/
#llm #phi4 #multimodal #release #instruct #ai
@gstreamer@floss.social
📢 GStreamer 1.26 release candidate 1 is out!
Please give it a spin and report any issues.
Curious what's new? Preliminary release notes with all the details will be made available before the final release.
📦 GStreamer 1.26.0 rc1 binary packages for Windows, macOS, iOS and Android are also available now for testing.
https://discourse.gstreamer.org/t/gstreamer-1-25-90-pre-release-1-26-0-rc1/4180/2
@gstreamer@floss.social
📢 GStreamer 1.26 release candidate 1 is out!
Please give it a spin and report any issues.
Curious what's new? Preliminary release notes with all the details will be made available before the final release.
📦 GStreamer 1.26.0 rc1 binary packages for Windows, macOS, iOS and Android are also available now for testing.
https://discourse.gstreamer.org/t/gstreamer-1-25-90-pre-release-1-26-0-rc1/4180/2
@FeatherWiki@floss.social
Feather Wiki version 1.8.1 "Meadowlark" has been released! It includes a fix for adding images to the visual editor and an improvement for clarity.
Check out the details here:
https://codeberg.org/Alamantus/FeatherWiki/releases/tag/1.8.1
The website has also been updated to reflect the changes:
https://feather.wiki
Please let me know if you run into any problems with the new version!
@FeatherWiki@floss.social
Feather Wiki version 1.8.1 "Meadowlark" has been released! It includes a fix for adding images to the visual editor and an improvement for clarity.
Check out the details here:
https://codeberg.org/Alamantus/FeatherWiki/releases/tag/1.8.1
The website has also been updated to reflect the changes:
https://feather.wiki
Please let me know if you run into any problems with the new version!
@php_discussions@mastodon.social
PHP 8.4.4 Released
https://www.php.net/releases/8_4_4.php
Discussions: https://discu.eu/q/https://www.php.net/releases/8_4_4.php
@php_discussions@mastodon.social
PHP 8.4.4 Released
https://www.php.net/releases/8_4_4.php
Discussions: https://discu.eu/q/https://www.php.net/releases/8_4_4.php
@hugovk@mastodon.social · Reply to Hugo van Kemenade's post
Just released: Python 3.14.0a5 🚀
https://discuss.python.org/t/python-3-14-0-alpha-5/80364
https://docs.python.org/3.14/whatsnew/3.14.html
Also recently released!
blurb 2.0.0
cherry-picker 3.5.0
pypistats 1.8.0
PrettyTable 3.13.0 & 3.14.0
tox-dev/action-pre-commit-uv 1.0.2
em-keyboard 5.0.0
@pandoc@fosstodon.org
🆕 pandoc release 3.6.3! This is a bugfix release, but it comes with minor behavior changes:
• The way wikilinks are represented internally changed (marked via a "wikilinks" class instead of a title attribute).
• Babel support in the LaTeX writer changed in a way that should better support most European languages. Users of custom LaTeX templates may need to revise those.
Please see the changelog for more info.
@pandoc@fosstodon.org
🆕 pandoc release 3.6.3! This is a bugfix release, but it comes with minor behavior changes:
• The way wikilinks are represented internally changed (marked via a "wikilinks" class instead of a title attribute).
• Babel support in the LaTeX writer changed in a way that should better support most European languages. Users of custom LaTeX templates may need to revise those.
Please see the changelog for more info.
@hugovk@mastodon.social · Reply to Hugo van Kemenade's post
Just released: Python 3.14.0a4 🚀
https://discuss.python.org/t/python-3-14-0-alpha-4/77112
https://docs.python.org/3.14/whatsnew/3.14.html
Here's one amazing reason to try it out! 🗓️🎨
@haskell_discussions@mastodon.social
GHC 9.12 & Cabal 3.14 releases
https://blog.haskell.org/ghc-9-12-cabal-3-14/
Discussions: https://discu.eu/q/https://blog.haskell.org/ghc-9-12-cabal-3-14/
@movim@piaille.fr
New Year, new release ✨
In Movim 0.29 you'll discover two important changes, Stories and Briefs 😯 !
Yes Movim is the very first XMPP client that introduces fully standard Stories (https://xmpp.org/extensions/xep-0501.html). Share your day with your friends, from any device, in a few easy steps ❤️
Briefs allows you to publish short content on your profile and complete the existing more complete articles publications 📝
Checkout the complete release note to know everything about those exciting new features: https://mov.im/community/pubsub.movim.eu/Movim/movim-0-29-rankin-time-to-share-your-story-oX4pra
@movim@piaille.fr
New Year, new release ✨
In Movim 0.29 you'll discover two important changes, Stories and Briefs 😯 !
Yes Movim is the very first XMPP client that introduces fully standard Stories (https://xmpp.org/extensions/xep-0501.html). Share your day with your friends, from any device, in a few easy steps ❤️
Briefs allows you to publish short content on your profile and complete the existing more complete articles publications 📝
Checkout the complete release note to know everything about those exciting new features: https://mov.im/community/pubsub.movim.eu/Movim/movim-0-29-rankin-time-to-share-your-story-oX4pra
@movim@piaille.fr
New Year, new release ✨
In Movim 0.29 you'll discover two important changes, Stories and Briefs 😯 !
Yes Movim is the very first XMPP client that introduces fully standard Stories (https://xmpp.org/extensions/xep-0501.html). Share your day with your friends, from any device, in a few easy steps ❤️
Briefs allows you to publish short content on your profile and complete the existing more complete articles publications 📝
Checkout the complete release note to know everything about those exciting new features: https://mov.im/community/pubsub.movim.eu/Movim/movim-0-29-rankin-time-to-share-your-story-oX4pra
@haskell_discussions@mastodon.social
@pidgin@fosstodon.org
After way too many years the very first release of Pidgin 3.0, Experimental 1 has been released! You can read all about it over on our official Discourse post!! https://discourse.imfreedom.org/t/pidgin-3-0-experimental-1-has-been-released/227
@tobias@friendi.ca
We are very happy to announce the availability of the new stable release of Friendica “Interrupted Fern” 2024.12. In addition to several improvements and new features, this release contains the fix for the broken installation wizard.
The highlights of Friendica 2024.12 are
For details, please see the CHANGELOG file in the repository.
Friendica is a decentralised communications platform, you can use to host your own social media server that integrates with independent social networking platforms (like the Fediverse or Diaspora*) but also some commercial ones like Tumblr and BlueSky.
If you are updating from an older version than the 2023.12 release, please first update your Friendica instance to that version as it contained some breaking changes.
Ensure that the last backup of your Friendica installation was done recently.
Updating from the git repositories should only involve a pull from the Friendica core repository and addons repository, regardless of the branch (stable or develop) you are using. Remember to update the dependencies with composer as well. So, assuming that you are on the stable branch, the commands to update your installation to the 2024.12 release would be
cd friendicagit pullbin/composer.phar install --no-devcd addongit pullIf you want to use a different branch than the stable one, you need to fetch and checkout the branch before your perform the git pull.
Pulling in the dependencies with composer will show some deprecation warning, we will be working on that in the upcoming release.
If you had downloaded the source files in an archive file (tar.gz) please download the current version of the archive from friendica-full-2024.12.tar.gz (sha256) and friendica-addons 2024.12.tar.gz (sha256)) and unpack it on your local computer.
As many files got deleted or moved around, please upload the unpacked files to a new directory on your server (say friendica_new) and copy over your existing configuration (config/local.config.php and config/addon.config.php) and .htaccess files. Afterwards rename your current Friendica directory (e.g. friendica) to friendica_old and friendica_new to friendica.
The files of the dependencies are included in the archive (make sure you are using the friendica-full-2024.12 archive), so you don’t have to worry about them.
The database update should be applied automatically, but sometimes it gets stuck. If you encounter this, please initiate the DB update manually from the command line by running the script
bin/console dbstructure updatefrom the base of your Friendica installation. If the output contains any error message, please let us know using the channels mentioned below.
Please note, that some of the changes to the database structure will take some time to be applied, depending on the size of your Friendica database this update might run for days.
At the time of writing this, none with 2024.12
But the development branch is currently rather unstable and should be used with caution as the development diverged far (for Friendica terms) from the now stable branch. We will let our very valued ALPHA testers know when the dev team things that the development branch is stable enough again.
If you want to contribute to the project, you don’t need to have coding experience. There are a number of tasks listed in the issue tracker with the label “Junior Jobs” we think are good for new contributors. But you are by no means limited to these – if you find a solution to a problem (even a new one) please make a pull request at github or let us know in the development forum.
Contribution to Friendica is also not limited to coding. Any contribution to the documentation, the translation or advertisement materials is welcome or reporting a problem. You don’t need to deal with Git(Hub) or Transifex if you don’t like to. Just get in touch with us and we will get the materials to the appropriate places.
Thanks everyone who helped making this release possible, and especially to all the new contributors to Friendica, and have fun!
@pidgin@fosstodon.org
After way too many years the very first release of Pidgin 3.0, Experimental 1 has been released! You can read all about it over on our official Discourse post!! https://discourse.imfreedom.org/t/pidgin-3-0-experimental-1-has-been-released/227
@GIMP@floss.social
@GIMP@floss.social
@GIMP@floss.social
@GIMP@floss.social
@GIMP@floss.social
@lisp_discussions@mastodon.social
XDG Desktop Portal 1.19.1 released, with Notifications v2, new USB portal and URI scheme support system
https://github.com/flatpak/xdg-desktop-portal/discussions/1543
Discussions: https://discu.eu/q/https://github.com/flatpak/xdg-desktop-portal/discussions/1543
@hugovk@mastodon.social · Reply to Hugo van Kemenade's post
Oh, and taking inspiration from #pytest, I added colour to #unittest output in this one 🎨
@hugovk@mastodon.social · Reply to Hugo van Kemenade's post
Just released: Python 3.14.0a3 🚀
https://discuss.python.org/t/python-3-14-0-alpha-3/74542
https://docs.python.org/3.14/whatsnew/
This release brought to you by tea and homemade mince pies.
@booteille@framapiaf.org
#PeerTube v7 is ouuuuuuuut!
This version brings a brand new design and a lot of improvements!
https://framablog.org/2024/12/17/peertube-v7-offer-a-complete-makeover-to-your-video-platform/
Full changelog: https://github.com/Chocobozzz/PeerTube/releases/tag/v7.0.0
@haskell_discussions@mastodon.social
Glasgow Haskell Compiler 9.12.1 Release notes
https://downloads.haskell.org/ghc/9.12.1/docs/users_guide/9.12.1-notes.html
Discussions: https://discu.eu/q/https://downloads.haskell.org/ghc/9.12.1/docs/users_guide/9.12.1-notes.html

@Nitrux_NX@mastodon.cloud
Today is the day! — Nitrux 3.8.0 "db" is available to download — https://nxos.org
We are pleased to announce the launch of Nitrux 3.8.0. This new version combines the latest software updates, bug fixes, performance improvements, and ready-to-use hardware support.
Nitrux 3.8.0 is available immediately.
Changelog: https://nxos.org/changelog/release-announcement-nitrux-3-8-0/
@toxi@mastodon.thi.ng
Some #GenArtAPI and #ThingUmbrella releases from this past week:
https://thi.ng/genart-api is already at v0.8.1 now. This latest version includes a new "debug mode" time provider plugin which also collects and computes frame rate statistics (moving average) and injects a canvas visualization overlay (everything configurable). Together with the parameter editor, this is a small, but useful tool to help configuring an artwork and ensure fluid performance on a target device/platform...
The URL chooser of the reference implementation's parameter editor is also mobile friendly now. You can see a demo of both in action here:
https://demo.thi.ng/genart-api/param-editors/?url=https://demo.thi.ng/genart-api/param-test/
Some https://thi.ng/umbrella related updates:
https://thi.ng/memoize: Function memoization/caching. Added support for async functions/promises and made existing implementations variadic (and removed fixed arity versions!). This is thanks to a feature request by Hitomi Tenshi...
https://thi.ng/transducers-stats: Functional sequence processing. Added moving minimum/maximum transducers (deque-based to be super efficient) and updated Donchian channel transducer (aka moving min/max bounds) to also benefit from new implementation
There's also ongoing major (re)work of the long-promised 2D/3D mesh implementation. It's still on a private feature branch, but I'm getting closer for initial release...
#OpenSource #Release #Announcement #TypeScript #JavaScript #GenerativeArt
@hugovk@mastodon.social · Reply to Hugo van Kemenade's post
Just released! PrettyTable 3.12 🚀
https://pypi.org/project/prettytable/3.12.0/
🪑 Add new themes to ColorTable
🪑 Drop support for Python 3.8
🪑 Deprecate hrule and tableStyle constants
🪑 Use SPDX license identifier
🪑 Add lots of type annotations
🪑 Generate __version__ at build to avoid slow importlib.metadata
🪑 Release to PyPI using Trusted Publishing and PEP 703 digital attestations
🪑 Fix drawing headerless coloured tables with title
🪑 And more!
@hugovk@mastodon.social · Reply to Hugo van Kemenade's post
Just released! stravavis 0.5.0 🚀
Create artistic visualisations with your exercise data.
https://pypi.org/project/stravavis/0.5.0/
🚴 Drop support for EOL Python 3.8
🏃 Skip segments in GPX tracks with empty trkseg
🛶 Fix pandas warnings
@hugovk@mastodon.social · Reply to Hugo van Kemenade's post
Just released: flake8-implicit-str-concat 🚀
🎱 Add support for #Python 3.12-3.13, drop 3.7-3.8
🎱 Switch from Flit to Hatchling + hatch-vcs for dynamic versioning
🎱 Release to PyPI with Trusted Publishing
https://pypi.org/project/flake8-implicit-str-concat/0.5.0/
This #Flake8 plugin helps tidy up after Black:
$ cat 1.py
s = ('111'
'222')
$ black 1.py
reformatted 1.py
All done! ✨ 🍰 ✨
1 file reformatted.
$ cat 1.py
s = "111" "222"
$ flake8 1.py
1.py:1:10: ISC001 implicitly concatenated string literals on one line
@hugovk@mastodon.social · Reply to Hugo van Kemenade's post
Just released: blurb 1.3.0 🚀
blurb is the CLI we use for managing CPython's news/changelog entries.
🗞️ Add support for Python 3.13
🗞️ Drop support for Python 3.8
🗞️ Generate digital attestations for PyPI (PEP 740)
🗞️ Allow running blurb test from blurb-* directories by
🗞️ Add version subcommand
🗞️ Generate __version__ at build to avoid slow importlib.metadata
https://pypi.org/project/blurb/1.3.0/
#Python #CPython #blurb #release #CLI #changelog #news #PEP740 #Python313 #Python38
@hugovk@mastodon.social · Reply to Hugo van Kemenade's post
Just released: norwegianblue 0.19.0 🚀
🦜 Drop support for Python 3.8
🦜 Generate digital attestations for PyPI (PEP 740)
🦜 Test with tox-uv
🦜 Lint with pre-commit-uv
https://pypi.org/project/norwegianblue/0.19.0/
norwegianblue is a CLI to show EOLs from https://endoflife.date
@homeassistant@fosstodon.org
Missed the live stream for the 2024.10 Release Party earlier this month? We've got you covered with a 1-minute feature highlight video! 😎
Heading in the right direction - catch up on the full release notes here: https://www.home-assistant.io/blog/2024/10/02/release-202410/
@hugovk@mastodon.social · Reply to Hugo van Kemenade's post
Just released: pepotron 1.3.0 🚀
🔩 Generate digital attestations for PyPI (PEP 740)
🔩 Drop support for Python 3.8
🔩 Generate __version__ at build to avoid slow importlib.metadata
🔩 Test on CI with uv
https://pypi.org/project/pepotron/1.3.0/
Pepotron is a CLI for opening PEPs in your browser. For example, try:
$ pep 8
$ pep 3.14
$ pep dead batteries
$ pep calendar
@hugovk@mastodon.social · Reply to Hugo van Kemenade's post
Just released: Python 3.14.0a1 🚀
https://discuss.python.org/t/python-3-14-0-alpha-1/68039
🐍 PEP 649: deferred evaluation of annotations
🐍 Improved error messages
🐍 And more!
@hugovk@mastodon.social · Reply to Hugo van Kemenade's post
Just released: pypistats 1.7.0 🚀
📈 Generate digital attestations for PyPI (PEP 740)
📉 Drop support for EOL Python 3.8
📈 Generate __version__ at build to avoid slow importlib.metadata
@hugovk@mastodon.social · Reply to Hugo van Kemenade's post
Just released: @pillow 11.0.0 🚀
🎨 Add support for Python 3.13, including experimental freethreaded wheels!
🖌️ Drop support for EOL Python 3.8
🎨 Remove a whole load of deprecations
🖌️ Add, change and fix a whole lot more stuff
🎨 Add some more deprecations, to be removed in Pillow 12 next October
🖌️ More info at https://pillow.readthedocs.io/en/stable/releasenotes/11.0.0.html
🎨 And even more at https://github.com/python-pillow/Pillow/releases/tag/11.0.0
@pillow@fosstodon.org
🐍🚀🎨 #Pillow 11.0.0 has been released!
* Added support for #Python 3.13, including experimental #freethreaded wheels!
* Dropped EOL 3.8
* Removed PSFile, PyAccess and Image.USE_CFFI_ACCESS, TiffImagePlugin IFD_LEGACY_API, and support for WebP 0.4
* A bunch of new deprecations, to be removed in 12.0.0 in October 2025
* Default resampling filter for I;16* image modes has changed to Image.BICUBIC
* XMP data can be saved to JPEG and MPO files
https://pillow.readthedocs.io/en/stable/releasenotes/11.0.0.html
@hugovk@mastodon.social · Reply to Hugo van Kemenade's post
Just released: #cherry_picker 2.3.0 🚀
This tool creates backports for CPython when the Miss Islington bot can't, usually due to a merge conflict.
🍒 Add support for #Python 3.13, drop EOL 3.8
🍒 Resolve usernames when remote ends with a trailing slash
🍒 Optimize validate_sha() with --max-count=1
🍒 Remove multiple commit prefixes
🍒 Handle whitespace when calculating usernames
🍒 Publish to PyPI using #TrustedPublishers
🍒 Generate #PEP740 attestations
🍒 And more!
@hugovk@mastodon.social · Reply to Hugo van Kemenade's post
Just released: Tablib 3.7.0 🚀
🦛 Add sparkly new Python 3.13
🦛 Drop EOL Python 3.8
🦛 Add styling to datetime, date and time values for ODS
🦛 Add styling for date/time types for XLS
🦛 Fix time and datetime export in ODS format
🦛 Avoid normalizing input twice in import_set/book
@hugovk@mastodon.social · Reply to Hugo van Kemenade's post
Just released: termcolor 2.5.0: ANSI colour formatting for terminal output
🚀🖥️🎨
🖥️ Added `strike` attribute
🖥️ Now generates and uploads #PEP740 attestations to PyPI
🖥️ Dropped support for oh-so-very-nearly-EOL Python 3.8
@hugovk@mastodon.social
Just released: em 4.4.0, the CLI emoji keyboard 🚀⌨️✨
✨ Upgraded to emojilib 4.0.0: "The keywords include most if not all the :shortcode: from different platforms"
✨ Dropped support for oh-so-very-nearly-EOL Python 3.8.
@melroy@kbin.melroy.org
@Vivaldi@vivaldi.net
🍎Vivaldi 6.9 on iOS is here!
You can now close any unnecessary tabs in an instant with an extra feature added to the popular desktop-style tabs on your mobile browser.
Plus, you get to be in charge of your address field to know exactly where you’re headed with the option to see the full URL.
Download 6.9 on iOS now and find out how Vivaldi plays by your rules. 🛠️✨
https://vivaldi.com/blog/vivaldi-on-ios-6-9/
#ios #mobile #browser #tech #Technology #release #Productivity #tab #Vivaldi #VivaldiBrowser #apple
@Vivaldi@vivaldi.net
😎Look at you – the BOSS!
T. rexes hide from you and polar bear moms scare their cubs with stories of your power! Crocodiles tip their caps to you and savage wolves come at your call, eager for tummy tickles.
And now with 6.9 on Android, you have the power to shape the browser just the way you want it.
With a fully redesigned Settings menu and its new and intuitive search functionality to boot, you my friend, are in FULL control! 🎯
https://vivaldi.com/blog/android/android-releases/vivaldi-on-android-6-9/
#android #tech #Technology #mobile #browser #vivaldi #release #UI
@Vivaldi@vivaldi.net
Looking for tabs can feel like being invited to a scavenger hunt you didn't sign up for.
On the latest Vivaldi 6.9, renaming your tab stacks has hopefully helped speed up your search!
Show us how you've renamed your tab stacks!
We'll go first👇
#browser #tech #Technology #search #vivaldi #VivaldiBrowser #update #release #Productivity
@Vivaldi@vivaldi.net
Vivaldi 6.9? Nice!
@Vivaldi@vivaldi.net
Get ready for release day! 🎉
In the new update, you get more ways to manage your tabs. For starters, you can now find open tabs across your devices right from your sidebar, in a neatly organized way.
It gets better: you can now rename your tab or tab stacks to anything that helps you stay organized and in control of your tabs.
Find out all about 6.9 and update your browser with all the new features, feature improvements and fixes 👇
https://vivaldi.com/blog/vivaldi-on-desktop-6-9/
#tech #Technology #browser #tabmanagement #NewRelease #release #vivaldi #VivaldiBrowser #Desktop
@godotengine@mastodon.gamedev.place
You'd think we take a break after our major 4.3 release, but since we closed the merge window back in May we already had >200 PRs ripe for the picking 🥕🥔🍆
Read more about Godot 4.4 dev 1:
https://godotengine.org/article/dev-snapshot-godot-4-4-dev-1/
Highlights:
* Metal renderer for Apple devices
* 3D physics interpolation
* bicubic sampling for lightmaps
* many performance optimizations
In the meantime, make yourself at home in the adorable veggie-town of #Gourdlets by @auntygames 👵
@godotengine@mastodon.gamedev.place
📅 259 days
🧮 3,520 commits
👤 521 contributors
We present to you: Godot 4.3 ✨
https://godotengine.org/releases/4.3/
We hope you enjoy the new release page format as much as we did preparing it!
@apicici@mastodon.gamedev.place
#Release day! 🥳 🎉
"The founders of [redacted]" is OUT!
It's a *free* point & click adventure game, just waiting for you to play it!
https://apicici.itch.io/the-founders-of-redacted
If you enjoy it, please share it with your friends!
If you don't like it, share it with your enemies! That will teach them!
Either way boosts are appreciated, I'm terrible at marketing and I'm only advertising it on the fediverse—help me reach more people 🙂
@movim@piaille.fr
Movim 0.26, codename Borrelly is out! 🚀
This new release integrates the custom emojis feature, better handling of spam messages, content embedding in messages and articles improvements as well as many internal fixes 😋
Checkout the complete release note on our official blog https://mov.im/node/pubsub.movim.eu/Movim/f619c49c-ccd3-4487-8c2e-20b6d3555da2 and if you're an admin don't forget to update and join the federation on https://join.movim.eu/ 🗒️ ✨
You can also support us by joining our Patreon https://www.patreon.com/movim 🥰
@dillo@fosstodon.org
Dillo 3.1.0 finally released after 9 years!
@paulshryock@phpc.social
"How should you generate changelogs?
The audience for your commit history and your changelog are very distinct from each other. These different audiences care about different things. Any changelog system based on extracting commit messages is therefore doomed to fail."
@CrystalLanguage@fosstodon.org
We are thrilled to announce the release of Crystal 1.13.0
https://crystal-lang.org/2024/07/09/1.13.0-released/
You can now rescue module types! And there are a few improvements on parallelism. Happy Crystalling!
@movim@piaille.fr
Movim 0.21, codename Whipple, is finally out! Discover all exciting new features and improved things that you can find in this big #release on our official release note 🥳 https://mov.im/?node/pubsub.movim.eu/Movim/81f7e9d0-8cb6-47d7-a5d4-f3324c6aa306 #Movim
Share it around ! ❤️
@linkstack@mstdn.social
🚨 **MAJOR UPDATE**🚨
*Release 4.0.0*
New name, new design... same ol' idiots
General changes:
- New layout
- Manual user verification
- Multi domain support
- Hide share button
- Advanced user statistics for admins
- Admin Panel themes
- Bugfixes and comfort changes
⚠️ READ BEFORE UPDATING: https://github.com/LinkStackOrg/LinkStack/releases/tag/v4.0.0/#important
As always, thanks to our monthly subscribers, donors and our beta testers.
Read the full changelog here:
https://github.com/JulianPrieber/littlelink-custom/releases/tag/v4.0.0
@hearsepileup@metalhead.club
REALISE is out now.
Play it at https://realise.hearsepileup.rip
Pre save at
https://show.co/c4Sh0zC
Please boost, share, prey-save, and generally help us out - it's been a long road and a lot of effort has gone into this. More than I care to mention.
#mastomusicians #mastomuse #fedimusic #release #newmusic #punk
@enoent@ravenation.club
Releasing some tunes today on faircamp - made in the last few years in collaboration with Shin Bone (https://soundcloud.com/shin-bone). Including UK garage, breaks, autonomic d'nb and dubstep.
All tunes are free download, forever*
Get them here:
https://audio.enoent.one/tenonev2-5/
@FeatherWiki@floss.social
Feather Wiki version 1.8.0 "Skylark" has just been released! It includes several bug fixes and unifies the previous builds into a single download for improved simplicity.
Check out all the details here:
https://codeberg.org/Alamantus/FeatherWiki/releases/tag/1.8.0
The website has also been updated to reflect the changes:
https://feather.wiki
Please let me know if you run into any problems with the new version!
@jaiecoute@framapiaf.org
joseph - Souffle
bonjour mastodon
aujourd'hui c'est 👾 #release day 💿 : mon nouvel album est téléchargement libre 🎧, #creativecommons #mastoart
Dans un style #ambient #experimental #music
⬇️ 🎶 https://archive.org/details/joseph-souffle
Vos retours sont les bienvenus 👋