CINXE.COM

fep/fep/2677/fep-2677.md at main - fediverse/fep - Codeberg.org

<!DOCTYPE html> <html lang="en-US" data-theme="codeberg-auto"> <head> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>fep/fep/2677/fep-2677.md at main - fediverse/fep - Codeberg.org</title> <link rel="manifest" href="data:application/json;base64,eyJuYW1lIjoiQ29kZWJlcmcub3JnIiwic2hvcnRfbmFtZSI6IkNvZGViZXJnLm9yZyIsInN0YXJ0X3VybCI6Imh0dHBzOi8vY29kZWJlcmcub3JnLyIsImljb25zIjpbeyJzcmMiOiJodHRwczovL2NvZGViZXJnLm9yZy9hc3NldHMvaW1nL2xvZ28ucG5nIiwidHlwZSI6ImltYWdlL3BuZyIsInNpemVzIjoiNTEyeDUxMiJ9LHsic3JjIjoiaHR0cHM6Ly9jb2RlYmVyZy5vcmcvYXNzZXRzL2ltZy9sb2dvLnN2ZyIsInR5cGUiOiJpbWFnZS9zdmcreG1sIiwic2l6ZXMiOiI1MTJ4NTEyIn1dfQ=="> <meta name="author" content="fediverse"> <meta name="description" content="fep - Fediverse Enhancement Proposals"> <meta name="keywords" content="git,non-profit,foss,oss,free,software,open,source,code,hosting"> <meta name="referrer" content="no-referrer"> <link rel="alternate" type="application/atom+xml" title="" href="/fediverse/fep.atom"> <link rel="alternate" type="application/rss+xml" title="" href="/fediverse/fep.rss"> <link rel="icon" href="/assets/img/favicon.svg" type="image/svg+xml"> <link rel="alternate icon" href="/assets/img/favicon.png" type="image/png"> <script> window.addEventListener('error', function(e) {window._globalHandlerErrors=window._globalHandlerErrors||[]; window._globalHandlerErrors.push(e);}); window.addEventListener('unhandledrejection', function(e) {window._globalHandlerErrors=window._globalHandlerErrors||[]; window._globalHandlerErrors.push(e);}); window.config = { appUrl: 'https:\/\/codeberg.org\/', appSubUrl: '', assetVersionEncoded: encodeURIComponent('9.0.0-193-ea8bf18dd7~gitea-1.22.0'), assetUrlPrefix: '\/assets', runModeIsProd: true , customEmojis: {"codeberg":":codeberg:","forgejo":":forgejo:","git":":git:","gitea":":gitea:","github":":github:","gitlab":":gitlab:","gogs":":gogs:"}, csrfToken: 'CMM9CPqW6keRVrGRVju3C9tWMB06MTczMzE3NzcxNjU3ODY3ODQ4MA', pageData: {}, notificationSettings: {"EventSourceUpdateTime":10000,"MaxTimeout":60000,"MinTimeout":10000,"TimeoutStep":10000}, enableTimeTracking: true , mermaidMaxSourceCharacters: 5000 , i18n: { copy_success: "Copied!", copy_error: "Copy failed", error_occurred: "An error occurred", network_error: "Network error", remove_label_str: "Remove item \"%s\"", modal_confirm: "Confirm", modal_cancel: "Cancel", more_items: "More items", }, }; window.config.pageData = window.config.pageData || {}; </script> <script src="/assets/js/webcomponents.js?v=9.0.0-193-ea8bf18dd7~gitea-1.22.0"></script> <noscript> <style> .dropdown:hover > .menu { display: block; } .ui.secondary.menu .dropdown.item > .menu { margin-top: 0; } </style> </noscript> <meta property="og:title" content="fep/fep/2677/fep-2677.md at main"> <meta property="og:url" content="https://codeberg.org//fediverse/fep/src/branch/main/fep/2677/fep-2677.md"> <meta property="og:type" content="object"> <meta property="og:image" content="https://codeberg.org/repo-avatars/28250-3aeae3ea159b5c8fc690746e003c00e5"> <meta property="og:site_name" content="Codeberg.org"> <link rel="stylesheet" href="/assets/css/index.css?v=9.0.0-193-ea8bf18dd7~gitea-1.22.0"> <link rel="stylesheet" href="/assets/css/theme-codeberg-auto.css?v=9.0.0-193-ea8bf18dd7~gitea-1.22.0"> </head> <body hx-headers='{"x-csrf-token": "CMM9CPqW6keRVrGRVju3C9tWMB06MTczMzE3NzcxNjU3ODY3ODQ4MA"}' hx-swap="outerHTML" hx-ext="morph" hx-push-url="false"> <div class="full height"> <noscript>This website requires JavaScript.</noscript> <nav id="navbar" aria-label="Navigation bar"> <div class="navbar-left ui secondary menu"> <a class="item" id="navbar-logo" href="/" aria-label="Home"> <img width="30" height="30" src="https://design.codeberg.org/logo-kit/icon_inverted.svg" aria-hidden="true"> </a> <div class="ui secondary menu item navbar-mobile-right only-mobile"> <button class="item tw-w-auto ui icon mini button tw-p-2 tw-m-0" id="navbar-expand-toggle" aria-label="Toggle menu"><svg viewBox="0 0 16 16" class="svg octicon-three-bars" aria-hidden="true" width="16" height="16"><path d="M1 2.75A.75.75 0 0 1 1.75 2h12.5a.75.75 0 0 1 0 1.5H1.75A.75.75 0 0 1 1 2.75m0 5A.75.75 0 0 1 1.75 7h12.5a.75.75 0 0 1 0 1.5H1.75A.75.75 0 0 1 1 7.75M1.75 12h12.5a.75.75 0 0 1 0 1.5H1.75a.75.75 0 0 1 0-1.5"/></svg></button> </div> <a class="item" href="/explore/repos">Explore</a> <a class="item" target="_blank" href="https://docs.codeberg.org/getting-started/what-is-codeberg/#what-is-codeberg-e.v.%3F">About</a> <a class="item" target="_blank" href="https://docs.codeberg.org/getting-started/faq/">FAQ</a> <a class="item" target="_blank" href="https://docs.codeberg.org/improving-codeberg/#donate-to-codeberg">Donate</a> <a class="item" target="_blank" rel="noopener noreferrer" href="https://docs.codeberg.org">Help</a> </div> <div class="navbar-right ui secondary menu"> <a class="item" href="/user/cbrgp/YruaRM4"> <svg viewBox="0 0 16 16" class="svg octicon-person" aria-hidden="true" width="16" height="16"><path d="M10.561 8.073a6 6 0 0 1 3.432 5.142.75.75 0 1 1-1.498.07 4.5 4.5 0 0 0-8.99 0 .75.75 0 0 1-1.498-.07 6 6 0 0 1 3.431-5.142 3.999 3.999 0 1 1 5.123 0M10.5 5a2.5 2.5 0 1 0-5 0 2.5 2.5 0 0 0 5 0"/></svg> Register </a> <a class="item" rel="nofollow" href="/user/login?redirect_to=%2ffediverse%2ffep%2fsrc%2fbranch%2fmain%2ffep%2f2677%2ffep-2677.md"> <svg viewBox="0 0 16 16" class="svg octicon-sign-in" aria-hidden="true" width="16" height="16"><path d="M2 2.75C2 1.784 2.784 1 3.75 1h2.5a.75.75 0 0 1 0 1.5h-2.5a.25.25 0 0 0-.25.25v10.5c0 .138.112.25.25.25h2.5a.75.75 0 0 1 0 1.5h-2.5A1.75 1.75 0 0 1 2 13.25Zm6.56 4.5h5.69a.75.75 0 0 1 0 1.5H8.56l1.97 1.97a.749.749 0 0 1-.326 1.275.75.75 0 0 1-.734-.215L6.22 8.53a.75.75 0 0 1 0-1.06l3.25-3.25a.749.749 0 0 1 1.275.326.75.75 0 0 1-.215.734Z"/></svg> Sign in </a> </div> </nav> <div role="main" aria-label="fep/fep/2677/fep-2677.md at main" class="page-content repository file list "> <div class="secondary-nav"> <div class="ui container"> <div class="repo-header"> <div class="flex-item tw-items-center"> <div class="flex-item-leading"> <img class="ui avatar tw-align-middle" src="/repo-avatars/28250-3aeae3ea159b5c8fc690746e003c00e5" width="24" height="24" alt="fediverse/fep"> </div> <div class="flex-item-main"> <div class="flex-item-title gt-font-18"> <a class="muted gt-font-normal" href="/fediverse">fediverse</a>/<a class="muted" href="/fediverse/fep">fep</a> </div> </div> <div class="flex-item-trailing"> </div> </div> <div class="repo-buttons button-row"> <a class="ui compact small basic button" href="/fediverse/fep.rss" data-tooltip-content="RSS feed"> <svg viewBox="0 0 16 16" class="svg octicon-rss" aria-hidden="true" width="16" height="16"><path d="M2.002 2.725a.75.75 0 0 1 .797-.699C8.79 2.42 13.58 7.21 13.974 13.201a.75.75 0 0 1-1.497.098 10.5 10.5 0 0 0-9.776-9.776.747.747 0 0 1-.7-.798ZM2.84 7.05h-.002a7 7 0 0 1 6.113 6.111.75.75 0 0 1-1.49.178 5.5 5.5 0 0 0-4.8-4.8.75.75 0 0 1 .179-1.489M2 13a1 1 0 1 1 2 0 1 1 0 0 1-2 0"/></svg> </a> <form hx-boost="true" hx-target="this" method="post" action="/fediverse/fep/action/watch"> <div class="ui labeled button" data-tooltip-content="Sign in to watch this repository."> <button type="submit" class="ui compact small basic button" disabled> <svg viewBox="0 0 16 16" class="svg octicon-eye" aria-hidden="true" width="16" height="16"><path d="M8 2c1.981 0 3.671.992 4.933 2.078 1.27 1.091 2.187 2.345 2.637 3.023a1.62 1.62 0 0 1 0 1.798c-.45.678-1.367 1.932-2.637 3.023C11.67 13.008 9.981 14 8 14s-3.671-.992-4.933-2.078C1.797 10.83.88 9.576.43 8.898a1.62 1.62 0 0 1 0-1.798c.45-.677 1.367-1.931 2.637-3.022C4.33 2.992 6.019 2 8 2M1.679 7.932a.12.12 0 0 0 0 .136c.411.622 1.241 1.75 2.366 2.717C5.176 11.758 6.527 12.5 8 12.5s2.825-.742 3.955-1.715c1.124-.967 1.954-2.096 2.366-2.717a.12.12 0 0 0 0-.136c-.412-.621-1.242-1.75-2.366-2.717C10.824 4.242 9.473 3.5 8 3.5s-2.825.742-3.955 1.715c-1.124.967-1.954 2.096-2.366 2.717M8 10a2 2 0 1 1-.001-3.999A2 2 0 0 1 8 10"/></svg><span class="text not-mobile">Watch</span> </button> <a hx-boost="false" class="ui basic label" href="/fediverse/fep/watchers"> 27 </a> </div> </form> <form hx-boost="true" hx-target="this" method="post" action="/fediverse/fep/action/star"> <div class="ui labeled button" data-tooltip-content="Sign in to star this repository."> <button type="submit" class="ui compact small basic button" disabled> <svg viewBox="0 0 16 16" class="svg octicon-star" aria-hidden="true" width="16" height="16"><path d="M8 .25a.75.75 0 0 1 .673.418l1.882 3.815 4.21.612a.75.75 0 0 1 .416 1.279l-3.046 2.97.719 4.192a.751.751 0 0 1-1.088.791L8 12.347l-3.766 1.98a.75.75 0 0 1-1.088-.79l.72-4.194L.818 6.374a.75.75 0 0 1 .416-1.28l4.21-.611L7.327.668A.75.75 0 0 1 8 .25m0 2.445L6.615 5.5a.75.75 0 0 1-.564.41l-3.097.45 2.24 2.184a.75.75 0 0 1 .216.664l-.528 3.084 2.769-1.456a.75.75 0 0 1 .698 0l2.77 1.456-.53-3.084a.75.75 0 0 1 .216-.664l2.24-2.183-3.096-.45a.75.75 0 0 1-.564-.41z"/></svg><span class="text not-mobile">Star</span> </button> <a hx-boost="false" class="ui basic label" href="/fediverse/fep/stars"> 156 </a> </div> </form> <div class="ui labeled button disabled " data-tooltip-content="Sign in to fork this repository." > <a class="ui compact small basic button" > <svg viewBox="0 0 16 16" class="svg octicon-repo-forked" aria-hidden="true" width="16" height="16"><path d="M5 5.372v.878c0 .414.336.75.75.75h4.5a.75.75 0 0 0 .75-.75v-.878a2.25 2.25 0 1 1 1.5 0v.878a2.25 2.25 0 0 1-2.25 2.25h-1.5v2.128a2.251 2.251 0 1 1-1.5 0V8.5h-1.5A2.25 2.25 0 0 1 3.5 6.25v-.878a2.25 2.25 0 1 1 1.5 0M5 3.25a.75.75 0 1 0-1.5 0 .75.75 0 0 0 1.5 0m6.75.75a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5m-3 8.75a.75.75 0 1 0-1.5 0 .75.75 0 0 0 1.5 0"/></svg><span class="text not-mobile">Fork</span> </a> <div class="ui small modal" id="fork-repo-modal"> <div class="header"> You've already forked fep </div> <div class="content tw-text-left"> <div class="ui list"> </div> </div> </div> <a class="ui basic label" href="/fediverse/fep/forks"> 66 </a> </div> </div> </div> </div> <overflow-menu class="ui container secondary pointing tabular top attached borderless menu tw-pt-0 tw-my-0"> <div class="overflow-menu-items"> <a class="active item" href="/fediverse/fep"> <svg viewBox="0 0 16 16" class="svg octicon-code" aria-hidden="true" width="16" height="16"><path d="m11.28 3.22 4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.275-.326.75.75 0 0 1 .215-.734L13.94 8l-3.72-3.72a.749.749 0 0 1 .326-1.275.75.75 0 0 1 .734.215m-6.56 0a.75.75 0 0 1 1.042.018.75.75 0 0 1 .018 1.042L2.06 8l3.72 3.72a.749.749 0 0 1-.326 1.275.75.75 0 0 1-.734-.215L.47 8.53a.75.75 0 0 1 0-1.06Z"/></svg> Code </a> <a class="item" href="/fediverse/fep/issues"> <svg viewBox="0 0 16 16" class="svg octicon-issue-opened" aria-hidden="true" width="16" height="16"><path d="M8 9.5a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3"/><path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0M1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0"/></svg> Issues <span class="ui small label">99</span> </a> <a class="item" href="/fediverse/fep/pulls"> <svg viewBox="0 0 16 16" class="svg octicon-git-pull-request" aria-hidden="true" width="16" height="16"><path d="M1.5 3.25a2.25 2.25 0 1 1 3 2.122v5.256a2.251 2.251 0 1 1-1.5 0V5.372A2.25 2.25 0 0 1 1.5 3.25m5.677-.177L9.573.677A.25.25 0 0 1 10 .854V2.5h1A2.5 2.5 0 0 1 13.5 5v5.628a2.251 2.251 0 1 1-1.5 0V5a1 1 0 0 0-1-1h-1v1.646a.25.25 0 0 1-.427.177L7.177 3.427a.25.25 0 0 1 0-.354M3.75 2.5a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5m0 9.5a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5m8.25.75a.75.75 0 1 0 1.5 0 .75.75 0 0 0-1.5 0"/></svg> Pull requests <span class="ui small label">16</span> </a> <a class="item" href="/fediverse/fep/releases"> <svg viewBox="0 0 16 16" class="svg octicon-tag" aria-hidden="true" width="16" height="16"><path d="M1 7.775V2.75C1 1.784 1.784 1 2.75 1h5.025c.464 0 .91.184 1.238.513l6.25 6.25a1.75 1.75 0 0 1 0 2.474l-5.026 5.026a1.75 1.75 0 0 1-2.474 0l-6.25-6.25A1.75 1.75 0 0 1 1 7.775m1.5 0c0 .066.026.13.073.177l6.25 6.25a.25.25 0 0 0 .354 0l5.025-5.025a.25.25 0 0 0 0-.354l-6.25-6.25a.25.25 0 0 0-.177-.073H2.75a.25.25 0 0 0-.25.25ZM6 5a1 1 0 1 1 0 2 1 1 0 0 1 0-2"/></svg> Releases </a> <a class="item" href="/fediverse/fep/activity"> <svg viewBox="0 0 16 16" class="svg octicon-pulse" aria-hidden="true" width="16" height="16"><path d="M6 2c.306 0 .582.187.696.471L10 10.731l1.304-3.26A.75.75 0 0 1 12 7h3.25a.75.75 0 0 1 0 1.5h-2.742l-1.812 4.528a.751.751 0 0 1-1.392 0L6 4.77 4.696 8.03A.75.75 0 0 1 4 8.5H.75a.75.75 0 0 1 0-1.5h2.742l1.812-4.529A.75.75 0 0 1 6 2"/></svg> Activity </a> </div> </overflow-menu> <div class="ui tabs divider"></div> </div> <div class="ui container "> <div id="flash-message" hx-swap-oob="true"></div> <div class="repo-button-row"> <div class="tw-flex tw-items-center tw-gap-y-2"> <script type="module"> const data = { 'textReleaseCompare': "Compare", 'textCreateTag': "Create tag %s", 'textCreateBranch': "Create branch %s", 'textCreateBranchFrom': "from \"%s\"", 'textBranches': "Branches", 'textTags': "Tags", 'textDefaultBranchLabel': "default", 'mode': 'branches', 'showBranchesInDropdown': true , 'searchFieldPlaceholder': 'Filter branch or tag...', 'branchForm': null , 'disableCreateBranch': true , 'setAction': null , 'submitForm': null , 'viewType': "branch", 'refName': "main", 'commitIdShort': "5a26711e1b", 'tagName': "", 'branchName': "main", 'noTag': null , 'defaultSelectedRefName': "main", 'repoDefaultBranch': "main", 'enableFeed': true , 'rssURLPrefix': '\/fediverse\/fep/rss/branch/', 'branchURLPrefix': '\/fediverse\/fep/src/branch/', 'branchURLSuffix': '/fep\/2677\/fep-2677.md', 'tagURLPrefix': '\/fediverse\/fep/src/tag/', 'tagURLSuffix': '/fep\/2677\/fep-2677.md', 'repoLink': "/fediverse/fep", 'treePath': "fep/2677/fep-2677.md", 'branchNameSubURL': "branch/main", 'noResults': "No results found.", }; window.config.pageData.branchDropdownDataList = window.config.pageData.branchDropdownDataList || []; window.config.pageData.branchDropdownDataList.push(data); </script> <div class="js-branch-tag-selector tw-mr-1"> <div class="ui dropdown custom"> <button class="branch-dropdown-button gt-ellipsis ui basic small compact button tw-flex tw-m-0"> <span class="text tw-flex tw-items-center tw-mr-1 gt-ellipsis"> <svg viewBox="0 0 16 16" class="svg octicon-git-branch" aria-hidden="true" width="16" height="16"><path d="M9.5 3.25a2.25 2.25 0 1 1 3 2.122V6A2.5 2.5 0 0 1 10 8.5H6a1 1 0 0 0-1 1v1.128a2.251 2.251 0 1 1-1.5 0V5.372a2.25 2.25 0 1 1 1.5 0v1.836A2.5 2.5 0 0 1 6 7h4a1 1 0 0 0 1-1v-.628A2.25 2.25 0 0 1 9.5 3.25m-6 0a.75.75 0 1 0 1.5 0 .75.75 0 0 0-1.5 0m8.25-.75a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5M4.25 12a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5"/></svg> <strong ref="dropdownRefName" class="tw-ml-2 tw-inline-block gt-ellipsis">main</strong> </span> <svg viewBox="0 0 16 16" class="dropdown icon svg octicon-triangle-down" aria-hidden="true" width="14" height="14"><path d="m4.427 7.427 3.396 3.396a.25.25 0 0 0 .354 0l3.396-3.396A.25.25 0 0 0 11.396 7H4.604a.25.25 0 0 0-.177.427"/></svg> </button> </div> </div> <a id="new-pull-request" role="button" class="ui compact basic button" href="/fediverse/fep/compare/main...main" data-tooltip-content="Compare"> <svg viewBox="0 0 16 16" class="svg octicon-git-pull-request" aria-hidden="true" width="16" height="16"><path d="M1.5 3.25a2.25 2.25 0 1 1 3 2.122v5.256a2.251 2.251 0 1 1-1.5 0V5.372A2.25 2.25 0 0 1 1.5 3.25m5.677-.177L9.573.677A.25.25 0 0 1 10 .854V2.5h1A2.5 2.5 0 0 1 13.5 5v5.628a2.251 2.251 0 1 1-1.5 0V5a1 1 0 0 0-1-1h-1v1.646a.25.25 0 0 1-.427.177L7.177 3.427a.25.25 0 0 1 0-.354M3.75 2.5a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5m0 9.5a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5m8.25.75a.75.75 0 1 0 1.5 0 .75.75 0 0 0-1.5 0"/></svg> </a> <span class="breadcrumb repo-path tw-ml-1"> <a class="section" href="/fediverse/fep/src/branch/main" title="fep">fep</a><span class="breadcrumb-divider">/</span><span class="section"><a href="/fediverse/fep/src/branch/main/fep" title="fep">fep</a></span><span class="breadcrumb-divider">/</span><span class="section"><a href="/fediverse/fep/src/branch/main/fep/2677" title="2677">2677</a></span><span class="breadcrumb-divider">/</span><span class="active section" title="fep-2677.md">fep-2677.md</span></span> </div> <div class="tw-flex tw-items-center"> </div> </div> <div class="tab-size-4 non-diff-file-content"> <div id="repo-file-commit-box" class="ui segment list-header tw-mb-4 tw-flex tw-justify-between"> <div class="latest-commit"> <img loading="lazy" class="ui avatar tw-align-middle tw-mr-2" src="/avatars/69f969d33db49b5f16d563eae168200d?size=48" title="silverpill" width="24" height="24"/> <a class="muted author-wrapper" title="silverpill" href="/silverpill"><strong>silverpill</strong></a> <a rel="nofollow" class="ui sha label " href="/fediverse/fep/commit/8441175ce0a8434046ddc7a5cbf3e489db22d270"> <span class="shortsha">8441175ce0</span> </a> <a class="tw-align-middle tw-no-underline" data-tippy="commit-statuses" href="https://ci.codeberg.org/repos/12388/pipeline/541/1"> <svg viewBox="0 0 16 16" class="commit-status icon text green svg octicon-check" aria-hidden="true" width="18" height="18"><path d="M13.78 4.22a.75.75 0 0 1 0 1.06l-7.25 7.25a.75.75 0 0 1-1.06 0L2.22 9.28a.75.75 0 0 1 .018-1.042.75.75 0 0 1 1.042-.018L6 10.94l6.72-6.72a.75.75 0 0 1 1.06 0"/></svg> </a> <div class="tippy-target"> <div class="commit-status-panel"> <div class="ui top attached header commit-status-header"> All checks were successful </div> <div class="commit-status-list"> <div class="commit-status-item"> <svg viewBox="0 0 16 16" class="commit-status icon text green svg octicon-check" aria-hidden="true" width="18" height="18"><path d="M13.78 4.22a.75.75 0 0 1 0 1.06l-7.25 7.25a.75.75 0 0 1-1.06 0L2.22 9.28a.75.75 0 0 1 .018-1.042.75.75 0 0 1 1.042-.018L6 10.94l6.72-6.72a.75.75 0 0 1 1.06 0"/></svg> <div class="status-context gt-ellipsis">ci/woodpecker/push/test <span class="text light-2">Pipeline was successful</span></div> <div class="ui status-details"> <span><a href="https://ci.codeberg.org/repos/12388/pipeline/541/1">Details</a></span> </div> </div> </div> </div> </div> <span class="grey commit-summary" title="Add trackingIssue metadata attribute to all proposals (#315)"><span class="message-wrapper"><a href="/fediverse/fep/commit/8441175ce0a8434046ddc7a5cbf3e489db22d270" class="default-link muted">Add trackingIssue metadata attribute to all proposals (</a><a href="/fediverse/fep/issues/315" class="ref-issue">#315</a><a href="/fediverse/fep/commit/8441175ce0a8434046ddc7a5cbf3e489db22d270" class="default-link muted">)</a></span> <button class="ui button js-toggle-commit-body ellipsis-button" aria-expanded="false">...</button> <pre class="commit-body tw-hidden">This PR adds `trackingIssue` to all proposals and updates `create_readme.py` script ([preview](<a href="https://codeberg.org/fediverse/fep/src/commit/40caf6ca3609e18c7bf0825e9e1ff74783d6ec5b/scripts/tools/__init__.py#L51" class="commit"><code class="nohighlight">40caf6ca36/scripts/tools/__init__.py (L51)</code></a>)) Resolves <a href="https://codeberg.org/fediverse/fep/issues/185" class="ref-issue">#185</a> Reviewed-on: <a href="https://codeberg.org/fediverse/fep/pulls/315" class="ref-issue">#315</a> Reviewed-by: Arnold Schrijver &lt;circlebuilder@noreply.codeberg.org&gt; Co-authored-by: silverpill &lt;silverpill@firemail.cc&gt; Co-committed-by: silverpill &lt;silverpill@firemail.cc&gt;</pre> </span> </div> <div class="text grey age"> <relative-time prefix="" tense="past" datetime="2024-06-03T21:12:43Z" data-tooltip-content data-tooltip-interactive="true">2024-06-03 21:12:43 +00:00</relative-time> </div> </div> <h4 class="file-header ui top attached header tw-flex tw-items-center tw-justify-between tw-flex-wrap"> <div class="file-header-left tw-flex tw-items-center tw-py-2 tw-pr-4"> <div class="file-info tw-font-mono"> <div class="file-info-entry"> 7.2 KiB </div> </div> </div> <div class="file-header-right file-actions tw-flex tw-items-center tw-flex-wrap"> <div class="ui compact icon buttons"> <a href="?display=source" class="ui mini basic button " data-tooltip-content="View source"><svg viewBox="0 0 16 16" class="svg octicon-code" aria-hidden="true" width="15" height="15"><path d="m11.28 3.22 4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.275-.326.75.75 0 0 1 .215-.734L13.94 8l-3.72-3.72a.749.749 0 0 1 .326-1.275.75.75 0 0 1 .734.215m-6.56 0a.75.75 0 0 1 1.042.018.75.75 0 0 1 .018 1.042L2.06 8l3.72 3.72a.749.749 0 0 1-.326 1.275.75.75 0 0 1-.734-.215L.47 8.53a.75.75 0 0 1 0-1.06Z"/></svg></a> <a href="/fediverse/fep/src/branch/main/fep/2677/fep-2677.md" class="ui mini basic button active" data-tooltip-content="View rendered"><svg viewBox="0 0 16 16" class="svg octicon-file" aria-hidden="true" width="15" height="15"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914z"/></svg></a> </div> <div class="ui buttons tw-mr-1"> <a class="ui mini basic button" href="/fediverse/fep/raw/branch/main/fep/2677/fep-2677.md">Raw</a> <a class="ui mini basic button" href="/fediverse/fep/src/commit/5a26711e1b7d6592d6ba986db8e01092a8928364/fep/2677/fep-2677.md">Permalink</a> <a class="ui mini basic button" href="/fediverse/fep/blame/branch/main/fep/2677/fep-2677.md">Blame</a> <a class="ui mini basic button" href="/fediverse/fep/commits/branch/main/fep/2677/fep-2677.md">History</a> </div> <a download href="/fediverse/fep/raw/branch/main/fep/2677/fep-2677.md"><span class="btn-octicon" data-tooltip-content="Download file"><svg viewBox="0 0 16 16" class="svg octicon-download" aria-hidden="true" width="16" height="16"><path d="M2.75 14A1.75 1.75 0 0 1 1 12.25v-2.5a.75.75 0 0 1 1.5 0v2.5c0 .138.112.25.25.25h10.5a.25.25 0 0 0 .25-.25v-2.5a.75.75 0 0 1 1.5 0v2.5A1.75 1.75 0 0 1 13.25 14Z"/><path d="M7.25 7.689V2a.75.75 0 0 1 1.5 0v5.689l1.97-1.969a.749.749 0 1 1 1.06 1.06l-3.25 3.25a.75.75 0 0 1-1.06 0L4.22 6.78a.749.749 0 1 1 1.06-1.06z"/></svg></span></a> <a href="#" id="copy-content" class="btn-octicon " data-link="/fediverse/fep/raw/branch/main/fep/2677/fep-2677.md" data-tooltip-content="Copy content"><svg viewBox="0 0 16 16" class="svg octicon-copy" aria-hidden="true" width="14" height="14"><path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z"/><path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"/></svg></a> <a class="btn-octicon" href="/fediverse/fep/rss/branch/main/fep/2677/fep-2677.md" data-tooltip-content="RSS feed"> <svg viewBox="0 0 16 16" class="svg octicon-rss" aria-hidden="true" width="14" height="14"><path d="M2.002 2.725a.75.75 0 0 1 .797-.699C8.79 2.42 13.58 7.21 13.974 13.201a.75.75 0 0 1-1.497.098 10.5 10.5 0 0 0-9.776-9.776.747.747 0 0 1-.7-.798ZM2.84 7.05h-.002a7 7 0 0 1 6.113 6.111.75.75 0 0 1-1.49.178 5.5 5.5 0 0 0-4.8-4.8.75.75 0 0 1 .179-1.489M2 13a1 1 0 1 1 2 0 1 1 0 0 1-2 0"/></svg> </a> <span class="btn-octicon disabled" data-tooltip-content="You must fork this repository to make or propose changes to this file."><svg viewBox="0 0 16 16" class="svg octicon-pencil" aria-hidden="true" width="16" height="16"><path d="M11.013 1.427a1.75 1.75 0 0 1 2.474 0l1.086 1.086a1.75 1.75 0 0 1 0 2.474l-8.61 8.61c-.21.21-.47.364-.756.445l-3.251.93a.75.75 0 0 1-.927-.928l.929-3.25c.081-.286.235-.547.445-.758l8.61-8.61Zm.176 4.823L9.75 4.81l-6.286 6.287a.25.25 0 0 0-.064.108l-.558 1.953 1.953-.558a.25.25 0 0 0 .108-.064Zm1.238-3.763a.25.25 0 0 0-.354 0L10.811 3.75l1.439 1.44 1.263-1.263a.25.25 0 0 0 0-.354Z"/></svg></span> <span class="btn-octicon disabled" data-tooltip-content="You must have write access to make or propose changes to this file."><svg viewBox="0 0 16 16" class="svg octicon-trash" aria-hidden="true" width="16" height="16"><path d="M11 1.75V3h2.25a.75.75 0 0 1 0 1.5H2.75a.75.75 0 0 1 0-1.5H5V1.75C5 .784 5.784 0 6.75 0h2.5C10.216 0 11 .784 11 1.75M4.496 6.675l.66 6.6a.25.25 0 0 0 .249.225h5.19a.25.25 0 0 0 .249-.225l.66-6.6a.75.75 0 0 1 1.492.149l-.66 6.6A1.75 1.75 0 0 1 10.595 15h-5.19a1.75 1.75 0 0 1-1.741-1.575l-.66-6.6a.75.75 0 1 1 1.492-.15M6.5 1.75V3h3V1.75a.25.25 0 0 0-.25-.25h-2.5a.25.25 0 0 0-.25.25"/></svg></span> </div> </h4> <div class="ui bottom attached table unstackable segment"> <div class="file-view markup markdown"> <details><summary><i class="icon table"></i></summary><table> <thead> <tr> <th>slug</th> <th>authors</th> <th>status</th> <th>dateReceived</th> <th>trackingIssue</th> <th>discussionsTo</th> </tr> </thead> <tbody> <tr> <td>2677</td> <td>Helge &lt;helge.krueger@gmail.com&gt;</td> <td>DRAFT</td> <td>2023-10-14</td> <td><a href="https://codeberg.org/fediverse/fep/issues/190" class="ref-issue" rel="nofollow">#190</a></td> <td><a href="https://codeberg.org/fediverse/fep/issues/190" class="ref-issue" rel="nofollow">#190</a></td> </tr> </tbody> </table> </details><h1 id="user-content-fep-2677-identifying-the-application-actor" dir="auto">FEP-2677: Identifying the Application Actor</h1> <h2 id="user-content-summary" dir="auto">Summary</h2> <p dir="auto">It is a common pattern in Fediverse applications to have a special actor of type <code>Application</code>. This is for example the actor at <code>https://mastodon.example/actor</code> for Mastodon or at <code>https://pleroma.example/internal/fetch</code> for Pleroma. This application actor can be fetched with an unsigned request, so it is possible to use it to fetch public keys.</p> <p dir="auto">The goal of this FEP is to provide an explicit mechanism of identifying the application actor, with the goal of making it usable for further tasks, e.g.</p> <ul dir="auto"> <li>Allowing for application to application communication by having application actor send activities to another application actor&#39;s inbox.</li> <li>Having an object one can attach further information to. This means, one could attach a list of implemented FEPs to the application actor.</li> </ul> <h2 id="user-content-requirements" dir="auto">Requirements</h2> <h3 id="user-content-application-actor" dir="auto">Application Actor</h3> <p dir="auto">We will first define, what we mean by an <em>application actor</em>. We will impose two requirements on them</p> <ol dir="auto"> <li>It&#39;s an [ActivityPub] Actor of type <a href="https://www.w3.org/TR/activitystreams-vocabulary/#dfn-application" rel="nofollow">Application</a>.</li> <li>It can be retrieved without authentication, e.g. with an unsigned HTTP request.</li> </ol> <p dir="auto">As already mentioned application actors are currently used by most Fediverse applications to fetch public keys. See <a href="#user-content-currently-implemented-application-actors" rel="nofollow">here</a> for a list of examples.</p> <h3 id="user-content-identifying-the-application-actor-with-nodeinfo" dir="auto">Identifying the Application Actor with nodeinfo</h3> <p dir="auto">In [NodeInfo], see also [FEP-f1d5], the well-known path <code>/.well-known/nodeinfo</code> is defined and it is specified that a document in JRD format [RFC 7033] is served there.</p> <p dir="auto">The requirement of the current FEP is that the <code>/.well-known/nodeinfo</code> contains an additional link with relation type <code>https://www.w3.org/ns/activitystreams#Application</code>, which resolves to an application actor as described in the previous section.</p> <p dir="auto">We note that it is not necessary to implement the relations specified in [NodeInfo] to satisfy the current FEP.</p> <h2 id="user-content-example" dir="auto">Example</h2> <p dir="auto">We will consider the server with domain <code>node.example</code>. This means that a request to <code>https://node.example/.well-known/nodeinfo</code> will resolve to</p> <pre class="code-block"><code class="chroma language-json display"> <span class="p">{</span> <span class="nt">&#34;links&#34;</span><span class="p">:</span> <span class="p">[</span> <span class="p">{</span> <span class="nt">&#34;rel&#34;</span><span class="p">:</span> <span class="s2">&#34;http://nodeinfo.diaspora.software/ns/schema/2.0&#34;</span><span class="p">,</span> <span class="nt">&#34;href&#34;</span><span class="p">:</span> <span class="s2">&#34;https://node.example/nodeinfo/2.0&#34;</span> <span class="p">},</span> <span class="p">{</span> <span class="nt">&#34;rel&#34;</span><span class="p">:</span> <span class="s2">&#34;https://www.w3.org/ns/activitystreams#Application&#34;</span><span class="p">,</span> <span class="nt">&#34;href&#34;</span><span class="p">:</span> <span class="s2">&#34;https://node.example/actor&#34;</span> <span class="p">}</span> <span class="p">]</span> <span class="p">}</span> </code></pre><p dir="auto">Next, a request to <code>https://node.example/actor</code> with accept header <code>application/activity+json</code> could return</p> <pre class="code-block"><code class="chroma language-json display"><span class="p">{</span> <span class="nt">&#34;@context&#34;</span><span class="p">:</span> <span class="p">[</span> <span class="s2">&#34;https://www.w3.org/ns/activitystreams&#34;</span><span class="p">,</span> <span class="s2">&#34;https://w3id.org/security/v1&#34;</span><span class="p">,</span> <span class="p">],</span> <span class="nt">&#34;id&#34;</span><span class="p">:</span> <span class="s2">&#34;https://node.example/actor&#34;</span><span class="p">,</span> <span class="nt">&#34;type&#34;</span><span class="p">:</span> <span class="s2">&#34;Application&#34;</span><span class="p">,</span> <span class="nt">&#34;inbox&#34;</span><span class="p">:</span> <span class="s2">&#34;https://node.example/actor/inbox&#34;</span><span class="p">,</span> <span class="nt">&#34;outbox&#34;</span><span class="p">:</span> <span class="s2">&#34;https://node.example/actor/outbox&#34;</span><span class="p">,</span> <span class="nt">&#34;publicKey&#34;</span><span class="p">:</span> <span class="p">{</span> <span class="nt">&#34;id&#34;</span><span class="p">:</span> <span class="s2">&#34;https://node.example/actor#main-key&#34;</span><span class="p">,</span> <span class="nt">&#34;owner&#34;</span><span class="p">:</span> <span class="s2">&#34;https://node.example/actor&#34;</span><span class="p">,</span> <span class="nt">&#34;publicKeyPem&#34;</span><span class="p">:</span> <span class="s2">&#34;-----BEGIN PUBLIC KEY-----\n....\n-----END PUBLIC KEY-----\n&#34;</span> <span class="p">}</span> <span class="p">}</span> </code></pre><h2 id="user-content-discussion" dir="auto">Discussion</h2> <p dir="auto">The approach of this FEP has been chosen to have a light touch. Some alternative choices would be:</p> <ol dir="auto"> <li>A fixed path for the application actor</li> <li>A fixed path for application information instead of aiming to attach it to the application actor.</li> </ol> <p dir="auto">Both options have the downside that it would require to introduce a new path, which forces every implementation to implement it in a similar way. Instead, we reuse an existing path, and the implementer is free to choose where to put the application actor.</p> <hr/> <p dir="auto">The second question is why fix the type <code>Application</code> and not <code>Service</code>. First, it is consistent with most current implementations. Second, Mastodon uses <code>Service</code> for bot accounts. So it feels like a good idea to start distinguishing from this usage. We would phrase this distinction as follows:</p> <ul dir="auto"> <li>An actor of type <code>Application</code> is triggered by events in the application, e.g. a signed request and then fetching the corresponding public key.</li> <li>An actor of type <code>Service</code> is triggered by either activities arriving at its inbox or external events, e.g. a timer. This means an actor of type <code>Service</code> is similar to one controlled by an user.</li> </ul> <p dir="auto">These are not hard rules on when to use <code>Application</code> or <code>Service</code>. They will probably break down as more complicated Fediverse implementations are build. We hope that they can serve as a level of guidance, how to differentiate actors.</p> <h2 id="user-content-currently-implemented-application-actors" dir="auto">Currently implemented application actors</h2> <table> <thead> <tr> <th>Software</th> <th>Application Actor URI</th> </tr> </thead> <tbody> <tr> <td><a href="https://codeberg.org/bovine/bovine/" rel="nofollow">Bovine</a></td> <td><code>https://bovine.example/activitypub/bovine</code></td> </tr> <tr> <td><a href="https://joinfirefish.org/" rel="nofollow">Firefish</a></td> <td><code>https://firefish.example/actor</code></td> </tr> <tr> <td><a href="https://join-lemmy.org/" rel="nofollow">Lemmy</a></td> <td><code>https://lemmy.example/</code></td> </tr> <tr> <td><a href="https://joinmastodon.org/" rel="nofollow">Mastodon</a></td> <td><code>https://mastodon.example/actor</code></td> </tr> <tr> <td><a href="https://codeberg.org/silverpill/mitra" rel="nofollow">Mitra</a></td> <td><code>http://mitra.example/actor</code></td> </tr> <tr> <td><a href="https://pleroma.social/" rel="nofollow">Pleroma</a></td> <td><code>https://pleroma.example/internal/fetch</code></td> </tr> <tr> <td><a href="https://github.com/MbinOrg/mbin" rel="nofollow">Mbin</a></td> <td><code>https://mbin.example/i/actor</code></td> </tr> <tr> <td><a href="https://github.com/Automattic/wordpress-activitypub" rel="nofollow">WordPress</a></td> <td><code>https://wordpress.example/wp-json/activitypub/1.0/application</code></td> </tr> <tr> <td><a href="https://framagit.org/framasoft/mobilizon/" rel="nofollow">Mobilizon</a></td> <td><code>https://mobilizon.example/relay</code></td> </tr> <tr> <td><a href="https://framagit.org/les/gancio/" rel="nofollow">Gancio</a></td> <td><code>https://gancio.example/federation/u/&lt;instance_name&gt;</code></td> </tr> <tr> <td><a href="https://github.com/friendica/friendica" rel="nofollow">Friendica</a></td> <td><code>https://friendica.example/</code></td> </tr> <tr> <td><a href="https://github.com/Chocobozzz/PeerTube" rel="nofollow">PeerTube</a></td> <td><code>https://peertube.example/accounts/peertube</code></td> </tr> <tr> <td><a href="https://github.com/pixelfed/pixelfed" rel="nofollow">Pixelfed</a></td> <td><code>https://pixelfed.example/i/actor</code></td> </tr> </tbody> </table> <p dir="auto"><strong>Note</strong>: Feel free to add further links.</p> <h2 id="user-content-implementations" dir="auto">Implementations</h2> <table> <thead> <tr> <th>Software</th> <th>dateImplemented</th> <th>dateReleased</th> </tr> </thead> <tbody> <tr> <td><a href="https://github.com/Automattic/wordpress-activitypub" rel="nofollow">WordPress</a></td> <td><a href="https://github.com/Automattic/wordpress-activitypub/commit/6f1a9a1f7fb957d6989316ea7a6f3d418cc8db82" rel="nofollow">2023-12-21</a></td> <td>-</td> </tr> <tr> <td><a href="https://framagit.org/framasoft/mobilizon/" rel="nofollow">Mobilizon</a></td> <td><a href="https://framagit.org/framasoft/mobilizon/-/merge_requests/1507" rel="nofollow">2023-12-14</a></td> <td>-</td> </tr> <tr> <td><a href="https://framagit.org/les/gancio/" rel="nofollow">Gancio</a></td> <td><a href="https://framagit.org/les/gancio/-/commit/9c74f5198d7c2c360fdb70ebbd0d4bfc2e6999b4" rel="nofollow">2023-12-22</a></td> <td>-</td> </tr> </tbody> </table> <h2 id="user-content-references" dir="auto">References</h2> <ul dir="auto"> <li>[ActivityPub] Christine Lemmer Webber, Jessica Tallon, <a href="https://www.w3.org/TR/activitypub/" rel="nofollow">ActivityPub</a>, 2018</li> <li>[FEP-f1d5] CJ, silverpill, <a href="https://codeberg.org/fediverse/fep/src/branch/main/fep/f1d5/fep-f1d5.md" rel="nofollow">NodeInfo in Fediverse Software</a>, 2023</li> <li>[NodeInfo] <a href="http://nodeinfo.diaspora.software/protocol.html" rel="nofollow">NodeInfo protocol 2.1</a></li> <li>[RFC 2119] S. Bradner, <a href="https://tools.ietf.org/html/rfc2119.html" rel="nofollow">Key words for use in RFCs to Indicate Requirement Levels</a>, 1997</li> <li>[RFC 7033] P. Jones, G. Salgueiro, M. Jones, J. Smarr, <a href="https://www.rfc-editor.org/rfc/rfc7033.html" rel="nofollow">Webfinger</a>, 2013</li> </ul> <h2 id="user-content-copyright" dir="auto">Copyright</h2> <p dir="auto">CC0 1.0 Universal (CC0 1.0) Public Domain Dedication</p> <p dir="auto">To the extent possible under law, the authors of this Fediverse Enhancement Proposal have waived all copyright and related or neighboring rights to this work.</p> </div> </div> </div> </div> </div> </div> <footer class="page-footer" role="group" aria-label="Footer"> <div class="grid" aria-label="Links"> <div class="branding not-mobile" aria-hidden="true"> <img src="https://design.codeberg.org/logo-kit/icon_inverted.svg"> </div> <div> <b>Codeberg</b> <ul> <li><a href="https://docs.codeberg.org" target="_blank">Documentation</a></li> <li><a href="/Codeberg/Community/issues">Community Issues</a></li> <li><a href="/Codeberg/Contributing">Contributing</a> <li><a href="https://docs.codeberg.org/contact/#abuse" target="_blank">Report Abuse</a> </ul> </div> <div> <b>Association</b> <ul> <li><a href="https://docs.codeberg.org/getting-started/what-is-codeberg/#what-is-codeberg-e.v.%3F" target="_blank">Who are we?</a></li> <li><a href="/codeberg/org/src/en/bylaws.md" target="_blank">Bylaws / Satzung</a></li> <li><a href="https://docs.codeberg.org/improving-codeberg/donate/" target="_blank">Donate</a></li> <li><a href="https://join.codeberg.org" target="_blank">Join / Support</a></li> <li><a href="https://docs.codeberg.org/contact/" target="_blank">Contact</a></li> </ul> </div> <div> <b>Service</b> <ul> <li><a href="https://codeberg.page" target="_blank">Codeberg Pages</a></li> <li><a href="https://translate.codeberg.org" target="_blank">Weblate Translations</a></li> <li><a href="https://docs.codeberg.org/ci/#using-codeberg's-instance-of-woodpecker-ci" target="_blank">Woodpecker CI</a></li> <li><a href="/api/swagger">Forgejo API</a></li> <li><a href="https://status.codeberg.eu" target="_blank">Status Page</a></li> </ul> </div> <div> <b>Legal</b> <ul> <li><a href="/codeberg/org/src/Imprint.md" target="_blank">Imprint / Impressum</a></li> <li><a href="/codeberg/org/src/PrivacyPolicy.md" target="_blank">Privacy Policy</a></li> <li><a href="/assets/licenses.txt">Licenses</a></li> <li><a href="/codeberg/org/src/TermsOfUse.md">Terms of Use</a></li> </ul> </div> </div> <center> <a href="https://blog.codeberg.org" target="_blank">Blog</a> | <a href="https://social.anoxinon.de/@Codeberg" target="_blank" rel="noopener noreferrer">Mastodon</a> | <a href="https://matrix.to/#/#codeberg-space:matrix.org" target="_blank" rel="noopener noreferrer">Matrix Space</a> | <a href="/Codeberg-Infrastructure/forgejo" target="_blank">Powered by Forgejo</a> </center> <div class="gt-float-right"> <div class="ui language bottom floating slide up dropdown link item button"> <svg viewBox="0 0 16 16" class="svg octicon-globe" aria-hidden="true" width="16" height="16"><path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0M5.78 8.75a9.64 9.64 0 0 0 1.363 4.177q.383.64.857 1.215c.245-.296.551-.705.857-1.215A9.64 9.64 0 0 0 10.22 8.75Zm4.44-1.5a9.64 9.64 0 0 0-1.363-4.177c-.307-.51-.612-.919-.857-1.215a10 10 0 0 0-.857 1.215A9.64 9.64 0 0 0 5.78 7.25Zm-5.944 1.5H1.543a6.51 6.51 0 0 0 4.666 5.5q-.184-.271-.352-.552c-.715-1.192-1.437-2.874-1.581-4.948m-2.733-1.5h2.733c.144-2.074.866-3.756 1.58-4.948q.18-.295.353-.552a6.51 6.51 0 0 0-4.666 5.5m10.181 1.5c-.144 2.074-.866 3.756-1.58 4.948q-.18.296-.353.552a6.51 6.51 0 0 0 4.666-5.5Zm2.733-1.5a6.51 6.51 0 0 0-4.666-5.5q.184.272.353.552c.714 1.192 1.436 2.874 1.58 4.948Z"/></svg> <div class="text">English</div> <div class="menu language-menu"> <a lang="id-ID" data-url="/?lang=id-ID" class="item ">Bahasa Indonesia</a> <a lang="de-DE" data-url="/?lang=de-DE" class="item ">Deutsch</a> <a lang="en-US" data-url="/?lang=en-US" class="item active selected">English</a> <a lang="es-ES" data-url="/?lang=es-ES" class="item ">Español</a> <a lang="eo" data-url="/?lang=eo" class="item ">Esperanto</a> <a lang="fil" data-url="/?lang=fil" class="item ">Filipino</a> <a lang="fr-FR" data-url="/?lang=fr-FR" class="item ">Français</a> <a lang="it-IT" data-url="/?lang=it-IT" class="item ">Italiano</a> <a lang="lv-LV" data-url="/?lang=lv-LV" class="item ">Latviešu</a> <a lang="hu-HU" data-url="/?lang=hu-HU" class="item ">Magyar nyelv</a> <a lang="nl-NL" data-url="/?lang=nl-NL" class="item ">Nederlands</a> <a lang="pl-PL" data-url="/?lang=pl-PL" class="item ">Polski</a> <a lang="pt-PT" data-url="/?lang=pt-PT" class="item ">Português de Portugal</a> <a lang="pt-BR" data-url="/?lang=pt-BR" class="item ">Português do Brasil</a> <a lang="sl" data-url="/?lang=sl" class="item ">Slovenščina</a> <a lang="fi-FI" data-url="/?lang=fi-FI" class="item ">Suomi</a> <a lang="sv-SE" data-url="/?lang=sv-SE" class="item ">Svenska</a> <a lang="tr-TR" data-url="/?lang=tr-TR" class="item ">Türkçe</a> <a lang="cs-CZ" data-url="/?lang=cs-CZ" class="item ">Čeština</a> <a lang="el-GR" data-url="/?lang=el-GR" class="item ">Ελληνικά</a> <a lang="bg" data-url="/?lang=bg" class="item ">Български</a> <a lang="ru-RU" data-url="/?lang=ru-RU" class="item ">Русский</a> <a lang="uk-UA" data-url="/?lang=uk-UA" class="item ">Українська</a> <a lang="fa-IR" data-url="/?lang=fa-IR" class="item ">فارسی</a> <a lang="ja-JP" data-url="/?lang=ja-JP" class="item ">日本語</a> <a lang="zh-CN" data-url="/?lang=zh-CN" class="item ">简体中文</a> <a lang="zh-TW" data-url="/?lang=zh-TW" class="item ">繁體中文(台灣)</a> <a lang="zh-HK" data-url="/?lang=zh-HK" class="item ">繁體中文(香港)</a> <a lang="ko-KR" data-url="/?lang=ko-KR" class="item ">한국어</a> </div> </div> </div> </footer> <script src="/assets/js/index.js?v=9.0.0-193-ea8bf18dd7~gitea-1.22.0" onerror="alert('Failed to load asset files from ' + this.src + '. Please make sure the asset files can be accessed.')"></script> </body> </html>

Pages: 1 2 3 4 5 6 7 8 9 10