PageSourceSearch

https://docs.flathub.org/assets/js/2a9e6488.1d37397a.js

js flathub.org collected 2026-09-24 08:38:13 UTC 30,123 bytes, 1 lines download raw bytes

1"use strict";(globalThis.webpackChunkflathub_docs_docusaurus=globalThis.webpackChunkflathub_docs_docusaurus||[]).push([[5932],{3654(e,n,t){t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>r,default:()=>c,frontMatter:()=>a,metadata:()=>o,toc:()=>d});const o=JSON.parse('{"id":"for-app-authors/metainfo-guidelines/quality-guidelines","title":"Quality guidelines","description":"Please open an issue using the Quality Guidelines template for support","source":"@site/docs/02-for-app-authors/03-metainfo-guidelines/01-quality-guidelines.md","sourceDirName":"02-for-app-authors/03-metainfo-guidelines","slug":"/for-app-authors/metainfo-guidelines/quality-guidelines","permalink":"/docs/for-app-authors/metainfo-guidelines/quality-guidelines","draft":false,"unlisted":false,"editUrl":"https://github.com/flathub/documentation/tree/main/docs/02-for-app-authors/03-metainfo-guidelines/01-quality-guidelines.md","tags":[],"version":"current","sidebarPosition":1,"frontMatter":{},"sidebar":"mainSidebar","previous":{"title":"MetaInfo guidelines","permalink":"/docs/for-app-authors/metainfo-guidelines/"},"next":{"title":"Runtimes","permalink":"/docs/for-app-authors/runtimes"}}');var s=t(4848),i=t(8453);const a={},r="Quality guidelines",l={},d=[{value:"Benefits of passing quality checks",id:"benefits-of-passing-quality-checks",level:3},{value:"General",id:"general",level:2},{value:"No trademark violations",id:"no-trademark-violations",level:3},{value:"Runtime not end-of-life",id:"runtime-not-end-of-life",level:3},{value:"Managed by app author",id:"managed-by-app-author",level:3},{value:"Brand colors",id:"brand-colors",level:2},{value:"Has primary brand colors",id:"has-primary-brand-colors",level:3},{value:"Good brand colors",id:"good-brand-colors",level:3},{value:"App Icon",id:"app-icon",level:2},{value:"Icon size",id:"icon-size",level:3},{value:"Reasonable footprint",id:"reasonable-footprint",level:3},{value:"Good contrast",id:"good-contrast",level:3},{value:"Not too much or too little detail",id:"not-too-much-or-too-little-detail",level:3},{value:"No baked-in shadows",id:"no-baked-in-shadows",level:3},{value:"In line with contemporary styles",id:"in-line-with-contemporary-styles",level:3},{value:"App Name",id:"app-name",level:2},{value:"Not too long",id:"not-too-long",level:3},{value:"Just the name",id:"just-the-name",level:3},{value:"No weird formatting",id:"no-weird-formatting",level:3},{value:"Summary",id:"summary",level:2},{value:"Not too long",id:"not-too-long-1",level:3},{value:"Not technical",id:"not-technical",level:3},{value:"No weird formatting",id:"no-weird-formatting-1",level:3},{value:"Don't repeat the name",id:"dont-repeat-the-name",level:3},{value:"Don't start with an article",id:"dont-start-with-an-article",level:3},{value:"Description",id:"description",level:2},{value:"Don't repeat the summary",id:"dont-repeat-the-summary",level:3},{value:"Not too short",id:"not-too-short",level:3},{value:"No super long lists",id:"no-super-long-lists",level:3},{value:"Screenshots",id:"screenshots",level:2},{value:"At least one screenshot",id:"at-least-one-screenshot",level:3},{value:"Tag screenshots with the correct language",id:"tag-screenshots-with-the-correct-language",level:3},{value:"Just the app window",id:"just-the-app-window",level:3},{value:"Take screenshots on Linux",id:"take-screenshots-on-linux",level:3},{value:"Default settings",id:"default-settings",level:3},{value:"Include window shadow and rounded corners",id:"include-window-shadow-and-rounded-corners",level:3},{value:"Reasonable window size",id:"reasonable-window-size",level:3},{value:"Image captions",id:"image-captions",level:3},{value:"Good content",id:"good-content",level:3},{value:"Up to date",id:"up-to-date",level:3},{value:"Release Notes",id:"release-notes",level:2},{value:"Release notes for every release",id:"release-notes-for-every-release",level:3},{value:"Short but informative",id:"short-but-informative",level:3},{value:"No "bug fixes and performance improvements"",id:"no-bug-fixes-and-performance-improvements",level:3},{value:"Age Ratings",id:"age-ratings",level:2},{value:"Take easily accessible content into account",id:"take-easily-accessible-content-into-account",level:3}];function h(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",img:"img",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,i.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"quality-guidelines",children:"Quality guidelines"})}),"\n",(0,s.jsx)(n.admonition,{type:"tip",children:(0,s.jsxs)(n.p,{children:["Please ",(0,s.jsx)(n.a,{href:"https://github.com/flathub/flathub/issues/new?assignees=&labels=&projects=&template=1-quality-mod.md&title=Quality+guideline+problems+for+%3Capp+name%3E",children:"open an issue"})," using the Quality Guidelines template for support\nregarding these guidelines."]})}),"\n",(0,s.jsx)(n.p,{children:"The following guidelines are not required for submission to Flathub,\nbut are best practices we recommend and consider for curation and\npromotion. These guidelines are designed to help your app and Flathub\nitself appear in the best light to users. The guidelines may change over\ntime based on developer and user feedback."}),"\n",(0,s.jsxs)(n.p,{children:["The term ",(0,s.jsx)(n.code,{children:"must"})," in these guidelines is used in the context of considering\nwhether an app passes the app listing quality checks. Apps that do not\nfollow these guidelines may still be published on Flathub."]}),"\n",(0,s.jsxs)(n.p,{children:["For the basics on how to write metadata for your app, see the\n",(0,s.jsx)(n.a,{href:"/docs/for-app-authors/metainfo-guidelines",children:"MetaInfo Guidelines"}),"."]}
1),"\n",(0,s.jsx)(n.h3,{id:"benefits-of-passing-quality-checks",children:"Benefits of passing quality checks"}),"\n",(0,s.jsxs)(n.p,{children:["Passing the quality checks enhances an application's visibility\non the Flathub homepage. Applications that meet ",(0,s.jsx)(n.em,{children:"all"}),' the checks can be\nfeatured prominently on the weekly banner and "App of the Day"\nhighlights on a rotational basis. The more guidelines an application\nmeets, the higher its chances of being featured in the trending section\nof flathub.org. Additionally, some Linux distributions and software\ncentres may use the list of approved apps to curate their own featured\nselections.']}),"\n",(0,s.jsx)(n.p,{children:"These benefits may evolve as we explore new ways for enhanced curation\nand promotion."}),"\n",(0,s.jsx)(n.h2,{id:"general",children:"General"}),"\n",(0,s.jsx)(n.h3,{id:"no-trademark-violations",children:"No trademark violations"}),"\n",(0,s.jsxs)(n.p,{children:["Please see the policy in the ",(0,s.jsx)(n.a,{href:"/docs/for-app-authors/requirements#no-trademark-violations",children:"requirements section"}),"."]}),"\n",(0,s.jsx)(n.h3,{id:"runtime-not-end-of-life",children:"Runtime not end-of-life"}),"\n",(0,s.jsx)(n.p,{children:"Your app must target a runtime that is not end-of-life (EOL). This means you should not use deprecated or obsolete runtimes, as they may not receive security updates or support."}),"\n",(0,s.jsxs)(n.p,{children:["Check ",(0,s.jsx)(n.a,{href:"/docs/for-app-authors/runtimes",children:"Runtimes"})," for runtime support periods and expected eol dates."]}),"\n",(0,s.jsx)(n.h3,{id:"managed-by-app-author",children:"Managed by app author"}),"\n",(0,s.jsx)(n.p,{children:"Use Flathub verification to indicate that you are the author of the app\nand that you are managing the app on Flathub."}),"\n",(0,s.jsx)(n.h2,{id:"brand-colors",children:"Brand colors"}),"\n",(0,s.jsx)(n.h3,{id:"has-primary-brand-colors",children:"Has primary brand colors"}),"\n",(0,s.jsxs)(n.p,{children:["Apps should set two primary ",(0,s.jsx)(n.a,{href:"/docs/for-app-authors/metainfo-guidelines/#brand-color",children:"brand colors"}),",\n",(0,s.jsx)(n.code,{children:"light"})," and ",(0,s.jsx)(n.code,{children:"dark"}),"."]}),"\n",(0,s.jsx)(n.p,{children:"For example:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-xml",children:'<branding>\n  <color type="primary" scheme_preference="light">#faa298</color>\n  <color type="primary" scheme_preference="dark">#7f2c22</color>\n</branding>\n'})}),"\n",(0,s.jsx)(n.h3,{id:"good-brand-colors",children:"Good brand colors"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"One bad and two good examples of brand colors with regard to contrast to the app icon.",src:t(9183).A+"",width:"556",height:"204"})}),"\n",(0,s.jsx)(n.p,{children:"Brand colors are often used as a background behind the app icon, so\nmake sure the colors are not too similar to the app icon in order to\nensure good contrast. Avoid using light colors for the dark variant, or\nthe same color for both dark and light. In most cases the dark variant\nshould be a darker, more muted version of the light brand color. Do not\nuse the same color for the dark and light variants."}),"\n",(0,s.jsxs)(n.p,{children:["Brand colors should be ",(0,s.jsx)(n.strong,{children:"colorful"}),". In particular, avoid white (or very\nlight grays) and black (or very dark grays)."]}),"\n",(0,s.jsx)(n.p,{children:"When choosing brand colors, a good starting point is using a\nlighter/darker version of the primary color used in the icon (though be\ncareful to maintain good contrast with the icon), or a complementary\ncolor that pairs well with the main icon color (e.g. blue if the icon\nis yellow)."}),"\n",(0,s.jsx)(n.p,{children:"It's recommended to consider the brand colors an extension of the app\nicon, and have the icon designer choose them when making the icon."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Good example of banner colors for light and dark.",src:t(3387).A+"",width:"785",height:"158"})}),"\n",(0,s.jsxs)(n.p,{children:["Feel free to play with our ",(0,s.jsx)(n.a,{href:"/banner-preview",children:"banner preview"})," to find\nyour favorite colors."]}),"\n",(0,s.jsx)(n.h2,{id:"app-icon",children:"App Icon"}),"\n",(0,s.jsx)(n.h3,{id:"icon-size",children:"Icon size"}),"\n",(0,s.jsx)(n.p,{children:"The icon should be SVG, or a PNG with a size greater or equal to\n256x256 pixels. It has to be square."}),"\n",(0,s.jsx)(n.h3,{id:"reasonable-footprint",children:"Reasonable footprint"}),"\n",(0,s.jsx)(n.p,{children:"The icon shouldn't fill too much or too little of the canvas. Avoid\nfilling the entire canvas and having the icon touch the edges of the\ncanvas (except with small protruding elements). Similarly, avoid thin\nshapes that are hard to see."}),"\n",(0,s.jsxs)(n.p,{children:["You can use our icon grid (",(0,s.jsx)(n.a,{href:"pathname:///img/app-icon-grid.svg",download:!0,children:"SVG\ntemplate download"}),") with square and circular base shapes to check if\nyour icon's footprint is too large or too small. The examples below\nshow the grid overlaid on some app icons. The first icon fills too much\nof the icon grid and extends beyond the grid and the second icon fills\ntoo little of the icon grid due to the transparency, so they don't pass\nthis guideline."]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Examples of icons with footprints that are too large, too small, and just right.",src:t(6623).A+"",width:"618",height:"350"})}),"\n",(0,s.jsx)(n.h3,{id:"good-contrast",children:"Good contrast"}),"\n",(0,s.jsx)(n.p,{children:"The icon should have good contrast on dark and light backgrounds. In\nparticular, avoid single-color glyphs and the like since they can be\nvery hard to see if the background color is similar. Dark colors near the\nedges are also a problem since shadows don't help much with contrast on\ndark backgrounds."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Illustration of why icons should not be dark near the edges, showing two similar device icons on dark and light backgrounds.",src:t(6682).A+"",width:"318",height:"350"})}),"\n",(0,s.jsx)(n.h3,{id:"not-too-much-or-too-little-detail",children:"Not too much or too little detail"}),"\n",(0,s.jsx)(n.p,{children:"The icon should be recognizable in small sizes. Avoid too many tiny\ndetails and small text, and generally try and match other well-executed\napp icons in terms of complexity. Icons should also be c
1omplex enough to\nbe recognizable, e.g. a flat single-colored symbol is too simple."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Examples of icons with too much and too little detail.",src:t(2423).A+"",width:"618",height:"203"})}),"\n",(0,s.jsx)(n.h3,{id:"no-baked-in-shadows",children:"No baked-in shadows"}),"\n",(0,s.jsx)(n.p,{children:"The icon should not have any baked-in shadows or glows. Both the\nFlathub website and native stores apply a shadow to all icons, so\nbaked-in shadows result in double shadows or other glitches."}),"\n",(0,s.jsx)(n.h3,{id:"in-line-with-contemporary-styles",children:"In line with contemporary styles"}),"\n",(0,s.jsxs)(n.p,{children:["The icon should be somewhat in line with the contemporary icon styles\n(i.e. not look like it hasn't been updated in decades). The ",(0,s.jsx)(n.a,{href:"https://developer.gnome.org/hig/guidelines/app-icons.html",children:"GNOME"}),"\nand ",(0,s.jsx)(n.a,{href:"https://develop.kde.org/hig/style/icons/colorful/application/",children:"KDE"}),"\napp icon guidelines are examples of the kind of style your icon should\nalign with."]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Two icons that are not in line with contemporary styles, and two that are.",src:t(4721).A+"",width:"618",height:"203"})}),"\n",(0,s.jsx)(n.p,{children:"In some cases, it can make sense for the icon to align with the visuals\nof the app, rather than contemporary icon styles (especially relevant for\ngames). This can be accommodated by embedding the custom style icon in\none of the grid shapes, e.g. a square or circle. This way the unique\nstyle is preserved, but the icon's size and shape are in line with other\napps."}),"\n",(0,s.jsx)(n.h2,{id:"app-name",children:"App Name"}),"\n",(0,s.jsx)(n.h3,{id:"not-too-long",children:"Not too long"}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.a,{href:"/docs/for-app-authors/metainfo-guidelines/#name-and-summary",children:"name"}),"\nshould ideally, be no longer than 15 characters, and must be shorter than\n20 characters."]}),"\n",(0,s.jsx)(n.admonition,{title:"Bad examples",type:"danger",children:(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Apostrophe Markdown"}),"\n",(0,s.jsx)(n.li,{children:"Minimal Markdown Editor"}),"\n"]})}),"\n",(0,s.jsx)(n.h3,{id:"just-the-name",children:"Just the name"}),"\n",(0,s.jsx)(n.p,{children:"The name should be just a short name, without any additional\ninformation. For example, don't append what the app does or is used for\nto the name; use the summary to provide this information instead."}),"\n",(0,s.jsx)(n.admonition,{title:"Bad examples",type:"danger",children:(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Krita - Digital Painting, Creative Freedom"}),"\n",(0,s.jsx)(n.li,{children:"Fractal (Matrix Client)"}),"\n",(0,s.jsx)(n.li,{children:"Apostrophe: the best free Markdown editor"}),"\n",(0,s.jsx)(n.li,{children:"Firefox Web Browser"}),"\n"]})}),"\n",(0,s.jsx)(n.admonition,{title:"Good examples",type:"tip",children:(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Krita"}),"\n",(0,s.jsx)(n.li,{children:"Fractal"}),"\n",(0,s.jsx)(n.li,{children:"Apostrophe"}),"\n",(0,s.jsx)(n.li,{children:"Firefox"}),"\n"]})}),"\n",(0,s.jsxs)(n.p,{children:["If the app is distinct among different versions of your app on Flathub\n(e.g. ",(0,s.jsx)(n.code,{children:"Firefox Beta"})," versus the standard ",(0,s.jsx)(n.code,{children:"Firefox"}),"), then using the full\nname including the edition may be acceptable."]}),"\n",(0,s.jsx)(n.h3,{id:"no-weird-formatting",children:"No weird formatting"}),"\n",(0,s.jsx)(n.p,{children:"App names should avoid nonstandard formatting and punctuation. For\nexample, avoid all-lowercase, all-uppercase, camel/pascal case, and\npunctuation like dashes or periods."}),"\n",(0,s.jsx)(n.admonition,{title:"Bad examples",type:"danger",children:(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"krita"}),"\n",(0,s.jsx)(n.li,{children:"FRACTAL"}),"\n",(0,s.jsx)(n.li,{children:"ApostropheEditor"}),"\n",(0,s.jsx)(n.li,{children:"Firefox.org"}),"\n"]})}),"\n",(0,s.jsxs)(n.p,{children:["Cases where the formatting is part of an established brand may be\nexempt (e.g. ",(0,s.jsx)(n.code,{children:"VLC"}),")."]}),"\n",(0,s.jsx)(n.h2,{id:"summary",children:"Summary"}),"\n",(0,s.jsx)(n.h3,{id:"not-too-long-1",children:"Not too long"}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.a,{href:"/docs/for-app-authors/metainfo-guidelines/#name-and-summary",children:"summary"}),"\nshould ideally be between 10 and 25 characters, and no longer than 35\ncharacters."]}),"\n",(0,s.jsx)(n.admonition,{title:"Good example",type:"tip",children:(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Write markdown in style"}),"\n"]})}),"\n",(0,s.jsx)(n.admonition,{title:"Bad example",type:"danger",children:(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Simple, easy-to-use, distraction-free markdown editor written in\nPython"}),"\n"]})}),"\n",(0,s.jsx)(n.h3,{id:"not-technical",children:"Not technical"}),"\n",(0,s.jsx)(n.p,{children:'The summary should be understandable by a non-technical person, and not\ncontain any technical terms. Don\'t mention the toolkit, programming\nlanguage, or other implementation details that would not be relevant to\na non-developer and explain what the app does for people instead. Don\'t\nduplicate metadata that\'s already available in a different form, such as\nthe license, e.g. by mentioning that the app is "free and open source".\nAvoid generic nouns like "app", "tool", or "client".'}),"\n",(0,s.jsx)(n.admonition,{title:"Bad examples",type:"danger",children:(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"GTK4 chat app written in Rust"}),"\n",(0,s.jsx)(n.li,{children:"An Electron Wrapper for the Telegram Web App"}
1),"\n",(0,s.jsx)(n.li,{children:"Free and open source Qt5 Matrix client"}),"\n"]})}),"\n",(0,s.jsx)(n.admonition,{type:"tip",children:(0,s.jsxs)(n.p,{children:["There are separate fields for technical information. If you want to\nmention the toolkit do it in ",(0,s.jsx)(n.a,{href:"https://www.freedesktop.org/software/appstream/docs/chap-Metadata.html#tag-keywords",children:"keywords"}),"."]})}),"\n",(0,s.jsx)(n.h3,{id:"no-weird-formatting-1",children:"No weird formatting"}),"\n",(0,s.jsx)(n.p,{children:"The summary should not have any weird formatting or punctuation. It\nshould use sentence case, rather than title case. It shouldn't end with\na full stop."}),"\n",(0,s.jsx)(n.admonition,{title:"Bad example",type:"danger",children:(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"A Simple Markdown Editor."}),"\n"]})}),"\n",(0,s.jsx)(n.h3,{id:"dont-repeat-the-name",children:"Don't repeat the name"}),"\n",(0,s.jsx)(n.p,{children:"The summary is usually shown next to the app name, so repeating the name\nlooks bad."}),"\n",(0,s.jsx)(n.admonition,{title:"Bad example",type:"danger",children:(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Apostrophe - A simple markdown editor"}),"\n"]})}),"\n",(0,s.jsx)(n.h3,{id:"dont-start-with-an-article",children:"Don't start with an article"}),"\n",(0,s.jsx)(n.p,{children:"Starting summaries with an article is almost always unnecessary. Instead,\neither omit the article or ideally phrase it in the imperative with a\nverb."}),"\n",(0,s.jsx)(n.admonition,{title:"Bad examples",type:"danger",children:(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"An image viewer"}),"\n",(0,s.jsx)(n.li,{children:"The LibreOffice suite"}),"\n"]})}),"\n",(0,s.jsx)(n.admonition,{title:"Good examples",type:"tip",children:(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"View images and videos"}),"\n",(0,s.jsx)(n.li,{children:"Edit documents"}),"\n"]})}),"\n",(0,s.jsx)(n.h2,{id:"description",children:"Description"}),"\n",(0,s.jsx)(n.h3,{id:"dont-repeat-the-summary",children:"Don't repeat the summary"}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.a,{href:"/docs/for-app-authors/metainfo-guidelines/#description",children:"description"}),"\nshould not just repeat or rephrase the summary. The summary is a kind\nof slogan or advertisement for the app, while the description should go\ninto more detail about the purpose of the app, which features it has, and\nwhat makes it unique."]}),"\n",(0,s.jsx)(n.h3,{id:"not-too-short",children:"Not too short"}),"\n",(0,s.jsx)(n.p,{children:"The description should be substantially longer than the summary.\nSomething like 3-6 lines of text at default line widths\n(around 70 characters) is a good length for most apps, for very large\napps up to about 10 lines."}),"\n",(0,s.jsx)(n.h3,{id:"no-super-long-lists",children:"No super long lists"}),"\n",(0,s.jsx)(n.p,{children:"Avoid feature lists with more than 10 items, they are difficult to scan\nand make the app store listing unwieldy. Instead, try to group points or\nuse paragraphs instead of bullet points."}),"\n",(0,s.jsx)(n.h2,{id:"screenshots",children:"Screenshots"}),"\n",(0,s.jsx)(n.h3,{id:"at-least-one-screenshot",children:"At least one screenshot"}),"\n",(0,s.jsxs)(n.p,{children:["Apps should have at least one ",(0,s.jsx)(n.a,{href:"/docs/for-app-authors/metainfo-guidelines/#screenshots",children:"screenshot"}),"\nin English. For medium-complexity apps, 3-6 is a good range, for very\nlarge apps with lots of screens 6-10 is appropriate. More than 10 is\nprobably too many."]}),"\n",(0,s.jsxs)(n.admonition,{type:"tip",children:[(0,s.jsx)(n.p,{children:"Your best screenshot should be in the first position because it will be\nthe first thing a user sees when viewing your app on Flathub."}),(0,s.jsx)(n.p,{children:"We might also use this in other places, such as featured banners, so\nmake sure it's a good one."})]}),"\n",(0,s.jsx)(n.h3,{id:"tag-screenshots-with-the-correct-language",children:"Tag screenshots with the correct language"}),"\n",(0,s.jsxs)(n.p,{children:["Screenshots should be tagged with the ",(0,s.jsx)(n.a,{href:"/docs/for-app-authors/metainfo-guidelines/#metainfo-translations",children:"language"}),"\nthey are in. For example, if you have a screenshot of the app in German,\ntag it with ",(0,s.jsx)(n.code,{children:'xml:lang="de"'}),"."]}),"\n",(0,s.jsx)(n.h3,{id:"just-the-app-window",children:"Just the app window"}),"\n",(0,s.jsx)(n.p,{children:'Use the "window screenshot" feature in your native system screenshot\ntool to get just the app window and its shadow. Do not include the\nwallpaper behind the app or even the entire desktop. Do not edit the\nscreenshot, crop it, add text, or include promotional graphics.'}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Examples of a screenshot that includes the entire desktop with the window, one that has promotional graphics, and one that&#39;s a standalone window.",src:t(2924).A+"",width:"862",height:"256"})}),"\n",(0,s.jsx)(n.h3,{id:"take-screenshots-on-linux",children:"Take screenshots on Linux"}),"\n",(0,s.jsx)(n.p,{children:"Do not use screenshots taken on other platforms, especially if it's\nimmediately obvious from window controls and the like."}),"\n",(0,s.jsx)(n.h3,{id:"default-settings",children:"Default settings"}),"\n",(0,s.jsx)(n.p,{children:"Use the platform default configuration for all settings that affect\nscreenshots, including window controls, interface font, large text,\nhigh contrast, dark style, accent color, and so on. Having some\nscreenshots to show off that e.g. dark style is supported is fine, but\nthese should not be the only screenshots."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Examples of screenshots with default settings and custom font, window button layout, and high contrast enabled.",src:t(4584).A+"",width:"580",height:"444"})}),"\n",(0,s.jsx)(n.h3,{id:"include-window-shadow-and-rounded-corners",children:"Include window shadow and rounded corners"}),"\n",(0,s.jsx)(n.p,{children:"Screenshots must include the native decoration such as any title bar,\nwindow shadows, and rounded corners. App stores do not add a shadow after\nthe fact, and without one, screenshots can look glitchy or have low\ncontrast depending on the background. Apps that are always fullscreen\n(such as most games) are exempt from this, but in these cases, all\nscreenshots must be fullscreen. Do not use a mix of windowed and\nfullscreen screenshots."}),"\n",(0,s.jsx)(n.admonition,{type:"tip",children:(0,s.jsx)(n.p,{children:"Don't maximize your app window when taking screenshots, since this will\nremove the shadow and rounding."})}),"\n",(0,s.jsx)(n.h3,{id:"reasonable-window-size",children:"Reasonable window size"}),"\n",(0,s.jsx)(n.p,{children:"In order to ensure that text and interface elements are visible scaled\ndown in the app store UI the window size should be 1000x700 pixels or\nsmaller (2000x1400 for HiDPI)."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Examples for screenshots that are too large, and the correct size.",src:t(3292).A+"",width:"625",height:"256"})}),"\n",(0,s.jsx)(n.h3,{id:"image-captions",children:"Image captions"}),"\n",(0,s.jsxs)(n.p,{children:["Every screenshot should have a ",(0,s.jsx)(n.a,{href:"https://www.freedesktop.org/software/appstream/docs/chap-Metadata.html#tag-screenshots",children:"caption"}),"\nbriefly describing it. Captions should only be one sentence and not end\nwith a full stop. Don't start them with a number."]}),"\n",(0,s.jsx)(n.h3,{id:"good-content",children:"Good content"}),"\n",(0,s.jsx)(n.p,{children:"Screenshots of apps that display content (media viewers, notes apps,\nchat, social media, and the like) 
1should not show empty states or ugly\ncontent. Take some time to select high-quality content, it makes all the\ndifference for screenshots."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Examples for screenshots with just an empty state and actual content.",src:t(2416).A+"",width:"612",height:"256"})}),"\n",(0,s.jsx)(n.h3,{id:"up-to-date",children:"Up to date"}),"\n",(0,s.jsx)(n.p,{children:"Screenshots should reflect the current state of the app's interface, not\nsome previous version. If an app update makes visible changes to the\ninterface, screenshots should be updated at the same time."}),"\n",(0,s.jsx)(n.p,{children:"This also applies to changes in the environment's default window\ndecoration layout."}),"\n",(0,s.jsx)(n.h2,{id:"release-notes",children:"Release Notes"}),"\n",(0,s.jsx)(n.h3,{id:"release-notes-for-every-release",children:"Release notes for every release"}),"\n",(0,s.jsxs)(n.p,{children:["Make sure all your releases have ",(0,s.jsx)(n.a,{href:"/docs/for-app-authors/metainfo-guidelines/#release",children:"release notes"}),",\neven minor ones."]}),"\n",(0,s.jsx)(n.h3,{id:"short-but-informative",children:"Short but informative"}),"\n",(0,s.jsx)(n.p,{children:"Release notes should not be too long, and focus on briefly explaining\nwhat changed from a user perspective. 2-3 sentences for medium-sized\nreleases is a good length. For larger releases, avoid endless bullet\npoint lists and rather go with a few paragraphs or a shorter summarized\nlist instead."}),"\n",(0,s.jsx)(n.h3,{id:"no-bug-fixes-and-performance-improvements",children:'No "bug fixes and performance improvements"'}),"\n",(0,s.jsx)(n.p,{children:"Release notes should include some actual information about what changed\nrather than just a generic boilerplate."}),"\n",(0,s.jsx)(n.h2,{id:"age-ratings",children:"Age Ratings"}),"\n",(0,s.jsx)(n.h3,{id:"take-easily-accessible-content-into-account",children:"Take easily accessible content into account"}),"\n",(0,s.jsx)(n.p,{children:'Apps acting as "readers" or "stores" for external content should take\ninto account what is accessible by just navigating around in the app. If\ncontent of a certain type can be arrived at without searching or typing\nin URLs, the app should be tagged as containing it. For example, an RSS\nreader that doesn\'t feature any content can be "All Ages", but the\nrating for a manga app with pre-configured servers should reflect the\ncontent of those default sources.'}),"\n",(0,s.jsxs)(n.p,{children:["Please see the ",(0,s.jsx)(n.a,{href:"/docs/for-app-authors/metainfo-guidelines/#open-age-ratings-service-oars",children:"MetaInfo guidelines"}),"\non how to generate proper age ratings."]})]})}function c(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}},6682(e,n,t){t.d(n,{A:()=>o});const o=t.p+"assets/images/app-icon-contrast-603dbc9f0597f15c52c0db108eb04fc7.png"},2423(e,n,t){t.d(n,{A:()=>o});const o=t.p+"assets/images/app-icon-detail-f307a6141b639eb1c84dc9f5796c9fc2.png"},6623(e,n,t){t.d(n,{A:()=>o});const o=t.p+"assets/images/app-icon-footprint-6d4452eba012f97f09b6b8dc2ce7bf28.png"},4721(e,n,t){t.d(n,{A:()=>o});const o=t.p+"assets/images/app-icon-style-91505dac57d9d661be967e054399ddbd.png"},9183(e,n,t){t.d(n,{A:()=>o});const o=t.p+"assets/images/color-examples-b5812a4e182bb2cd38b8a1dffc401bb1.png"},3387(e,n,t){t.d(n,{A:()=>o});const o=t.p+"assets/images/color-light-dark-46988e1180e8ddbb4e112a5bf75c73a5.png"},2416(e,n,t){t.d(n,{A:()=>o});const o=t.p+"assets/images/screenshot-content-1357f1309044c5bfb8937307fd76c4de.png"},4584(e,n,t){t.d(n,{A:()=>o});const o=t.p+"assets/images/screenshot-default-e5a4cbe67327f29801692b8fad366449.png"},2924(e,n,t){t.d(n,{A:()=>o});const o=t.p+"assets/images/screenshot-just-window-c47026cba69d11d623bb71d50c8ea9d4.png"},3292(e,n,t){t.d(n,{A:()=>o});const o=t.p+"assets/images/screenshot-size-9c65e893e8282a5ffe5fb3f4bbc2a75d.png"},8453(e,n,t){t.d(n,{R:()=>a,x:()=>r});var o=t(6540);const s={},i=o.createContext(s);function a(e){const n=o.useContext(i);return o.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:a(e.components),o.createElement(i.Provider,{value:n},e.children)}}}]);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.