{"id":5160,"date":"2026-01-20T07:29:13","date_gmt":"2026-01-19T22:29:13","guid":{"rendered":"https:\/\/matoken.org\/blog\/?p=5160"},"modified":"2026-01-20T07:29:18","modified_gmt":"2026-01-19T22:29:18","slug":"snac-2-88-muted_words-strip_metadata","status":"publish","type":"post","link":"https:\/\/matoken.org\/blog\/2026\/01\/20\/snac-2-88-muted_words-strip_metadata\/","title":{"rendered":"\u8efd\u91cf\u306aActivityPub Server \u306esnac 2.88 \u3067\u30df\u30e5\u30fc\u30c8\u30ef\u30fc\u30c9\u3084\u30e1\u30bf\u30c7\u30fc\u30bf\u9664\u53bb\u6a5f\u80fd\u8ffd\u52a0"},"content":{"rendered":"<div id=\"preamble\">\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p><span class=\"image\"><img decoding=\"async\" src=\"https:\/\/matoken.org\/blog\/wp-content\/uploads\/2025\/12\/snac-susie.png\" alt=\"snac susie\" width=\"48\"><\/span><\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>\u30df\u30cb\u30de\u30e0\u3067\u8efd\u91cf\u306aActivityPub Server \u306esnac 2.88 \u304c\u30ea\u30ea\u30fc\u30b9\u3055\u308c\u307e\u3057\u305f\uff0e<\/p>\n<\/div>\n<div class=\"ulist\">\n<ul>\n<li>\n<p><a href=\"https:\/\/comam.es\/snac\/grunfink\/p\/1768294036.636803\">The Real Grunfink (@<a href=\"mailto:grunfink@comam.es\">grunfink@comam.es<\/a>)<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/codeberg.org\/grunfink\/snac2\/src\/branch\/master\/RELEASE_NOTES.md#2-88\">snac2\/RELEASE_NOTES.md at master &#8211; grunfink\/snac2 &#8211; Codeberg.org<\/a><\/p>\n<\/li>\n<\/ul>\n<\/div>\n<p><!--more--><\/p>\n<div class=\"quoteblock\">\n<blockquote>\n<div class=\"paragraph\">\n<p>2.88<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>If disable_emojireact is set to true in server.json, EmojiReacts (incoming and outgoing) are totally disabled.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>New command-line option top_ten, that returns the top ten most popular posts by a user (ordered by the sum of likes and boosts) (contributed by aov).<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Added a new set of per-user muted words; if a post contains any of them, it&#8217;s hidden behind a dropdown (contributed by byte).<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>If an account has a metadata named pronouns, it&#8217;s shown by the name (contributed by violette).<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Mastodon API: children of a post are returned recursively, not just the first level (contributed by violette).<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Implemented optional metadata stripping for images and videos using external tools (contributed by Stefano Marinelli).<\/p>\n<\/div>\n<\/blockquote>\n<div class=\"attribution\">\n&#8212; https:\/\/codeberg.org\/grunfink\/snac2\/src\/branch\/master\/RELEASE_NOTES.md#2-88\n<\/div>\n<\/div>\n<div class=\"paragraph\">\n<p>\u305d\u308c\u305e\u308c\u306ecommit \u306f\u3053\u306e\u3042\u305f\u308a\u3067\u3057\u3087\u3046\u304b<\/p>\n<\/div>\n<div class=\"ulist\">\n<ul>\n<li>\n<p><a href=\"https:\/\/codeberg.org\/grunfink\/snac2\/commit\/de9d546d70cfcbf3b2450b70039470c9a68ecdc6\">Added emoji categories. \u00b7 de9d546d70 &#8211; grunfink\/snac2 &#8211; Codeberg.org<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/codeberg.org\/grunfink\/snac2\/commit\/99375a7b664750c1288558f1d5c02b833a2e083c\">New command-line option top_ten. \u00b7 99375a7b66 &#8211; grunfink\/snac2 &#8211; Codeberg.org<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/codeberg.org\/grunfink\/snac2\/commit\/4a2a05c6a0b29742fb04a0247baad38b52df120c\">Merge pull request &#8216;user-specified word mutes and matching&#8217; (#518) from byte\/snac2:user_mutes into master \u00b7 4a2a05c6a0 &#8211; grunfink\/snac2 &#8211; Codeberg.org<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/codeberg.org\/grunfink\/snac2\/commit\/33b066733eb3f7f106056dcba42518e62de33588\">Merge pull request &#8216;simple cosmetic counters&#8217; (#519) from byte\/snac2:counters into master \u00b7 33b066733e &#8211; grunfink\/snac2 &#8211; Codeberg.org<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/codeberg.org\/grunfink\/snac2\/commit\/54bb1626d2c6b55b4c331946606a9986ba963225\">mastoapi: also return children of children. \u00b7 54bb1626d2 &#8211; grunfink\/snac2 &#8211; Codeberg.org<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/codeberg.org\/grunfink\/snac2\/commit\/3ffdf91a4c6e90b0738a767d75b80941500713e0\">Merge pull request &#8216;Implement metadata stripping for uploaded photos and videos&#8217; (#515) from draga79\/snac2:master into master \u00b7 3ffdf91a4c &#8211; grunfink\/snac2 &#8211; Codeberg.org<\/a><\/p>\n<\/li>\n<\/ul>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"sect1\">\n<h2 id=\"_\u7d75\u6587\u5b57\u30ea\u30a2\u30af\u30b7\u30e7\u30f3\u306e\u7121\u52b9\u8a2d\u5b9a\">\u7d75\u6587\u5b57\u30ea\u30a2\u30af\u30b7\u30e7\u30f3\u306e\u7121\u52b9\u8a2d\u5b9a<\/h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>\u4eca\u56de\u306e\u66f4\u65b0\u3067\uff0c\u30b5\u30fc\u30d0\u30fc\u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb\u306e <code>server.json<\/code> \u306e\u4e2d\u306b <code>disable_emojireact<\/code> \u304c\u8a2d\u5b9a\u3067\u304d\u308b\u3088\u3046\u306b\u306a\u308a\u307e\u3057\u305f\uff0e\u3053\u308c\u3092 <code>true<\/code> \u306b\u3059\u308b\u3053\u3068\u3067\u7d75\u6587\u5b57\u30ea\u30a2\u30af\u30b7\u30e7\u30f3\u306e\u9001\u53d7\u4fe1\u304c\u7121\u52b9\u5316\u3067\u304d\u307e\u3059\uff0e<br \/>\n\u81ea\u5206\u306f\u6709\u52b9\u306b\u3057\u305f\u3044\u306e\u3067\u3053\u306e\u8a2d\u5b9a\u306f\u30b9\u30eb\u30fc\uff0e<\/p>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre>$ man doc\/snac.8 | grep -A1 disable_emojireact\n       disable_emojireact\n                   If set to true, all EmojiReact support (for input and output) is disabled.<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"sect1\">\n<h2 id=\"_top_ten_\u30b3\u30de\u30f3\u30c9\">top_ten \u30b3\u30de\u30f3\u30c9<\/h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p><code>top_ten<\/code> \u3068\u3044\u3046\u65b0\u3057\u3044\u30b3\u30de\u30f3\u30c9\u30e9\u30a4\u30f3\u30aa\u30d7\u30b7\u30e7\u30f3\u304c\u5b9f\u88c5\u3055\u308c\u307e\u3057\u305f\uff0e\u3053\u308c\u3092\u5b9f\u884c\u3059\u308b\u3068\u5bfe\u8c61\u30e6\u30fc\u30b6\u30fc\u306e\u3044\u3044\u306d\u3068\u30d6\u30fc\u30b9\u30c8\u6570\u304b\u3089\u6700\u3082\u4eba\u6c17\u306e\u3042\u3063\u305f\u6295\u7a3f\u306e\u30c8\u30c3\u30d710\u304c\u8868\u793a\u3067\u304d\u307e\u3059\uff0e\u30aa\u30d7\u30b7\u30e7\u30f3\u3067\u6307\u5b9a\u4ef6\u6570\u306b\u3082\u3067\u304d\u307e\u3059\uff0e<\/p>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre>$ .\/snac2\/snac top_ten\nsnac 2.88 - A simple, minimalistic ActivityPub instance\nCopyright (c) 2022 - 2026 grunfink et al. \/ MIT license\n\ntop_ten {basedir} {uid} [{N}]        Prints the most popular posts\n$ .\/snac2\/snac top_ten snac-data matoken 5\nhttps:\/\/snac.matoken.org\/matoken\/p\/1768641700.668031 1\u2605 0\u21ba\nhttps:\/\/snac.matoken.org\/matoken\/p\/1768600460.460220 0\u2605 0\u21ba\nhttps:\/\/snac.matoken.org\/matoken\/p\/1768690681.713879 0\u2605 0\u21ba\nhttps:\/\/snac.matoken.org\/matoken\/p\/1768690814.893464 0\u2605 0\u21ba\nhttps:\/\/snac.matoken.org\/matoken\/p\/1768690913.716133 0\u2605 0\u21ba<\/pre>\n<\/div>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"title\"><code>man doc\/snac.1 | grep -A1 top_ten<\/code><\/div>\n<div class=\"content\">\n<pre>             top_ten basedir uid [N]\n                     Returns the ids of the top ten (or top N) most popular posts (considering the sum of likes and boosts).<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"sect1\">\n<h2 id=\"_\u30e6\u30fc\u30b6\u30fc\u30df\u30e5\u30fc\u30c8\u30ef\u30fc\u30c9\">\u30e6\u30fc\u30b6\u30fc\u30df\u30e5\u30fc\u30c8\u30ef\u30fc\u30c9<\/h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>\u30e6\u30fc\u30b6\u30fc\u3054\u3068\u306b\u30df\u30e5\u30fc\u30c8\u30ef\u30fc\u30c9\u304c\u8a2d\u5b9a\u3067\u304d\u308b\u3088\u3046\u306b\u306a\u308a\u307e\u3057\u305f\uff0e\u6295\u7a3f\u306b\u8a2d\u5b9a\u30ef\u30fc\u30c9\u304c\u542b\u307e\u308c\u3066\u3044\u305f\u5834\u5408\u96a0\u3055\u308c\u308b\u3088\u3046\u306b\u306a\u308a\u307e\u3059\uff0e<br \/>\n\u8a2d\u5b9a\u306f\uff0c\u5bfe\u8c61\u30a2\u30ab\u30a6\u30f3\u30c8\u306e\u300cprivate\u300d &#8594; \u300cMuted words&#8230;&#8203;\u300d\u306b\u3042\u308a\u307e\u3059\uff0e<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p><span class=\"image\"><img decoding=\"async\" src=\"https:\/\/matoken.org\/blog\/wp-content\/uploads\/2026\/01\/snac-2.88-muted_words.webp\" alt=\"snac 2.88 muted words\"><\/span><\/p>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"title\"><code>$ man doc\/snac.5 | grep muted<\/code><\/div>\n<div class=\"content\">\n<pre>       muted\/      This directory contains files which names are hashes of muted actors. The content is a line containing the actor URL.  Messages from these actors will be ignored on input and not shown in any timeline.<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"sect1\">\n<h2 id=\"_\u753b\u50cf\u3068\u30d3\u30c7\u30aa\u306e\u30e1\u30bf\u30c7\u30fc\u30bf\u9664\u53bb\">\u753b\u50cf\u3068\u30d3\u30c7\u30aa\u306e\u30e1\u30bf\u30c7\u30fc\u30bf\u9664\u53bb<\/h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>\u5916\u90e8\u30c4\u30fc\u30eb\u3092\u5229\u7528\u3057\u3066\u753b\u50cf\u3068\u30d3\u30c7\u30aa\u304b\u3089\u30e1\u30bf\u30c7\u30fc\u30bf\u3092\u9664\u53bb\u3067\u304d\u308b\u3088\u3046\u306b\u306a\u308a\u307e\u3057\u305f\uff0e<br \/>\n\u65e2\u5b9a\u5024\u3067\u306f\u7121\u52b9\u306b\u306a\u3063\u3066\u3044\u307e\u3059\uff0e\u6709\u52b9\u306b\u3057\u305f\u3044\u5834\u5408\u306f\uff0c<code>server.json<\/code> \u3067 <code>\"strip_exif\": true,<\/code> \u3092\u8a2d\u5b9a\u3057\u307e\u3059\uff0e<br \/>\n\u753b\u50cf\u306e\u30e1\u30bf\u30c7\u30fc\u30bf\u9664\u53bb\u306b\u306fImageMagick\u306emogrify \u3092\uff0c\u52d5\u753b\u306e\u30e1\u30bf\u30c7\u30fc\u30bf\u9664\u53bb\u306b\u306fffmpeg \u3092\u5229\u7528\u3057\u307e\u3059\uff0e\u5c0e\u5165\u3057\u3066\u3044\u306a\u3044\u5834\u5408\u306f\u5c0e\u5165\u304c\u5fc5\u8981\u3067\u3059\uff0e<br \/>\n\u5916\u90e8\u30c4\u30fc\u30eb\u304c\u30d1\u30b9\u306e\u901a\u3063\u3066\u3044\u306a\u3044\u5834\u6240\u306b\u3042\u308b\u5834\u5408\u306f\uff0c<code>mogrify_path<\/code>, <code>ffmpeg_path<\/code> \u3067\u6307\u5b9a\u53ef\u80fd\u3067\u3059\uff0e<\/p>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"title\"><code>server.json<\/code> \u8a2d\u5b9a\u4f8b<\/div>\n<div class=\"content\">\n<pre>    \"strip_exif\": true,\n    \"mogrify_path\": \"\/usr\/local\/bin\/mogrify\",\n    \"ffmpeg_path\": \"\/usr\/local\/bin\/ffmpeg\",<\/pre>\n<\/div>\n<\/div>\n<div class=\"paragraph\">\n<p>\u5b9f\u969b\u306bexif \u4ed8\u304d\u306e\u753b\u50cf\u3092\u6295\u7a3f\u3057\u3066\u78ba\u8a8d\u3057\u3066\u307f\u307e\u3059\uff0e<\/p>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"title\">\u30b5\u30f3\u30d7\u30eb\u753b\u50cf\u306e\u5165\u624b\u3068\u78ba\u8a8d<\/div>\n<div class=\"content\">\n<pre>$ wget https:\/\/raw.githubusercontent.com\/ianare\/exif-samples\/refs\/heads\/master\/jpg\/Pentax_K10D.jpg\n$ exif Pentax_K10D.jpg\nEXIF tags in '\/home\/matoken\/Downloads\/Pentax_K10D.jpg' ('Intel' byte order):\n--------------------+----------------------------------------------------------\nTag                 |Value\n--------------------+----------------------------------------------------------\nManufacturer        |PENTAX Corporation\nModel               |PENTAX K10D\nOrientation         |Top-left\nX-Resolution        |350\nY-Resolution        |350\nResolution Unit     |Inch\nSoftware            |GIMP 2.4.5\nDate and Time       |2008:07:31 15:56:49\nCopyright           |Laitche (This file is in the public domain.) (Photographer\nXP Author           |www.laitche.com\nCompression         |JPEG compression\nX-Resolution        |72\nY-Resolution        |72\nResolution Unit     |Inch\nExposure Time       |1\/180 sec.\nF-Number            |f\/11.0\nExposure Program    |Aperture priority\nISO Speed Ratings   |200\nExif Version        |Exif Version 2.21\nDate and Time (Origi|2008:05:04 16:47:24\nDate and Time (Digit|2008:05:04 16:47:24\nExposure Bias       |0.00 EV\nMetering Mode       |Pattern\nFlash               |Flash did not fire, compulsory flash mode\nFocal Length        |90.0 mm\nFlashPixVersion     |FlashPix Version 1.0\nColor Space         |sRGB\nPixel X Dimension   |100\nPixel Y Dimension   |72\nSensing Method      |One-chip color area sensor\n--------------------+----------------------------------------------------------\nEXIF data contains a thumbnail (1349 bytes).<\/pre>\n<\/div>\n<\/div>\n<div class=\"paragraph\">\n<p>exif \u4ed8\u304d\u306e\u753b\u50cf\u3092\u6295\u7a3f\u3057\u307e\u3059\uff0e<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p><span class=\"image\"><img decoding=\"async\" src=\"https:\/\/matoken.org\/blog\/wp-content\/uploads\/2026\/01\/snac-2.88-strip_exif.webp\" alt=\"snac 2.88 strip exif\"><\/span><\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>\u6295\u7a3f\u3055\u308c\u305f\u753b\u50cf\u3092\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9\u3057\u3066\u78ba\u8a8d\u3059\u308b\u3068exif \u306f\u6d88\u3048\u3066\u3044\u307e\u3057\u305f\uff0e<\/p>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre>$ wget http:\/\/127.0.0.1:8001\/test\/s\/post-d2e2931a72bbe1cafaaf94e82ea27e66.jpg\n$ exif .\/post-d2e2931a72bbe1cafaaf94e82ea27e66.jpg\nCorrupt data\nThe data provided does not follow the specification.\nExifLoader: The data supplied does not seem to contain EXIF data.<\/pre>\n<\/div>\n<\/div>\n<div class=\"paragraph\">\n<p>\u4ee5\u4e0b\u306e\u3088\u3046\u306a\u30b3\u30de\u30f3\u30c9\u3092\u767a\u884c\u3057\u3066\u3044\u308b\u3088\u3046\u3067\u3059\uff0e<\/p>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"title\">mogrify<\/div>\n<div class=\"content\">\n<pre>            xs *cmd = xs_fmt(\"cd \\\"%s\\\" &amp;&amp; %s -auto-orient -strip \\\"%s\\\" 2&gt;\/dev\/null\", srv_basedir, mp, r_fn);<\/pre>\n<\/div>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"title\">ffmpeg<\/div>\n<div class=\"content\">\n<pre> \t            \/* -map_metadata -1 strips all global metadata *\/\n\t            \/* -c copy copies input streams without re-encoding *\/\n\t            \/* we don't silence stderr so we can debug issues *\/\n\t            \/* we explicitly cd to srv_basedir to ensure relative paths work *\/\n\t            xs *cmd = xs_fmt(\"cd \\\"%s\\\" &amp;&amp; %s -y -i \\\"%s\\\" -map_metadata -1 -c copy \\\"%s\\\"\", srv_basedir, fp, r_fn, tmp_fn);<\/pre>\n<\/div>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"title\"><code>man doc\/snac.8 | grep -A1 metadata<\/code><\/div>\n<div class=\"content\">\n<pre>$ man doc\/snac.8 | grep strip_exif -A7\n       strip_exif  If  set  to  true,  EXIF and other metadata will be stripped from uploaded images (jpg, png, webp, heic, avif, tiff, gif, bmp) and videos (mp4, m4v, mov, webm, mkv, avi). This requires the mogrify (from ImageMagick) and\n                   ffmpeg tools to be installed. If snac cannot find or execute these tools at startup, it will refuse to run.\n\n       mogrify_path\n                   Overrides the default \"mogrify\" command name or path. Use this if the tool is not in the system PATH or has a different name.\n\n       ffmpeg_path\n                   Overrides the default \"ffmpeg\" command name or path. Use this if the tool is not in the system PATH or has a different name.<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>\u30df\u30cb\u30de\u30e0\u3067\u8efd\u91cf\u306aActivityPub Server \u306esnac 2.88 \u304c\u30ea\u30ea\u30fc\u30b9\u3055\u308c\u307e\u3057\u305f\uff0e The Real Grunfink (@grunfink@comam.es) snac2\/RELEASE_NOTES.m [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"webmentions_disabled_pings":false,"webmentions_disabled":false,"activitypub_content_warning":"","activitypub_content_visibility":"","activitypub_max_image_attachments":4,"activitypub_interaction_policy_quote":"anyone","activitypub_status":"federated","footnotes":""},"categories":[7,6,1231],"tags":[493,1243],"class_list":["post-5160","post","type-post","status-publish","format-standard","hentry","category-debian-linux","category-linux","category-trixie","tag-activitypub","tag-snac"],"_links":{"self":[{"href":"https:\/\/matoken.org\/blog\/wp-json\/wp\/v2\/posts\/5160","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/matoken.org\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/matoken.org\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/matoken.org\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/matoken.org\/blog\/wp-json\/wp\/v2\/comments?post=5160"}],"version-history":[{"count":1,"href":"https:\/\/matoken.org\/blog\/wp-json\/wp\/v2\/posts\/5160\/revisions"}],"predecessor-version":[{"id":5161,"href":"https:\/\/matoken.org\/blog\/wp-json\/wp\/v2\/posts\/5160\/revisions\/5161"}],"wp:attachment":[{"href":"https:\/\/matoken.org\/blog\/wp-json\/wp\/v2\/media?parent=5160"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/matoken.org\/blog\/wp-json\/wp\/v2\/categories?post=5160"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/matoken.org\/blog\/wp-json\/wp\/v2\/tags?post=5160"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}