A small tool to view real-world ActivityPub objects as JSON! Enter a URL
or username from Mastodon or a similar service below, and we'll send a
request with
the right
Accept
header
to the server to view the underlying object.
{
"@context": [
"https://join-lemmy.org/context.json",
"https://www.w3.org/ns/activitystreams"
],
"type": "Page",
"id": "https://lemmy.ml/post/29436906",
"attributedTo": "https://lemmy.ml/u/jjba23",
"to": [
"https://beehaw.org/c/foss",
"https://www.w3.org/ns/activitystreams#Public"
],
"name": "pingwing: v0.0.13: A Lisp-powered notification nexus (Guile Scheme) - Programatically send e-mail with HTML (SXML) templates, (and more things coming soon)",
"cc": [],
"content": "<p>The free and open Lisp-powered notification nexus</p>\n<p><a href=\"https://codeberg.org/jjba23/pingwing\">codeberg.org/jjba23/pingwing</a></p>\n<p>Do you want to work the complexity away of sending e-mail, Slack or other notifications, from every other program? Specially if you use a (micro)service oriented architecture?</p>\n<p>pingwing, a key component of the jointhefreeworld ecosystem, emerges as a robust and extensible solution. Architected in the elegant and powerful dialect of Lisp known as Guile Scheme, this tool gives you power (via REST API and more) to become the central notification system for your platform.</p>\n<p>At its core, pingwing exposes a programmatic interface (and more!) allowing you to dispatch messages, electronic mail, and critical alerts with finesse. Forget juggling disparate notification mechanisms; pingwing harmonizes these streams, routing them to your chosen endpoints.</p>\n<p>Initial support includes SMTP for email delivery, with a pending integration for Slack (expect webhook wizardry soon!).</p>\n<p>The architecture is designed for future expansion, promising connectivity to a diverse range of notification sinks.</p>\n<p>This project is powered by Lisp (Guile Scheme), curl , make , SXML and the GNU Artanis web framework, SQLite, among others.</p>\n<p><img src=\"https://lemmy.ml/pictrs/image/d95b50b9-c04a-4a0d-8382-4d7e6aae60c2.png\" alt=\"\" /></p>\n<p>This is free software, licensed under the GNU General Public License 3 or newer.</p>\n<p>This tool is compatible with any SMTP provider you can think of, thanks to its simple and agnostic approach.</p>\n<p>All you need to do to interact with pingwing is call the /api/v1/tasks with a POST method and give your preferences. See app/api/v1.scm for more details on the API, and lib/pingwing/tasks.scm for more.</p>\n<pre style=\"background-color:#ffffff;\">\n<span style=\"color:#323232;\">curl -v \\\n</span><span style=\"color:#323232;\"> -H "Content-Type: application/json" \\\n</span><span style=\"color:#323232;\"> -d '{\n</span><span style=\"color:#323232;\"> "task-type": "send-email",\n</span><span style=\"color:#323232;\"> "template": "password-reset",\n</span><span style=\"color:#323232;\"> "template-vars": {\n</span><span style=\"color:#323232;\"> "system-name": "WikiMusic",\n</span><span style=\"color:#323232;\"> "user": "jjbigorra@gmail.com",\n</span><span style=\"color:#323232;\"> "reset-link": "https://gnu.org/"\n</span><span style=\"color:#323232;\"> },\n</span><span style=\"color:#323232;\"> "sender-name": "No Reply - WikiMusic",\n</span><span style=\"color:#323232;\"> "sender-address": "noreply@wikimusic.jointhefreeworld.org",\n</span><span style=\"color:#323232;\"> "subject": "Wikimusic - Password Reset",\n</span><span style=\"color:#323232;\"> "recipients": [\n</span><span style=\"color:#323232;\"> {"name": "Josep Bigorra", "address": "jjbigorra@gmail.com"},\n</span><span style=\"color:#323232;\"> {"name": "Another Person", "address": "jjbigorra+1@gmail.com"}\n</span><span style=\"color:#323232;\"> ]\n</span><span style=\"color:#323232;\"> }' \\\n</span><span style=\"color:#323232;\"> 'http://localhost:50077/api/v1/tasks'\n</span></pre>\n<p>You can submit tasks at super high rates to pingwing since the ingestion and processing are done completely separately. This ensures that we can do a reliable retry mechanism and can handle high volumes of data.</p>\n<p>After the task has submitted and picked up by the worker, a message like this will be produced:</p>\n<pre style=\"background-color:#ffffff;\">\n<span style=\"color:#323232;\">MIME-Version: 1.0\n</span><span style=\"color:#323232;\">Subject: WikiMusic - Password Reset 998c42eb-7472-4e12-aa5a-ffdbe754b430\n</span><span style=\"color:#323232;\">From: No Reply - WikiMusic <noreply@wikimusic.jointhefreeworld.org>\n</span><span style=\"color:#323232;\">To: Josep Bigorra <jjbigorra@gmail.com>\n</span><span style=\"color:#323232;\">Content-Type: multipart/alternative; boundary="pingwing-message-multipart-boundary-33c2b557-7f27-4339-9a85-2385e7ecde9b"\n</span><span style=\"color:#323232;\">\n</span><span style=\"color:#323232;\">--pingwing-message-multipart-boundary-33c2b557-7f27-4339-9a85-2385e7ecde9b\n</span><span style=\"color:#323232;\">Content-Type: text/plain; charset="UTF-8"\n</span><span style=\"color:#323232;\">Content-Transfer-Encoding: quoted-printable\n</span><span style=\"color:#323232;\">\n</span><span style=\"color:#323232;\">Reset your password: \n</span><span style=\"color:#323232;\">We have received a request to reset the password for your user account:\n</span><span style=\"color:#323232;\">User.............\n</span><span style=\"color:#323232;\">\n</span><span style=\"color:#323232;\">--pingwing-message-multipart-boundary-33c2b557-7f27-4339-9a85-2385e7ecde9b\n</span><span style=\"color:#323232;\">Content-Type: text/html; charset="UTF-8"\n</span><span style=\"color:#323232;\">Content-Transfer-Encoding: quoted-printable\n</span><span style=\"color:#323232;\">\n</span><span style=\"color:#323232;\"><!DOCTYPE HTML>\n</span><span style=\"color:#323232;\"><html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><meta http-equiv="X-UA-Compatible" content="IE=edge" />..............\n</span><span style=\"color:#323232;\">\n</span><span style=\"color:#323232;\">--pingwing-message-multipart-boundary-33c2b557-7f27-4339-9a85-2385e7ecde9b--\n</span></pre>\n<p><strong>Send mail message via SMTP with curl</strong>\nAnd the worker will pick it up and send it (programatically for you):</p>\n<pre style=\"background-color:#ffffff;\">\n<span style=\"color:#323232;\">>>= sending mail to email-smtp.eu-west-3.amazonaws.com\n</span><span style=\"color:#323232;\">\n</span><span style=\"color:#323232;\">curl --verbose --ssl-reqd --url smtp://email-smtp.eu-west-3.amazonaws.com:587 --user "AK*****:*************" --mail-from 'noreply@wikimusic.jointhefreeworld.org' --mail-rcpt 'jjbigorra@gmail.com' --mail-rcpt-allowfails --upload-file tmp/998c42eb-7472-4e12-aa5a-ffdbe754b430-noreply@wikimusic.jointhefreeworld.org-jjbigorra@gmail.com\n</span><span style=\"color:#323232;\">\n</span><span style=\"color:#323232;\">% Total % Received % Xferd Average Speed Time Time Time Current\n</span><span style=\"color:#323232;\"> Dload Upload Total Spent Left Speed\n</span><span style=\"color:#323232;\"> 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0* Host email-smtp.eu-west-3.amazonaws.com:587 was resolved.\n</span><span style=\"color:#323232;\"> IPv6: (none)\n</span><span style=\"color:#323232;\"> IPv4: 15.236.217.177, 15.236.68.209, 15.237.2.166\n</span><span style=\"color:#323232;\"> Trying 15.236.217.177:587...\n</span><span style=\"color:#323232;\"> Connected to email-smtp.eu-west-3.amazonaws.com (15.236.217.177) port 587\n</span><span style=\"color:#323232;\">< 220 email-smtp.amazonaws.com ESMTP SimpleEmailService-d-I\n</span><span style=\"color:#323232;\">> EHLO 998c42eb-7472-4e12-aa5a-ffdbe754b430-noreply@wikimusic.jointhefreeworld.org-jjbigorra@gmail.com\n</span><span style=\"color:#323232;\">< 250-email-smtp.amazonaws.com\n</span><span style=\"color:#323232;\">< 250-8BITMIME\n</span><span style=\"color:#323232;\">< 250-STARTTLS\n</span><span style=\"color:#323232;\">< 250-AUTH PLAIN LOGIN\n</span><span style=\"color:#323232;\">< 250 Ok\n</span><span style=\"color:#323232;\">> STARTTLS\n</span><span style=\"color:#323232;\">< 220 Ready to start TLS\n</span><span style=\"color:#323232;\">.........................\n</span><span style=\"color:#323232;\">< 235 Authentication successful.\n</span><span style=\"color:#323232;\"> 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0> MAIL FROM:<noreply@wikimusic.jointhefreeworld.org>\n</span><span style=\"color:#323232;\">< 250 Ok\n</span><span style=\"color:#323232;\">> RCPT TO:<jjbigorra@gmail.com>\n</span><span style=\"color:#323232;\">< 250 Ok\n</span><span style=\"color:#323232;\">> DATA\n</span><span style=\"color:#323232;\">< 354 End data with <CR><LF>.<CR><LF>q\n</span><span style=\"color:#323232;\">} [3028 bytes data]\n</span><span style=\"color:#323232;\"> We are completely uploaded and fine\n</span><span style=\"color:#323232;\">< 250 Ok 011301968c239ad5-72018cb8-ab51-42dd-8ea6-fd6395124272-000000\n</span><span style=\"color:#323232;\">100 3028 0 0 100 3028 0 5653 --:--:-- --:--:-- --:--:-- 5649\n</span><span style=\"color:#323232;\"> Connection #0 to host email-smtp.eu-west-3.amazonaws.com left intact`___`\n</span></pre>\n<p>example of how simple a template definition can be:</p>\n<pre style=\"background-color:#ffffff;\">\n<span style=\"color:#323232;\">;;; pingwing -- the free and open Lisp-powered notification nexus\n</span><span style=\"color:#323232;\">\n</span><span style=\"color:#323232;\">;; Copyright © Josep Bigorra <jjbigorra@gmail.com>\n</span><span style=\"color:#323232;\">\n</span><span style=\"color:#323232;\">;; pingwing is free software: you can redistribute it and/or modify\n</span><span style=\"color:#323232;\">;; it under the terms of the GNU General Public License as published by\n</span><span style=\"color:#323232;\">;; the Free Software Foundation, either version 3 of the License, or\n</span><span style=\"color:#323232;\">;; (at your option) any later version.\n</span><span style=\"color:#323232;\">\n</span><span style=\"color:#323232;\">;; pingwing is distributed in the hope that it will be useful,\n</span><span style=\"color:#323232;\">;; but WITHOUT ANY WARRANTY; without even the implied warranty of\n</span><span style=\"color:#323232;\">;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n</span><span style=\"color:#323232;\">;; GNU General Public License for more details.\n</span><span style=\"color:#323232;\">\n</span><span style=\"color:#323232;\">;; You should have received a copy of the GNU General Public License\n</span><span style=\"color:#323232;\">;; along with pingwing. If not, see <https://www.gnu.org/licenses/>.\n</span><span style=\"color:#323232;\">\n</span><span style=\"color:#323232;\">(define-module (pingwing templates system-alert)\n</span><span style=\"color:#323232;\"> #:use-module (ice-9 time)\n</span><span style=\"color:#323232;\"> #:use-module (ice-9 format)\n</span><span style=\"color:#323232;\"> #:use-module (ice-9 rdelim)\n</span><span style=\"color:#323232;\"> #:use-module (ice-9 textual-ports)\n</span><span style=\"color:#323232;\"> #:use-module (ice-9 regex)\n</span><span style=\"color:#323232;\"> #:use-module (srfi srfi-1)\n</span><span style=\"color:#323232;\"> #:use-module (srfi srfi-64)\n</span><span style=\"color:#323232;\"> #:use-module (pingwing css)\n</span><span style=\"color:#323232;\"> #:use-module (pingwing html)\n</span><span style=\"color:#323232;\"> #:use-module (ice-9 string-fun)\n</span><span style=\"color:#323232;\"> #:use-module (sxml simple)\n</span><span style=\"color:#323232;\"> #:use-module (ice-9 iconv))\n</span><span style=\"color:#323232;\">\n</span><span style=\"color:#323232;\">(begin\n</span><span style=\"color:#323232;\"> (define* (system-alert-html-template #:key system-name alert-value)\n</span><span style=\"color:#323232;\"> (let* (\n</span><span style=\"color:#323232;\"> (tree `((html (head ,meta-charset\n</span><span style=\"color:#323232;\"> ,meta-ie\n</span><span style=\"color:#323232;\"> ,meta-responsive\n</span><span style=\"color:#323232;\"> ,meta-color-scheme\n</span><span style=\"color:#323232;\"> ,meta-supported-color-schemes\n</span><span style=\"color:#323232;\"> (title ,(gettext "System Alert"))\n</span><span style=\"color:#323232;\"> (style ,mail-style))\n</span><span style=\"color:#323232;\"> (body (h1 (span ,(gettext\n</span><span style=\"color:#323232;\"> "System Alert: "))\n</span><span style=\"color:#323232;\"> (span ,system-name))\n</span><span style=\"color:#323232;\"> (p ,(gettext\n</span><span style=\"color:#323232;\"> "An alert has been triggered from your system"))\n</span><span style=\"color:#323232;\"> (hr (@ (style ,(->style '((margin-top . "1.4em") (margin-bottom . "1.4em"))))))\n</span><span style=\"color:#323232;\"> (p ,alert-value)\n</span><span style=\"color:#323232;\"> ,mail-footer)))))\n</span><span style=\"color:#323232;\"> (with-output-to-string (lambda ()\n</span><span style=\"color:#323232;\"> (sxml->xml tree)))))\n</span><span style=\"color:#323232;\"> (export system-alert-html-template))\n</span><span style=\"color:#323232;\">\n</span><span style=\"color:#323232;\">(begin\n</span><span style=\"color:#323232;\"> (define* (system-alert-plain-template #:key system-name alert-value)\n</span><span style=\"color:#323232;\"> (let* ((content (list (gettext "System Alert")\n</span><span style=\"color:#323232;\"> (gettext\n</span><span style=\"color:#323232;\"> "An alert has been triggered from your system:")\n</span><span style=\"color:#323232;\"> system-name\n</span><span style=\"color:#323232;\"> "----------------------------------"\n</span><span style=\"color:#323232;\"> alert-value\n</span><span style=\"color:#323232;\"> "----------------------------------"\n</span><span style=\"color:#323232;\"> (gettext\n</span><span style=\"color:#323232;\"> "this e-mail was powered by pingwing - the free and open Lisp-powered notification nexus")\n</span><span style=\"color:#323232;\"> "https://codeberg.org/jjba23/pingwing"\n</span><span style=\"color:#323232;\"> (gettext "see pingwing's source code on Codeberg"))))\n</span><span style=\"color:#323232;\"> (string-join content "\\n")))\n</span><span style=\"color:#323232;\"> (export system-alert-plain-template))\n</span></pre>\n",
"mediaType": "text/html",
"source": {
"content": "The free and open Lisp-powered notification nexus\n\n https://codeberg.org/jjba23/pingwing\n\nDo you want to work the complexity away of sending e-mail, Slack or other notifications, from every other program? Specially if you use a (micro)service oriented architecture?\n\npingwing, a key component of the jointhefreeworld ecosystem, emerges as a robust and extensible solution. Architected in the elegant and powerful dialect of Lisp known as Guile Scheme, this tool gives you power (via REST API and more) to become the central notification system for your platform.\n\nAt its core, pingwing exposes a programmatic interface (and more!) allowing you to dispatch messages, electronic mail, and critical alerts with finesse. Forget juggling disparate notification mechanisms; pingwing harmonizes these streams, routing them to your chosen endpoints.\n\nInitial support includes SMTP for email delivery, with a pending integration for Slack (expect webhook wizardry soon!).\n\nThe architecture is designed for future expansion, promising connectivity to a diverse range of notification sinks.\n\nThis project is powered by Lisp (Guile Scheme), curl , make , SXML and the GNU Artanis web framework, SQLite, among others.\n\n\n\nThis is free software, licensed under the GNU General Public License 3 or newer.\n\nThis tool is compatible with any SMTP provider you can think of, thanks to its simple and agnostic approach.\n\nAll you need to do to interact with pingwing is call the /api/v1/tasks with a POST method and give your preferences. See app/api/v1.scm for more details on the API, and lib/pingwing/tasks.scm for more.\n\n```\ncurl -v \\\n -H \"Content-Type: application/json\" \\\n -d '{\n \"task-type\": \"send-email\",\n \"template\": \"password-reset\",\n \"template-vars\": {\n \"system-name\": \"WikiMusic\",\n \"user\": \"jjbigorra@gmail.com\",\n \"reset-link\": \"https://gnu.org/\"\n },\n \"sender-name\": \"No Reply - WikiMusic\",\n \"sender-address\": \"noreply@wikimusic.jointhefreeworld.org\",\n \"subject\": \"Wikimusic - Password Reset\",\n \"recipients\": [\n {\"name\": \"Josep Bigorra\", \"address\": \"jjbigorra@gmail.com\"},\n {\"name\": \"Another Person\", \"address\": \"jjbigorra+1@gmail.com\"}\n ]\n }' \\\n 'http://localhost:50077/api/v1/tasks'\n```\n\nYou can submit tasks at super high rates to pingwing since the ingestion and processing are done completely separately. This ensures that we can do a reliable retry mechanism and can handle high volumes of data.\n\n\nAfter the task has submitted and picked up by the worker, a message like this will be produced:\n\n\n```\nMIME-Version: 1.0\nSubject: WikiMusic - Password Reset 998c42eb-7472-4e12-aa5a-ffdbe754b430\nFrom: No Reply - WikiMusic <noreply@wikimusic.jointhefreeworld.org>\nTo: Josep Bigorra <jjbigorra@gmail.com>\nContent-Type: multipart/alternative; boundary=\"pingwing-message-multipart-boundary-33c2b557-7f27-4339-9a85-2385e7ecde9b\"\n\n--pingwing-message-multipart-boundary-33c2b557-7f27-4339-9a85-2385e7ecde9b\nContent-Type: text/plain; charset=\"UTF-8\"\nContent-Transfer-Encoding: quoted-printable\n\nReset your password: \nWe have received a request to reset the password for your user account:\nUser.............\n\n--pingwing-message-multipart-boundary-33c2b557-7f27-4339-9a85-2385e7ecde9b\nContent-Type: text/html; charset=\"UTF-8\"\nContent-Transfer-Encoding: quoted-printable\n\n<!DOCTYPE HTML>\n<html><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" /><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />..............\n\n--pingwing-message-multipart-boundary-33c2b557-7f27-4339-9a85-2385e7ecde9b--\n```\n\n\n**Send mail message via SMTP with curl**\nAnd the worker will pick it up and send it (programatically for you):\n\n```\n>>= sending mail to email-smtp.eu-west-3.amazonaws.com\n\ncurl --verbose --ssl-reqd --url smtp://email-smtp.eu-west-3.amazonaws.com:587 --user \"AK*****:*************\" --mail-from 'noreply@wikimusic.jointhefreeworld.org' --mail-rcpt 'jjbigorra@gmail.com' --mail-rcpt-allowfails --upload-file tmp/998c42eb-7472-4e12-aa5a-ffdbe754b430-noreply@wikimusic.jointhefreeworld.org-jjbigorra@gmail.com\n\n% Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0* Host email-smtp.eu-west-3.amazonaws.com:587 was resolved.\n IPv6: (none)\n IPv4: 15.236.217.177, 15.236.68.209, 15.237.2.166\n Trying 15.236.217.177:587...\n Connected to email-smtp.eu-west-3.amazonaws.com (15.236.217.177) port 587\n< 220 email-smtp.amazonaws.com ESMTP SimpleEmailService-d-I\n> EHLO 998c42eb-7472-4e12-aa5a-ffdbe754b430-noreply@wikimusic.jointhefreeworld.org-jjbigorra@gmail.com\n< 250-email-smtp.amazonaws.com\n< 250-8BITMIME\n< 250-STARTTLS\n< 250-AUTH PLAIN LOGIN\n< 250 Ok\n> STARTTLS\n< 220 Ready to start TLS\n.........................\n< 235 Authentication successful.\n 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0> MAIL FROM:<noreply@wikimusic.jointhefreeworld.org>\n< 250 Ok\n> RCPT TO:<jjbigorra@gmail.com>\n< 250 Ok\n> DATA\n< 354 End data with <CR><LF>.<CR><LF>q\n} [3028 bytes data]\n We are completely uploaded and fine\n< 250 Ok 011301968c239ad5-72018cb8-ab51-42dd-8ea6-fd6395124272-000000\n100 3028 0 0 100 3028 0 5653 --:--:-- --:--:-- --:--:-- 5649\n Connection #0 to host email-smtp.eu-west-3.amazonaws.com left intact`___`\n```\n\nexample of how simple a template definition can be:\n\n```\n;;; pingwing -- the free and open Lisp-powered notification nexus\n\n;; Copyright © Josep Bigorra <jjbigorra@gmail.com>\n\n;; pingwing is free software: you can redistribute it and/or modify\n;; it under the terms of the GNU General Public License as published by\n;; the Free Software Foundation, either version 3 of the License, or\n;; (at your option) any later version.\n\n;; pingwing is distributed in the hope that it will be useful,\n;; but WITHOUT ANY WARRANTY; without even the implied warranty of\n;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n;; GNU General Public License for more details.\n\n;; You should have received a copy of the GNU General Public License\n;; along with pingwing. If not, see <https://www.gnu.org/licenses/>.\n\n(define-module (pingwing templates system-alert)\n #:use-module (ice-9 time)\n #:use-module (ice-9 format)\n #:use-module (ice-9 rdelim)\n #:use-module (ice-9 textual-ports)\n #:use-module (ice-9 regex)\n #:use-module (srfi srfi-1)\n #:use-module (srfi srfi-64)\n #:use-module (pingwing css)\n #:use-module (pingwing html)\n #:use-module (ice-9 string-fun)\n #:use-module (sxml simple)\n #:use-module (ice-9 iconv))\n\n(begin\n (define* (system-alert-html-template #:key system-name alert-value)\n (let* (\n (tree `((html (head ,meta-charset\n ,meta-ie\n ,meta-responsive\n ,meta-color-scheme\n ,meta-supported-color-schemes\n (title ,(gettext \"System Alert\"))\n (style ,mail-style))\n (body (h1 (span ,(gettext\n \"System Alert: \"))\n (span ,system-name))\n (p ,(gettext\n \"An alert has been triggered from your system\"))\n (hr (@ (style ,(->style '((margin-top . \"1.4em\") (margin-bottom . \"1.4em\"))))))\n (p ,alert-value)\n ,mail-footer)))))\n (with-output-to-string (lambda ()\n (sxml->xml tree)))))\n (export system-alert-html-template))\n\n(begin\n (define* (system-alert-plain-template #:key system-name alert-value)\n (let* ((content (list (gettext \"System Alert\")\n (gettext\n \"An alert has been triggered from your system:\")\n system-name\n \"----------------------------------\"\n alert-value\n \"----------------------------------\"\n (gettext\n \"this e-mail was powered by pingwing - the free and open Lisp-powered notification nexus\")\n \"https://codeberg.org/jjba23/pingwing\"\n (gettext \"see pingwing's source code on Codeberg\"))))\n (string-join content \"\\n\")))\n (export system-alert-plain-template))\n```",
"mediaType": "text/markdown"
},
"attachment": [
{
"type": "Image",
"url": "https://lemmy.ml/pictrs/image/2fd4665e-3f04-4d1d-96a7-af47faaed9cb.png",
"name": "pingwing logo"
}
],
"image": {
"type": "Image",
"url": "https://lemmy.ml/pictrs/image/2fd4665e-3f04-4d1d-96a7-af47faaed9cb.png"
},
"sensitive": false,
"published": "2025-05-01T14:37:37.082989Z",
"updated": "2025-05-01T16:22:14.974693Z",
"language": {
"identifier": "en",
"name": "English"
},
"audience": "https://beehaw.org/c/foss",
"tag": [
{
"href": "https://lemmy.ml/post/29436906",
"name": "#foss",
"type": "Hashtag"
}
]
}