CINXE.COM
Application Compatibility Table — RoaringApps
<!DOCTYPE html> <html lang="en" ng-app="RoaringApps"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="description" content="Crowd-sourced application compatibility for macOS, iOS and Windows."> <meta name="keywords" content="mac,macos,mac os x,mojave,catalina,big sur,monterey,apple silicon,arm macs,m1 macs,catalyst apps,32-bit apps,app,application,application compatibility,apple,roaringapps,mac app store,table,windows,ios,ios 14,ios 15"> <title> Application Compatibility Table — RoaringApps </title> <!-- Stylesheets --> <link rel="stylesheet" href="/assets/css/site-2-6-4.css"> <!-- Webfonts --> <link href='https://fonts.googleapis.com/css?family=Lato:100,400,700,100italic,400italic,700italic|Rancho|Merriweather+Sans:400,300,300italic,400italic,700,700italic|Cookie' rel='stylesheet' type='text/css'> <!--[if lt IE 9]> <script src="/assets/js/ie8-responsive-file-warning.js"></script> <![endif]--> <!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries --> <!--[if lt IE 9]> <script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script> <script src="https://oss.maxcdn.com/libs/respond.js/1.3.0/respond.min.js"></script> <![endif]--> <!-- Favicons --> <link rel="shortcut icon" href="/assets/ico/favicon.png"> <link rel="shortcut icon" href="/favicon.ico"> <!-- Angular $location.html5Mode = true requires this --> <base href="/"> <script async src="https://www.googletagmanager.com/gtag/js?id=G-3G6DX7LY1W"></script> <script> window.dataLayer = window.dataLayer || []; function gtag() { dataLayer.push(arguments); } gtag('js', new Date()); gtag('config', 'G-3G6DX7LY1W'); </script> <script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script> <script type="text/javascript"> (adsbygoogle = window.adsbygoogle || []).push({ google_ad_client: "ca-pub-4932023458712014", enable_page_level_ads: true }); </script> <script src="/assets/js/vendor/modernizr.js" data-cfasync='true'></script> <!-- First input delay polyfill - used by Firebase Performance Monitoring. Ref: https://firebase.google.com/docs/perf-mon/get-started-web Ref2: https://github.com/GoogleChromeLabs/first-input-delay --> <script type="text/javascript"> ! function(n, e) { var t, o, i, c = [], f = { passive: !0, capture: !0 }, r = new Date, a = "pointerup", u = "pointercancel"; function p(n, c) { t || (t = c, o = n, i = new Date, w(e), s()) } function s() { o >= 0 && o < i - r && (c.forEach(function(n) { n(o, t) }), c = []) } function l(t) { if (t.cancelable) { var o = (t.timeStamp > 1e12 ? new Date : performance.now()) - t.timeStamp; "pointerdown" == t.type ? function(t, o) { function i() { p(t, o), r() } function c() { r() } function r() { e(a, i, f), e(u, c, f) } n(a, i, f), n(u, c, f) }(o, t) : p(o, t) } } function w(n) { ["click", "mousedown", "keydown", "touchstart", "pointerdown"].forEach(function(e) { n(e, l, f) }) } w(n), self.perfMetrics = self.perfMetrics || {}, self.perfMetrics.onFirstInputDelay = function(n) { c.push(n), s() } }(addEventListener, removeEventListener); </script> <!-- Sentry.io error monitoring --> <script src="https://js.sentry-cdn.com/9bccfd17b53521da4d6c21b201931d8c.min.js" crossorigin="anonymous"></script> <script> window.ENVIRONMENT = 'production'; </script> </head> <body class="{{bodyClass}}" ng-cloak> <a class="sr-only" href="#content">Skip to main content</a> <div class="wrapper"> <!-- Navigation component --> <header class="navbar navbar-fixed-top " role="banner" ng-controller="HeaderCtrl"> <div class="container"> <div class="navbar-header"> <button class="navbar-toggle collapsed" type="button" data-toggle="collapse" data-target=".bs-navbar-collapse"> <span class="sr-only">Toggle navigation</span> <svg class="icon"> <use xlink:href="/assets/svg/icons.svg#shape-chevron-down" /> </svg> </button> <a href="/" class="navbar-brand">RoaringApps</a> </div> <nav class="collapse navbar-collapse bs-navbar-collapse" role="navigation"> <ul class="nav navbar-nav navbar-centre"> <li> <a href="/apps">Apps</a> </li> <li class="dropdown main-dropdown"> <a href="#" class="dropdown-toggle" data-toggle="dropdown">Collections</a> <ul class="dropdown-menu" role="menu"> <li> <a href="/collections/list-of-apple-silicon-native-apps">Apps ready for Apple Silicon</a> </li> <li> <a href="/collections/list-of-32-bit-macos-apps">macOS 32-bit apps</a> </li> <li> <a href="/collections/discontinued-macos-ios-apps">Discontinued apps</a> </li> <li> <a href="/app-collection/ios-carplay-apps">iOS CarPlay apps</a> </li> <li> <a href="/app-collections">More collections...</a> </li> </ul> </li> <li> <a href="/mac-app">Download</a> </li> <!--<li> <a href="/blog">Blog</a> </li>--> <li> <a href="/about">About</a> </li> <li> <a href="/app/+">Add App</a> </li> </ul> <ul class="nav navbar-nav navbar-right"> <li> <a href="#" data-toggle="modal" data-target="#modal-search" class="with-icon"> <span class="sr-only">Search applications</span> <svg class="icon fav-icon-outline"> <use xlink:href="/assets/svg/icons.svg#shape-magnifying-glass" /> </svg> </a> </li> <li class="hidden-sm"> <a href="#" data-toggle="modal" data-target="#modal-feedback">Feedback</a> </li> <li class="dropdown account-dropdown" ng-if="user"> <a href="#" class="dropdown-toggle" data-toggle="dropdown">{{user.username}}</a> <ul class="dropdown-menu pull-right" role="menu"> <li> <a href="/account">Account</a> </li> <li> <a href="/account/watching">Notifications</a> </li> <li ng-if="user.role == 'admin'" class="divider"></li> <li ng-if="user.role == 'admin'"> <a href="/admin/dashboard">Admin dashboard</a> </li> <li ng-if="user.role == 'admin'"> <a href="/admin/comments">Comments review</a> </li> <li ng-if="user.role == 'admin'"> <a href="/admin/screenshots">Screenshot review</a> </li> <li ng-if="user.role == 'admin'"> <a href="/admin/tags">Tag manager</a> </li> <li ng-if="user.role == 'admin'"> <a href="/admin/itunes-importer">iTunes Importer</a> </li> <li ng-if="user.role == 'admin'" class="divider"></li> <li> <a href="/logout" ng-click="logout($event)">Log out</a> </li> </ul> </li> <li ng-if="!user"> <a href="#" data-toggle="modal" data-target="#modal-register" class="account-register">Register</a> </li> <li ng-if="!user"> <a href="#" data-toggle="modal" data-target="#modal-signin" class="account-signin">Sign in</a> </li> </ul> </nav> </div> </header> <section id="main" ng-controller="AppsCtrl" ng-class="{'overlay-in': state.overlayIn }"> <!-- loading animation --> <div class="ra-loader" ng-if="state.loading"> <div class="spinner spinner-three-dots"> <div class="bounce1"></div> <div class="bounce2"></div> <div class="bounce3"></div> </div> <p class="loading-msg">{{state.loadingMsg}}</p> </div> <!-- --> <div class="ng-wrapper {{state.loading ? 'loading': ''}}" ng-cloak> <div class="fullscreen-prompt" ng-if="state.showDownloadPrompt"> <div class="container"> <div class="row"> <div class="col-xs-12 col-sm-8 col-sm-offset-2 col-md-6 col-md-offset-3"> <h1 class="page-title">How fast is your computer?</h1> <p>The RoaringApps compatibility table works best with a decent internet connection and reasonably-specced computer.</p> <p class="text-centre"> <a href="#" class="btn btn-outline" ng-click="setConfigDownloadStatus(true)">Proceed to compatibility table</a> </p> <p>If your computer is getting a little long in the tooth, or if you're on a mobile device, you might be better off with one of these alternative options to access the data:</p> <ul> <li>Search for specific applications on the <a href="/">home page</a> </li> <li>Only show my <a href="/apps?favourites&standalone">favourited applications</a> </li> <li>Only show my <a href="/apps?installed&standalone">installed applications</a> </li> <li> <a href="/mac-app">Download the RoaringApps Mac app</a> to scan for apps on your computer </li> </ul> </div> </div> </div> </div> <div class="container-fluid" ng-show="!state.showDownloadPrompt"> <div class="sticky-header-container"></div> <div class="row"> <div class="col-xs-12" ng-if="!state.loading && !user._noAds"> <div class="d-flex"> <div class="adunit ad-banner border-box m-x-20"> <!-- RoaringApps_AppsTable_Bottom --> <ins class="adsbygoogle" style="display:inline-block;width:728px;height:90px" data-ad-client="ca-pub-4932023458712014" data-ad-slot="1691984337"></ins> </div> <div class="ad-banner ra-promo-box border-box m-x-20"> <p><strong>Checkout our roundup of iOS interactive widgets</strong> </p> <a href="/app-collection/ios17-apps-with-interactive-widgets" class="btn btn-outline btn-primary">View the collection of apps →</a> </div> </div> </div> </div> <div class="row"> <div class="col-md-4 title"> <h3>Application compatibility table</h3> </div> <div class="col-md-8"> <ul class="apps-filters"> <li class="toggle-show-filters {{state.showFilters ? 'current' : ''}}" ng-click="state.showFilters = !state.showFilters">Filters</li> <li class="toggle-show-options {{state.showOptions ? 'current' : ''}}" ng-click="state.showOptions = !state.showOptions">Options</li> <li class="toggle-show-legend" id="modal-label-apps-legend" data-toggle="modal" data-target="#modal-apps-legend"> Legend <svg class="icon"> <use xlink:href="/assets/svg/icons.svg#shape-help-filled" /> </svg> </li> </ul> <ul class="apps-filters" id="apps-filters-main"> <li class="{{state.filteringDeveloper ? 'current' : ''}}" ng-show="state.filteringDeveloper">Developed by {{state.filteringDeveloper}}</li> <li class="{{state.filteringTags.length ? 'current' : ''}}" ng-show="state.filteringTags.length">Tagged “{{state.filteringTags}}”</li> <li class="{{(!state.filteringTags && !state.filteringDeveloper && !state.filteringFavourites && !state.filteringInstalled && !state.filteringStatus && state.filteringPlatforms.length === 0) ? 'current' : ''}}" ng-click="filterTable.reset()">Show all</li> <li class="{{state.filteringInstalled ? 'current' : ''}}" ng-show="user && user.hasOwnProperty('installed')" ng-click="filterTable.toggle('Installed')">Installed on your Mac</li> <li class="{{state.filteringFavourites ? 'current' : ''}}" ng-show="user && user.hasOwnProperty('favourites')" ng-click="filterTable.toggle('Favourites')">Favourites</li> <!--<li id="filter-dock">Dock</li>--> </ul> </div> </div> <div class="row filters-container {{state.showFilters ? 'show' : ''}}"> <div class="col-xs-12"> <h4>Filter by platform:</h4> <ul class="apps-filters apps-options"> <li class="{{state.filteringPlatforms.indexOf('osx') >= 0 ? 'current' : ''}}" ng-click="filterTable.toggle('platform', 'osx')">macOS</li> <li class="{{state.filteringPlatforms.indexOf('ios') >= 0 ? 'current' : ''}}" ng-click="filterTable.toggle('platform', 'ios')">iOS</li> <li class="{{state.filteringPlatforms.indexOf('windows') >= 0 ? 'current' : ''}}" ng-click="filterTable.toggle('platform', 'windows')">Windows</li> </ul> </div> <div class="col-xs-12"> <h4>Filter by compatibility status:</h4> <p>Only show <select ng-model="filterTable.statusFilter.os" ng-options="p.reference as p.name group by p.platform for p in allPlatforms"></select>applications that have the status: <select ng-model="filterTable.statusFilter.status"> <optgroup label="Statuses"> <option value="✓">Works fine</option> <option value="!">Some problems</option> <option value="×">Doesn't work</option> </optgroup> <optgroup label="Other"> <option value="⁇">Unknown</option> <option value="~">Conflicting information</option> </optgroup> </select> <span class="clear-btn" ng-show="filterTable.statusFilter.status || filterTable.statusFilter.os" ng-click="filterTable.clearStatusFilter()">Clear</span> </p> </div> <div class="col-xs-12"> <h4>Filter by architecture:</h4> <ul class="apps-filters apps-options"> <li class="{{state.filteringArchitecture == '32' ? 'current' : ''}}" ng-click="filterTable.toggle('architecture', '32');">32-bit</li> <li class="{{state.filteringArchitecture == '64' ? 'current' : ''}}" ng-click="filterTable.toggle('architecture', '64');">64-bit</li> </ul> <ul class="apps-filters apps-options"> <li class="{{state.filteringCatalyst == true ? 'current' : ''}}" ng-click="filterTable.toggle('catalyst', !state.filteringCatalyst);">Built with Catalyst</li> </ul> <ul class="apps-filters apps-options"> <li class="{{state.filteringDiscontinued == true ? 'current' : ''}}" ng-click="filterTable.toggle('discontinued', !state.filteringDiscontinued);">Discontinued</li> </ul> </div> </div> <div class="row options-container {{state.showOptions ? 'show' : ''}}"> <div class="col-xs-12" style="margin-top: 10px;"> <h4>Show/hide columns</h4> <ul class="apps-filters apps-options apps-options-column-vis"> <li class="{{state.columnStates['macos15'].visible ? 'shown' : ''}}" data-version="macos15" ng-click="toggleColVis('macos15')">Sequoia</li> <li class="{{state.columnStates['macos14'].visible ? 'shown' : ''}}" data-version="macos14" ng-click="toggleColVis('macos14')">Sonoma</li> <li class="{{state.columnStates['ventura'].visible ? 'shown' : ''}}" data-version="ventura" ng-click="toggleColVis('ventura')">Ventura</li> <li class="{{state.columnStates['monterey'].visible ? 'shown' : ''}}" data-version="monterey" ng-click="toggleColVis('monterey')">Monterey</li> <li class="{{state.columnStates['big-sur'].visible ? 'shown' : ''}}" data-version="big-sur" ng-click="toggleColVis('big-sur')">Big Sur</li> <li class="{{state.columnStates['catalina'].visible ? 'shown' : ''}}" data-version="catalina" ng-click="toggleColVis('catalina')">Catalina</li> <li class="{{state.columnStates['mojave'].visible ? 'shown' : ''}}" data-version="mojave" ng-click="toggleColVis('mojave')">Mojave</li> <li class="{{state.columnStates['high-sierra'].visible ? 'shown' : ''}}" data-version="high-sierra" ng-click="toggleColVis('high-sierra')">High Sierra</li> <li class="{{state.columnStates['sierra'].visible ? 'shown' : ''}}" data-version="sierra" ng-click="toggleColVis('sierra')">Sierra</li> <li class="{{state.columnStates['el-capitan'].visible ? 'shown' : ''}}" data-version="el-capitan" ng-click="toggleColVis('el-capitan')">El Capitan</li> <li class="{{state.columnStates['yosemite'].visible ? 'shown' : ''}}" data-version="yosemite" ng-click="toggleColVis('yosemite')">Yosemite</li> </ul> <ul class="apps-filters apps-options apps-options-column-vis"> <li class="{{state.columnStates['ios18'].visible ? 'shown' : ''}}" data-version="ios18" ng-click="toggleColVis('ios18')">iOS 18</li> <li class="{{state.columnStates['ios17'].visible ? 'shown' : ''}}" data-version="ios17" ng-click="toggleColVis('ios17')">iOS 17</li> <li class="{{state.columnStates['ios16'].visible ? 'shown' : ''}}" data-version="ios16" ng-click="toggleColVis('ios16')">iOS 16</li> <li class="{{state.columnStates['ios15'].visible ? 'shown' : ''}}" data-version="ios15" ng-click="toggleColVis('ios15')">iOS 15</li> <li class="{{state.columnStates['ios14'].visible ? 'shown' : ''}}" data-version="ios14" ng-click="toggleColVis('ios14')">iOS 14</li> <li class="{{state.columnStates['ios13'].visible ? 'shown' : ''}}" data-version="ios13" ng-click="toggleColVis('ios13')">iOS 13</li> </ul> <ul class="apps-filters apps-options apps-options-column-vis"> <li class="{{state.columnStates['windows11'].visible ? 'shown' : ''}}" data-version="windows11" ng-click="toggleColVis('windows11')">Windows 11</li> <li class="{{state.columnStates['windows10'].visible ? 'shown' : ''}}" data-version="windows10" ng-click="toggleColVis('windows10')">Windows 10</li> <li class="{{state.columnStates['windows8_1'].visible ? 'shown' : ''}}" data-version="windows8_1" ng-click="toggleColVis('windows8_1')">Windows 8.1</li> <li class="{{state.columnStates['windows8'].visible ? 'shown' : ''}}" data-version="windows8" ng-click="toggleColVis('windows8')">Windows 8</li> <li class="{{state.columnStates['windows7'].visible ? 'shown' : ''}}" data-version="windows7" ng-click="toggleColVis('windows7')">Windows 7</li> <li class="{{state.columnStates['windows_vista'].visible ? 'shown' : ''}}" data-version="windows_vista" ng-click="toggleColVis('windows_vista')">Windows Vista</li> </ul> </div> <div class="col-xs-12"> <ul class="apps-filters apps-options apps-options-column-vis" style="margin-top: 10px;"> <li class="{{state.columnStates['macos_architecture'].visible ? 'shown' : ''}}" data-version="macos_architecture" ng-click="toggleColVis('macos_architecture')">Show macOS architecture column</li> <li class="{{state.columnStates['favourite'].visible ? 'shown' : ''}}" data-version="favourite" ng-click="toggleColVis('favourite')" ng-show="user">Show favourites column</li> <li class="{{state.columnStates['arm'].visible ? 'shown' : ''}}" data-version="arm" ng-click="toggleColVis('arm')">Show Apple Silicon column</li> </ul> </div> </div> <div id="apps-container" class="{{ state.narrowColumns ? 'narrow-columns' : '' }}"> <table id="apps"></table> </div> <div class="row"> <div class="col-xs-12 col-md-8 col-md-offset-2" ng-if="!state.loading && !user._noAds"> <div class="adunit ad-banner border-box"> <!-- RoaringApps_AppsTable_Top --> <ins class="adsbygoogle" style="display:inline-block;width:728px;height:90px" data-ad-client="ca-pub-4932023458712014" data-ad-slot="2621922629"></ins> </div> </div> </div> </div> </div> <!-- Feedback --> <div class="modal fade" id="modal-apps-legend" tabindex="-1" role="dialog" aria-labelledby="modal-label-apps-legend" aria-hidden="true"> <div class="modal-dialog"> <div class="modal-content"> <div class="modal-header"> <h4>What's all this?</h4> </div> <div class="modal-body"> <p>The RoaringApps database crowd-sources the experiences of thousands of users to give a big-picture understanding of app compatibility across macOS, iOS and Windows.</p> <p>The table on this page summarises the information in the database for each application. Compatibility is categorised into major releases for each operating system.</p> <p>To view more information and a break down of compatibility reports, click the app name.</p> <div class="legend-modal-status-types"> <div class="t t1"> <div class="status-circle"></div> <p>Circles summarise <strong>user-submitted compatibility reports</strong> .</p> </div> <div class="t t2"> <div class="status-oval"></div> <p>Ovals indicate that an app's developer <strong>officially supports (or doesn't support)</strong> the given OS version.</p> </div> </div> <div class="legend-modal-status-colours"> <div class="c c-green"> <div class="status-circle status-green"></div> <p><strong>Green & tick</strong> - the app works fine.</p> </div> <div class="c c-yellow"> <div class="status-circle status-yellow"></div> <p><strong>Yellow & !</strong> - the app runs, but there are some outstanding issues.</p> </div> <div class="c c-red"> <div class="status-circle status-red"></div> <p><strong>Red & ×</strong> - the app does not launch, or is unusable.</p> </div> <div class="c c-blue"> <div class="status-circle status-blue"></div> <p><strong>Blue & ?</strong> - no data available.</p> </div> <div class="c c-white"> <div class="status-circle status-white"></div> <p><strong>White & ~</strong> - conflicting information in the database. View the app's page for more details.</p> </div> </div> <p>If your experience with an app differs from that shown in the database, <a href="/help/contribute-to-roaringapps">share your experience</a> to help others like you.</p> </div> </div><!-- /.modal-content --> </div> </div> </section> <!-- Footer --> <footer role="contentinfo"> <div class="container"> <div class="row"> <div class="col-md-6"> <p> <i>⚒</i>by Bryce Cameron since 10.7. <!-- <a class="bmc-button" target="_blank" href="https://www.buymeacoffee.com/roaringapps?ref=rawf" style="align-items: center;"><span>Buy me a coffee</span> <img src="https://cdn.buymeacoffee.com/buttons/bmc-new-btn-logo.svg" alt="Buy me a coffee"></a> --> </p> </div> <div class="col-md-6"> <p class="pull-right"> <a href="/">Home</a> · <a href="/about">About</a> · <a href="/newsletter/join">Newsletter</a> · <a href="/help/contribute-to-roaringapps">Contribute</a> · <a href="/contact">Contact</a> · <a href="/account">Account</a> · <a href="/legal">Legal</a> </p> </div> </div><!-- /.row --> </div> </footer> <script data-name="BMC-Widget" data-cfasync="false" src="https://cdnjs.buymeacoffee.com/1.0.0/widget.prod.min.js" data-id="roaringapps" data-description="Support me on Buy me a coffee!" data-message="" data-color="#FF5F5F" data-position="Right" data-x_margin="18" data-y_margin="18"></script> </div> <!-- Modals --> <section class="the-modals" ng-controller="ModalCtrl"> <!-- Sign In --> <div class="modal fade narrow" id="modal-signin" tabindex="-1" role="dialog" aria-labelledby="modal-label-signin" aria-hidden="true"> <div class="modal-dialog"> <p class="modal-outside-meta modal-msg" ng-if="signinModalMsg">{{signinModalMsg}}</p> <div class="modal-content"> <div class="modal-body"> <form id="form-signin" ng-submit="login.submit()"> <div class="gravatar"></div> <input type="email" name="signin-email" ng-model="form.login.email" placeholder="Email address" /> <input type="password" name="signin-password" ng-model="form.login.password" placeholder="Password" /> <button class="btn btn-action" action="submit" name="signin-submit" ng-hide="login.submitting"> <span>Sign in</span> </button> <div class="btn btn-action modal-button-loader" ng-show="login.submitting"> <div class="spinner spinner-three-dots faster"> <div class="bounce1"></div> <div class="bounce2"></div> <div class="bounce3"></div> </div> </div> </form> </div> </div><!-- /.modal-content --> <p class="modal-outside-meta"> <a href="/account/forgot">Forgot?</a> <a class="pull-right" href="#" data-toggle="modal" data-target="#modal-register"><strong>Create an account</strong> </a> </p> </div> </div> <!-- Register / Create account --> <div class="modal fade narrow" id="modal-register" tabindex="-1" role="dialog" aria-labelledby="modal-label-register" aria-hidden="true"> <div class="modal-dialog"> <div class="modal-content"> <div class="modal-body"> <form id="form-register" ng-submit="register.submit()"> <div class="gravatar"></div> <input type="email" name="register-email" ng-model="form.register.email" placeholder="Email address" /> <input type="text" name="register-username" ng-model="form.register.username" placeholder="Username" /> <input type="password" name="register-password" ng-model="form.register.password" placeholder="Password" /> <button class="btn btn-action" action="submit" name="register-submit" ng-hide="register.submitting"> <span>Create account</span> </button> <div class="btn btn-action modal-button-loader" ng-show="register.submitting"> <div class="spinner spinner-three-dots faster"> <div class="bounce1"></div> <div class="bounce2"></div> <div class="bounce3"></div> </div> </div> </form> </div> </div><!-- /.modal-content --> <p class="modal-outside-meta">{{register.errors.join(' ')}}</p> </div> </div> <!-- Search --> <div class="modal fade search-modal" id="modal-search" tabindex="-1" role="dialog" aria-labelledby="modal-label-search" aria-hidden="true"> <div class="modal-dialog"> <div class="modal-content"> <div class="modal-body"> <form id="form-search"> <input type="search" id="search-input" name="search" ng-model="form.search.query" placeholder="Search applications" autocomplete="off" /> <span class="search-result-count" ng-show="search.results.length > 0">{{search.results.length}} apps</span> </form> <p class="search-msg" ng-show="search.searching">Searching...</p> <p class="search-msg" ng-show="search.empty">No results</p> <ul class="search-results"> <li class="result" ng-repeat="app in search.results | orderBy:'-_searchRank'"> <a href="/app/{{app.slug}}"> <img ng-src="{{app.icon}}" alt="{{app.icon ? app.name + ' icon' : 'No icon'}}" class="{{app.icon ? 'search-result-has-icon' : 'search-result-no-icon'}}" onerror="this.style.display='none'" /> <strong>{{app.name}}</strong> <span class="dev">{{app.developer}}</span> </a> </li> </ul> </div> </div><!-- /.modal-content --> <p class="modal-outside-meta">{{register.errors.join(' ')}}</p> </div> </div> <!-- Moderate --> <div class="modal fade" id="modal-moderate" tabindex="-1" role="dialog" aria-labelledby="modal-label-moderate" aria-hidden="true"> <div class="modal-dialog"> <div class="modal-content"> <div class="modal-header"> <h4>Moderator control panel</h4> </div> <div class="modal-body"> <form id="form-moderate"> <div class="row"> <div class="col-xs-12 col-sm-6"> <div class="form-group"> <label for="moderate-app-name">Application</label> <input type="text" name="moderate-app-name" id="moderate-app-name" ng-model="selectedApp.name" disabled /> </div> </div> <div class="col-xs-12 col-sm-6"> <div class="form-group"> <label for="moderate-app-slug">Slug</label> <input type="text" name="moderate-app-slug" id="moderate-app-slug" ng-model="selectedApp.slug" disabled /> </div> </div> <div class="col-xs-12 col-sm-6"> <div class="form-group"> <label for="moderate-app-developer">Developer</label> <input type="text" name="moderate-app-developer" id="moderate-app-developer" ng-model="selectedApp.developer" disabled /> </div> </div> <div class="col-xs-12 col-sm-6"> <div class="form-group"> <label for="moderate-app-url">URL</label> <input type="text" name="moderate-app-url" id="moderate-app-url" ng-model="selectedApp.url" disabled /> </div> </div> </div> <div class="form-group"> <p ng-if="!selectedApp.statuses">This application has no status reports.</p> </div> <div class="form-group"> <button class="btn btn-outline btn-danger" ng-click="moderate.delete(selectedApp.slug)">Delete app</button> <button class="btn btn-outline" ng-click="moderate.merge.chooseTo(selectedApp.slug)">Merge with...</button> <button class="btn btn-outline" ng-click="moderate.appCollection.add(selectedApp.slug)">Add to collection...</button> <button class="btn btn-outline">Update</button> </div> </form> </div> </div><!-- /.modal-content --> <p class="modal-outside-meta">For use only by approved RoaringApps moderators.</p> </div> </div> <!-- Feedback --> <div class="modal fade" id="modal-feedback" tabindex="-1" role="dialog" aria-labelledby="modal-label-feedback" aria-hidden="true"> <div class="modal-dialog"> <div class="modal-content"> <div class="modal-header"> <h4>Submit Feedback</h4> </div> <div class="modal-body"> <p>I develop RoaringApps in my (rather limited) spare time, so sometimes I miss bugs here and there. If you notice something not quite working properly, or have an idea for the site, I'd love to hear from you.</p> <form id="form-feedback" name="feedbackForm" ng-submit="feedback.submit(feedbackForm.$valid)" novalidate> <!-- novalidate disables HTML5 validation, so we can use the angular validation --> <div class="row"> <div class="col-xs-12 col-sm-6"> <div class="form-group"> <label for="feedback-name">Name</label> <input type="text" name="feedback-name" id="feedback-name" ng-model="form.feedback.name" required /> </div> </div> <div class="col-xs-12 col-sm-6"> <div class="form-group"> <label for="feedback-email">Email (optional)</label> <input type="email" name="feedback-email" id="feedback-email" ng-model="form.feedback.email" /> </div> </div> </div> <div class="form-group"> <label for="feedback-comment">Comment</label> <textarea id="feedback-comment" ng-model="form.feedback.comment" required></textarea> </div> <div class="form-group form-action-area"> <input type="submit" value="Send feedback" class="btn btn-outline" ng-disabled="feedbackForm.$invalid" /> </div> <div class="form-group"> <p class="msg error" ng-if="feedback.errorMsg">{{feedback.errorMsg}}</p> <p class="msg success" ng-if="feedback.successMsg">{{feedback.successMsg}}</p> </div> </form> </div> </div><!-- /.modal-content --> </div> </div> <!-- Report comment --> <div class="modal fade" id="modal-report-comment" tabindex="-1" role="dialog" aria-labelledby="modal-label-report-comment" aria-hidden="true"> <div class="modal-dialog"> <div class="modal-content"> <div class="modal-header"> <h4>Report comment</h4> </div> <div class="modal-body"> <p>Report this comment to help the moderators identify items that require attention.</p> <form id="form-report-comment" name="reportCommentForm" ng-submit="reportComment.submit(reportCommentForm.$valid)" novalidate> <!-- novalidate disables HTML5 validation, so we can use the angular validation --> <div class="row"> <div class="col-xs-12"> <div class="form-group"> <label for="report-comment-reason">Reason</label> <select name="report-comment-reason" id="report-comment-reason" ng-model="form.reportComment.reason" required> <option>Invalid advice</option> <option>Illegal/inappropriate</option> <option>Off-topic</option> <option>Personal attack</option> <option>Spam</option> <option>Other</option> </select> </div> </div> <div class="col-xs-12"> <div class="form-group"> <label for="report-comment-description">Description (optional)</label> <textarea id="report-comment-description" ng-model="form.reportComment.description"></textarea> </div> </div> <div class="col-xs-12"> <div class="form-group form-action-area"> <input type="submit" value="Submit report" class="btn btn-outline" ng-disabled="reportCommentForm.$invalid" /> </div> <div class="form-group"> <p class="msg error" ng-if="reportComment.errorMsg">{{reportComment.errorMsg}}</p> <p class="msg success" ng-if="reportComment.successMsg">{{reportComment.successMsg}}</p> </div> </div> </div><!-- /.row --> </form> </div> </div><!-- /.modal-content --> </div> </div><!-- /.modal (report comment) --> </section> <!-- JS and analytics only. --> <script src="/assets/js/production-2-6-4.js"></script> <script> if (typeof lucide !== undefined) lucide.createIcons(); </script> </body> </html>