From 4102a6a7ac7ab7c651fe0b03358148e8d15418cc Mon Sep 17 00:00:00 2001 From: "violette p." Date: Tue, 9 Dec 2025 04:58:13 +0100 Subject: make webpush use our notification server vkey instead of a random, ill-formated key (necessary for some client notifications, such as moshidon) --- doc/snac.8 | 2 ++ 1 file changed, 2 insertions(+) (limited to 'doc') diff --git a/doc/snac.8 b/doc/snac.8 index a6d925d..0dc0769 100644 --- a/doc/snac.8 +++ b/doc/snac.8 @@ -294,6 +294,8 @@ The URL to a favicon. If it's not set, the default one is used instead. The maximum number of days an instance is considered down after continuous failed outgoing messages (default: 15). Anyway, whenever any incoming activity from a failed instance is detected, this counter is reset for it. +.It Ic vkey +Public vapid key. Used for notification on some client. .El .Pp You must restart the server to make effective these changes. -- cgit From aefdd0169b0170c8c264374474e4eeeab2920cc9 Mon Sep 17 00:00:00 2001 From: violette Date: Fri, 19 Dec 2025 09:54:28 +0100 Subject: Updated CSS. --- doc/style.css | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'doc') diff --git a/doc/style.css b/doc/style.css index 5289332..2981926 100644 --- a/doc/style.css +++ b/doc/style.css @@ -32,7 +32,10 @@ blockquote { font-style: italic; } .snac-list-of-lists li { display: inline; border: 1px solid #a0a0a0; border-radius: 25px; margin-right: 0.5em; padding-left: 0.5em; padding-right: 0.5em; } .snac-no-more-unseen-posts { border-top: 1px solid #a0a0a0; border-bottom: 1px solid #a0a0a0; padding: 0.5em 0; margin: 1em 0; } -@media (prefers-color-scheme: dark) { +.snac-reaction { padding:5px; padding-left: 10px; padding-right: 10px; display: inline-flex; margin-right: 5px; font-family: inherit; font-size: medium; height: 2.5rem; vertical-align:middle; align-items:center;} +.snac-reaction-image { max-width: 100%; max-height: 100%; } +.snac-reaction-div { border-left: darkgray; border-left-style: solid; margin-bottom: .3em; padding-left: .3em; border-left-width: 2px; } +@media (prefers-color-scheme: dark) { body, input, textarea { background-color: #000; color: #fff; } a { color: #7799dd } a:visited { color: #aa99dd } -- cgit From 758c0a367fd873fa67f1afd196e9458e42985222 Mon Sep 17 00:00:00 2001 From: grunfink Date: Fri, 19 Dec 2025 10:30:33 +0100 Subject: Updated documentation. --- FEDERATION.md | 2 +- doc/snac.8 | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'doc') diff --git a/FEDERATION.md b/FEDERATION.md index 3e7ea31..02c97c1 100644 --- a/FEDERATION.md +++ b/FEDERATION.md @@ -37,7 +37,7 @@ ### Supported activities and objects - **Inbound**: `Follow`, `Accept`, `Create`, `Update`, `Delete`, `Announce`, `Like`, `EmojiReact`, `Undo` (for Follow/Like/Announce), and `Move` covering `Note`, `Question`, `Page`, `Article`, `Event`, and `Video`. -- **Outbound**: the same set, except for `EmojiReact` (normalised into `Like` internally) and `Create` currently emits `Note` and `Question` objects. +- **Outbound**: the same set. `Create` currently emits `Note` and `Question` objects. - Ordered collections: outboxes present the latest entries; follower/following collections hide membership by default. ### Delivery and moderation diff --git a/doc/snac.8 b/doc/snac.8 index 0dc0769..b8a75fa 100644 --- a/doc/snac.8 +++ b/doc/snac.8 @@ -407,7 +407,7 @@ objects, on input and output. .It Vt EmojiReact For .Vt Note -objects, on input. +objects, on input and output. .It Vt Announce For .Vt Note -- cgit From 688c54c87355b5424f33f7b089814460a74af594 Mon Sep 17 00:00:00 2001 From: Stefano Marinelli Date: Tue, 6 Jan 2026 11:02:36 +0100 Subject: Implement configurable EXIF stripping for uploaded media - Add `strip_exif` configuration option to enable metadata removal. - Add `mogrify_path` configuration to specify external tool location. - Implement strip_media using `mogrify -strip`. - Support multiple image formats: jpg, png, webp, heic, heif, avif, tiff, gif, bmp. - Add strict startup check: fail to start if `strip_exif` is enabled but `mogrify` is missing/broken. - Update documentation in `doc/snac.8`. --- data.c | 13 +++++++++++-- doc/snac.8 | 8 ++++++++ snac.c | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ snac.h | 3 +++ 4 files changed, 86 insertions(+), 2 deletions(-) (limited to 'doc') diff --git a/data.c b/data.c index 22ea7b0..f32dc81 100644 --- a/data.c +++ b/data.c @@ -89,8 +89,15 @@ int srv_open(const char *basedir, int auto_upgrade) else { if (xs_number_get(xs_dict_get(srv_config, "layout")) < disk_layout) error = xs_fmt("ERROR: disk layout changed - execute 'snac upgrade' first"); - else - ret = 1; + else { + if (!check_strip_tool()) { + const char *mp = xs_dict_get(srv_config, "mogrify_path"); + if (mp == NULL) mp = "mogrify"; + error = xs_fmt("ERROR: strip_exif enabled but '%s' not found or not working (set 'mogrify_path' in server.json)", mp); + } + else + ret = 1; + } } } @@ -2710,6 +2717,8 @@ void static_put(snac *snac, const char *id, const char *data, int size) if (fn && (f = fopen(fn, "wb")) != NULL) { fwrite(data, size, 1, f); fclose(f); + + strip_media(fn); } } diff --git a/doc/snac.8 b/doc/snac.8 index b8a75fa..8283ac6 100644 --- a/doc/snac.8 +++ b/doc/snac.8 @@ -296,6 +296,14 @@ outgoing messages (default: 15). Anyway, whenever any incoming activity from a failed instance is detected, this counter is reset for it. .It Ic vkey Public vapid key. Used for notification on some client. +.It Ic strip_exif +If set to true, EXIF metadata will be stripped from uploaded images (jpg, png, webp, heic, avif, tiff, gif, bmp). This requires the +.Nm mogrify +tool to be installed. If +.Nm snac +cannot find or execute the tool at startup, it will refuse to run. +.It Ic mogrify_path +Overrides the default "mogrify" command name or path. Use this if the tool is not in the system PATH or has a different name. .El .Pp You must restart the server to make effective these changes. diff --git a/snac.c b/snac.c index 965edbb..f4528cd 100644 --- a/snac.c +++ b/snac.c @@ -32,6 +32,7 @@ #include #include +#include xs_str *srv_basedir = NULL; xs_dict *srv_config = NULL; @@ -170,3 +171,66 @@ int check_password(const char *uid, const char *passwd, const char *hash) return ret; } + + +int strip_media(const char *fn) +/* strips EXIF data from a file */ +{ + int ret = 0; + const xs_val *v = xs_dict_get(srv_config, "strip_exif"); + + if (xs_type(v) == XSTYPE_TRUE) { + xs *l_fn = xs_tolower_i(xs_dup(fn)); + + /* check extensions */ + if (xs_endswith(l_fn, ".jpg") || xs_endswith(l_fn, ".jpeg") || + xs_endswith(l_fn, ".png") || xs_endswith(l_fn, ".webp") || + xs_endswith(l_fn, ".heic") || xs_endswith(l_fn, ".heif") || + xs_endswith(l_fn, ".avif") || xs_endswith(l_fn, ".tiff") || + xs_endswith(l_fn, ".gif") || xs_endswith(l_fn, ".bmp")) { + + const char *mp = xs_dict_get(srv_config, "mogrify_path"); + if (mp == NULL) + mp = "mogrify"; + + xs *cmd = xs_fmt("%s -strip \"%s\" 2>/dev/null", mp, fn); + + ret = system(cmd); + + if (ret != 0) { + int code = 0; + if (WIFEXITED(ret)) + code = WEXITSTATUS(ret); + + if (code == 127) + srv_log(xs_fmt("strip_media: error stripping %s. '%s' not found (exit 127). Set 'mogrify_path' in server.json.", fn, mp)); + else + srv_log(xs_fmt("strip_media: error stripping %s %d", fn, ret)); + } + else + srv_debug(1, xs_fmt("strip_media: stripped %s", fn)); + } + } + + return ret; +} + + +int check_strip_tool(void) +{ + const xs_val *v = xs_dict_get(srv_config, "strip_exif"); + int ret = 1; + + if (xs_type(v) == XSTYPE_TRUE) { + const char *mp = xs_dict_get(srv_config, "mogrify_path"); + if (mp == NULL) + mp = "mogrify"; + + xs *cmd = xs_fmt("%s -version 2>/dev/null >/dev/null", mp); + + if (system(cmd) != 0) + ret = 0; + } + + return ret; +} diff --git a/snac.h b/snac.h index 8a7dad6..c307dbd 100644 --- a/snac.h +++ b/snac.h @@ -105,6 +105,9 @@ int validate_uid(const char *uid); xs_str *hash_password(const char *uid, const char *passwd, const char *nonce); int check_password(const char *uid, const char *passwd, const char *hash); +int strip_media(const char *fn); +int check_strip_tool(void); + void srv_archive(const char *direction, const char *url, xs_dict *req, const char *payload, int p_size, int status, xs_dict *headers, -- cgit From 03d270a56b751bc53b83381d9fef21da8d4cbb91 Mon Sep 17 00:00:00 2001 From: Stefano Marinelli Date: Tue, 6 Jan 2026 12:18:00 +0100 Subject: Implement metadata stripping for uploaded videos - Extend `strip_media` to support video files using `ffmpeg`. - Use `ffmpeg -map_metadata -1 -c copy` to strip global metadata. - Support formats: mp4, m4v, mov, webm, mkv, avi. - Add `ffmpeg_path` configuration option. - Implement robust relative path handling (`user/` heuristic) to support jailed environments. - Enforce strict checks on startup: fail if tools (mogrify/ffmpeg) are missing when enabled. --- doc/snac.8 | 10 ++++-- snac.c | 112 ++++++++++++++++++++++++++++++++++++++++++++++++++++++------- 2 files changed, 106 insertions(+), 16 deletions(-) (limited to 'doc') diff --git a/doc/snac.8 b/doc/snac.8 index 8283ac6..c53bb59 100644 --- a/doc/snac.8 +++ b/doc/snac.8 @@ -297,13 +297,17 @@ failed instance is detected, this counter is reset for it. .It Ic vkey Public vapid key. Used for notification on some client. .It Ic strip_exif -If set to true, EXIF metadata will be stripped from uploaded images (jpg, png, webp, heic, avif, tiff, gif, bmp). This requires the +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 .Nm mogrify -tool to be installed. If +(from ImageMagick) and +.Nm ffmpeg +tools to be installed. If .Nm snac -cannot find or execute the tool at startup, it will refuse to run. +cannot find or execute these tools at startup, it will refuse to run. .It Ic mogrify_path Overrides the default "mogrify" command name or path. Use this if the tool is not in the system PATH or has a different name. +.It Ic ffmpeg_path +Overrides the default "ffmpeg" command name or path. Use this if the tool is not in the system PATH or has a different name. .El .Pp You must restart the server to make effective these changes. diff --git a/snac.c b/snac.c index f4528cd..a3ba6b7 100644 --- a/snac.c +++ b/snac.c @@ -33,6 +33,8 @@ #include #include #include +#include +#include xs_str *srv_basedir = NULL; xs_dict *srv_config = NULL; @@ -177,12 +179,25 @@ int strip_media(const char *fn) /* strips EXIF data from a file */ { int ret = 0; + const xs_val *v = xs_dict_get(srv_config, "strip_exif"); if (xs_type(v) == XSTYPE_TRUE) { - xs *l_fn = xs_tolower_i(xs_dup(fn)); + /* Heuristic: find 'user/' in the path to make it relative */ + /* This works for ~/user/..., /var/snac/user/..., etc. */ + const char *r_fn = strstr(fn, "user/"); + + if (r_fn == NULL) { + /* Fallback: try to strip ~/ if present */ + if (strncmp(fn, "~/", 2) == 0) + r_fn = fn + 2; + else + r_fn = fn; + } - /* check extensions */ + xs *l_fn = xs_tolower_i(xs_dup(r_fn)); + + /* check image extensions */ if (xs_endswith(l_fn, ".jpg") || xs_endswith(l_fn, ".jpeg") || xs_endswith(l_fn, ".png") || xs_endswith(l_fn, ".webp") || xs_endswith(l_fn, ".heic") || xs_endswith(l_fn, ".heif") || @@ -193,7 +208,7 @@ int strip_media(const char *fn) if (mp == NULL) mp = "mogrify"; - xs *cmd = xs_fmt("%s -strip \"%s\" 2>/dev/null", mp, fn); + xs *cmd = xs_fmt("cd \"%s\" && %s -auto-orient -strip \"%s\" 2>/dev/null", srv_basedir, mp, r_fn); ret = system(cmd); @@ -203,12 +218,64 @@ int strip_media(const char *fn) code = WEXITSTATUS(ret); if (code == 127) - srv_log(xs_fmt("strip_media: error stripping %s. '%s' not found (exit 127). Set 'mogrify_path' in server.json.", fn, mp)); + srv_log(xs_fmt("strip_media: error stripping %s. '%s' not found (exit 127). Set 'mogrify_path' in server.json.", r_fn, mp)); else - srv_log(xs_fmt("strip_media: error stripping %s %d", fn, ret)); + srv_log(xs_fmt("strip_media: error stripping %s %d", r_fn, ret)); } else - srv_debug(1, xs_fmt("strip_media: stripped %s", fn)); + srv_debug(1, xs_fmt("strip_media: stripped %s", r_fn)); + } + else + /* check video extensions */ + if (xs_endswith(l_fn, ".mp4") || xs_endswith(l_fn, ".m4v") || + xs_endswith(l_fn, ".mov") || xs_endswith(l_fn, ".webm") || + xs_endswith(l_fn, ".mkv") || xs_endswith(l_fn, ".avi")) { + + const char *fp = xs_dict_get(srv_config, "ffmpeg_path"); + if (fp == NULL) + fp = "ffmpeg"; + + /* ffmpeg cannot modify in-place, so we need a temp file */ + /* we must preserve valid extension for ffmpeg to guess the format */ + const char *ext = strrchr(r_fn, '.'); + if (ext == NULL) ext = ""; + xs *tmp_fn = xs_fmt("%s.tmp%s", r_fn, ext); + + /* -map_metadata -1 strips all global metadata */ + /* -c copy copies input streams without re-encoding */ + /* we don't silence stderr so we can debug issues */ + /* we explicitly cd to srv_basedir to ensure relative paths work */ + xs *cmd = xs_fmt("cd \"%s\" && %s -y -i \"%s\" -map_metadata -1 -c copy \"%s\"", srv_basedir, fp, r_fn, tmp_fn); + + ret = system(cmd); + + if (ret != 0) { + int code = 0; + if (WIFEXITED(ret)) + code = WEXITSTATUS(ret); + + if (code == 127) + srv_log(xs_fmt("strip_media: error stripping %s. '%s' not found (exit 127). Set 'ffmpeg_path' in server.json.", r_fn, fp)); + else { + srv_log(xs_fmt("strip_media: error stripping %s %d", r_fn, ret)); + srv_log(xs_fmt("strip_media: command was: %s", cmd)); + } + + /* try to cleanup, just in case */ + /* unlink needs full path too if we are not in basedir */ + xs *full_tmp_fn = xs_fmt("%s/%s", srv_basedir, tmp_fn); + unlink(full_tmp_fn); + } + else { + /* rename tmp file to original */ + /* use full path for source because it was created relative to basedir */ + xs *full_tmp_fn = xs_fmt("%s/%s", srv_basedir, tmp_fn); + + if (rename(full_tmp_fn, fn) == 0) + srv_debug(1, xs_fmt("strip_media: stripped %s", fn)); + else + srv_log(xs_fmt("strip_media: error renaming %s to %s", full_tmp_fn, fn)); + } } } @@ -222,14 +289,33 @@ int check_strip_tool(void) int ret = 1; if (xs_type(v) == XSTYPE_TRUE) { - const char *mp = xs_dict_get(srv_config, "mogrify_path"); - if (mp == NULL) - mp = "mogrify"; + /* check mogrify */ + { + const char *mp = xs_dict_get(srv_config, "mogrify_path"); + if (mp == NULL) + mp = "mogrify"; - xs *cmd = xs_fmt("%s -version 2>/dev/null >/dev/null", mp); - - if (system(cmd) != 0) - ret = 0; + xs *cmd = xs_fmt("%s -version 2>/dev/null >/dev/null", mp); + + if (system(cmd) != 0) { + srv_log(xs_fmt("check_strip_tool: '%s' not working", mp)); + ret = 0; + } + } + + /* check ffmpeg */ + if (ret) { + const char *fp = xs_dict_get(srv_config, "ffmpeg_path"); + if (fp == NULL) + fp = "ffmpeg"; + + xs *cmd = xs_fmt("%s -version 2>/dev/null >/dev/null", fp); + + if (system(cmd) != 0) { + srv_log(xs_fmt("check_strip_tool: '%s' not working", fp)); + ret = 0; + } + } } return ret; -- cgit From cef1d7a176b7603491dfec3f394c1b34bf765f2c Mon Sep 17 00:00:00 2001 From: grunfink Date: Thu, 8 Jan 2026 08:51:04 +0100 Subject: Updated documentation. --- doc/snac.8 | 2 ++ 1 file changed, 2 insertions(+) (limited to 'doc') diff --git a/doc/snac.8 b/doc/snac.8 index b8a75fa..6f98648 100644 --- a/doc/snac.8 +++ b/doc/snac.8 @@ -296,6 +296,8 @@ outgoing messages (default: 15). Anyway, whenever any incoming activity from a failed instance is detected, this counter is reset for it. .It Ic vkey Public vapid key. Used for notification on some client. +.It Ic disable_emojireact +If set to true, all EmojiReact support (for input and output) is disabled. .El .Pp You must restart the server to make effective these changes. -- cgit From 512481e6f8d92a1485b69bd00cec22fa7b8fc073 Mon Sep 17 00:00:00 2001 From: grunfink Date: Sat, 10 Jan 2026 21:32:14 +0100 Subject: Updated documentation. --- doc/snac.1 | 3 +++ 1 file changed, 3 insertions(+) (limited to 'doc') diff --git a/doc/snac.1 b/doc/snac.1 index cabd623..eb27fe5 100644 --- a/doc/snac.1 +++ b/doc/snac.1 @@ -405,6 +405,9 @@ Removes an existing list. Adds an account (by its @name@host handle or actor URL) to a list. .It Cm list_del Ar basedir Ar uid Ar name Ar actor_url Deletes an actor (by its actor URL) from a list. +.It Cm top_ten Ar basedir Ar uid Op N +Returns the ids of the top ten (or top N) most popular posts (considering the +sum of likes and boosts). .El .Ss Migrating an account to/from Mastodon See -- cgit From f5ad346f7d819a1fe71ac6f1bc98e16fe1aead01 Mon Sep 17 00:00:00 2001 From: violette Date: Mon, 12 Jan 2026 05:09:21 +0100 Subject: Use the metadata pronouns. --- doc/style.css | 1 + html.c | 38 ++++++++++++++++++++++++++++++++++++++ utils.c | 1 + 3 files changed, 40 insertions(+) (limited to 'doc') diff --git a/doc/style.css b/doc/style.css index 2981926..9c8764a 100644 --- a/doc/style.css +++ b/doc/style.css @@ -40,3 +40,4 @@ blockquote { font-style: italic; } a { color: #7799dd } a:visited { color: #aa99dd } } +select { max-width: 40%; } diff --git a/html.c b/html.c index ebd9331..9aaaa50 100644 --- a/html.c +++ b/html.c @@ -162,6 +162,31 @@ xs_str *actor_name(xs_dict *actor, const char *proxy) } +xs_str *actor_pronouns(xs_dict *actor) +/* gets the actor name */ +{ + const xs_list *attachment; + const xs_dict *d; + const char *pronouns = ""; + char *ret; + + if (!xs_is_null((attachment = xs_dict_get(actor, "attachment")))) { + xs_list_foreach(attachment, d) { + char *prop = xs_utf8_to_lower(xs_dict_get(d, "name")); + /* make sure that we are reading the correct metadata */ + if (strlen(prop) == 8 && strcmp(prop, "pronouns") == 0) + pronouns = xs_dict_get(d, "value"); + } + } + + /*

breaks page, cannot nest them */ + ret = xs_replace_i(xs_dup(pronouns), "

", ""); + ret = xs_replace_i(ret, "

", ""); + + return ret; +} + + xs_str *format_text_with_emoji(snac *user, const char *text, int ems, const char *proxy) /* needed when we have local text with no tags attached */ { @@ -195,6 +220,10 @@ xs_html *html_actor_icon(snac *user, xs_dict *actor, const char *date, int fwer = 0; xs *name = actor_name(actor, proxy); + xs *pronouns = actor_pronouns(actor); + char pronouns_c = 0; + if (*pronouns != '\0') + pronouns_c = 1; /* get the avatar */ if ((v = xs_dict_get(actor, "icon")) != NULL) { @@ -251,6 +280,15 @@ xs_html *html_actor_icon(snac *user, xs_dict *actor, const char *date, xs_html_text("ยป"))); } + if (pronouns_c > 0) + xs_html_add(actor_icon, + xs_html_text(" "), + xs_html_tag("span", + xs_html_attr("class", "snac-pronouns"), + xs_html_attr("title", "user's pronouns"), + xs_html_raw(pronouns))); + + if (strcmp(xs_dict_get(actor, "type"), "Service") == 0) { xs_html_add(actor_icon, xs_html_text(" "), diff --git a/utils.c b/utils.c index fd077f6..9f4e1b7 100644 --- a/utils.c +++ b/utils.c @@ -88,6 +88,7 @@ static const char * const default_css = " a { color: #7799dd }\n" " a:visited { color: #aa99dd }\n" "}\n" + "select { max-width: 40%; }\n" ; const char *snac_blurb = -- cgit From 181132331d744065b13e5c6134b39335c51940f5 Mon Sep 17 00:00:00 2001 From: grunfink Date: Mon, 12 Jan 2026 05:43:02 +0100 Subject: Updated documentation. --- doc/snac.1 | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) (limited to 'doc') diff --git a/doc/snac.1 b/doc/snac.1 index eb27fe5..dbf63f4 100644 --- a/doc/snac.1 +++ b/doc/snac.1 @@ -110,6 +110,9 @@ URLs to RSS feeds of ActivityPub objects are also allowed .It Blocked hashtags... Enter here the list of hashtags you want to block, one per line, with or without the # symbol. +.It Muted words... +Enter here a list of words to be silenced. If a post includes +any of this words, it's hidden behind a dropdown. .El .Pp The user setup dialog allows some user information to be @@ -218,13 +221,20 @@ also private and cannot be liked nor boosted. For each entry in the timeline, a set of reasonable actions in the form of buttons will be shown. These can be: .Bl -tag -offset indent -.It Reply +.It Reply... Unveils a text area to write your intelligent and acute comment to an uninformed fellow. This note is sent to the original author as well as to your followers. The note can include mentions in the @user@format; these people will also become recipients of the message. If you reply to a boost or like, you are really replying to the note, not to the admirer of it. +.It Emoji react... +Unveils a text area that allows a user to react with an emoji +by typing its identifier, that should match one of the emojis +defined in the +.Pa emojis.json +file. By now, only those emoji identifiers surrounded by colons +can be used. .It Like Click this if you admire this post. The poster and your followers will be informed. -- cgit From 9a5f67bd30511291f7ac9a13a56fb5611b4350cf Mon Sep 17 00:00:00 2001 From: grunfink Date: Mon, 12 Jan 2026 14:26:43 +0100 Subject: Revert "Updated documentation." This reverts commit cef1d7a176b7603491dfec3f394c1b34bf765f2c. --- doc/snac.8 | 2 -- 1 file changed, 2 deletions(-) (limited to 'doc') diff --git a/doc/snac.8 b/doc/snac.8 index 6f98648..b8a75fa 100644 --- a/doc/snac.8 +++ b/doc/snac.8 @@ -296,8 +296,6 @@ outgoing messages (default: 15). Anyway, whenever any incoming activity from a failed instance is detected, this counter is reset for it. .It Ic vkey Public vapid key. Used for notification on some client. -.It Ic disable_emojireact -If set to true, all EmojiReact support (for input and output) is disabled. .El .Pp You must restart the server to make effective these changes. -- cgit From cf2335c3a65ace85bc49ec0db8a92617280da35a Mon Sep 17 00:00:00 2001 From: grunfink Date: Mon, 12 Jan 2026 14:31:42 +0100 Subject: Updated documentation. --- doc/snac.8 | 2 ++ 1 file changed, 2 insertions(+) (limited to 'doc') diff --git a/doc/snac.8 b/doc/snac.8 index c53bb59..d961ed2 100644 --- a/doc/snac.8 +++ b/doc/snac.8 @@ -296,6 +296,8 @@ outgoing messages (default: 15). Anyway, whenever any incoming activity from a failed instance is detected, this counter is reset for it. .It Ic vkey Public vapid key. Used for notification on some client. +.It Ic disable_emojireact +If set to true, all EmojiReact support (for input and output) is disabled. .It Ic 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 .Nm mogrify -- cgit