CINXE.COM
Account — 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> Account — RoaringApps </title> <!-- Stylesheets --> <link rel="stylesheet" href="/../assets/css/site-2-7-1.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-native-windows-arm-apps">Apps native on Windows ARM</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="AccountPageCtrl" ng-class="{'overlay-in': state.overlayIn }"> <div class="ng-wrapper" ng-cloak> <div class="container"> <div class="row "> <div class="col-xs-12"> <ol class="breadcrumb"> <li> <a href="/">Home</a> </li> <li> <a href="/account">Account</a> </li> </ol> <div class="page-header underline transparent tab-bar"> <h1>Preferences</h1> <a href="/account/watching">Notifications</a> <a href="/account/favourites">Favourites</a> <a href="/account/installed">Installed Apps</a> </div> </div> </div> <div class="row"> <div class="col-xs-12" class="text-centre" ng-if="user"> <a href="/account/favourites" class="btn">Favourites</a> <a href="/apps?installed" class="btn">Installed applications</a> <a href="/account/watching" class="btn">App notifications</a> <!--<button class="btn">My status reports</button>--> </div> </div> <hr class="invisible" /> <div class="row"> <div class="col-xs-12 col-sm-6 col-md-4" ng-if="user"> <div class="border-box"> <h3>Account details</h3> <div class="form-group"> <label>Username</label> <input type="text" name="username" ng-model="user.username" disabled /> </div> <div class="form-group"> <label>Email</label> <input type="email" name="email" ng-model="user.email" disabled /> </div> </div> <div class="border-box"> <h3>Change email</h3> <form> <div class="form-group"> <label for="acc-change-email-new-email">New email</label> <input type="email" id="acc-change-email-new-email" ng-model="form.changeEmail.newEmail" required /> </div> <div class="form-group"> <label for="acc-change-email-password">Password</label> <input type="password" id="acc-change-email-password" ng-model="form.changeEmail.password" required /> </div> <div class="form-group"> <button class="btn btn-outline" ng-click="changeEmail()" ng-hide="form.changeEmail.waiting">Change email</button> <div class="btn btn-outline modal-button-loader" ng-show="form.changeEmail.waiting"> <div class="spinner spinner-three-dots faster"> <div class="bounce1"></div> <div class="bounce2"></div> <div class="bounce3"></div> </div> </div> </div> <div class="form-group"> <p class="msg error" ng-if="form.changeEmail.errorMsg">{{form.changeEmail.errorMsg}}</p> <p class="msg success" ng-if="form.changeEmail.successMsg">{{form.changeEmail.successMsg}}</p> </div> </form> </div> <div class="border-box"> <h3>Change password</h3> <form> <div class="form-group"> <label for="acc-current-password">Current password</label> <input type="password" id="acc-current-password" ng-model="form.password.current" /> </div> <div class="form-group"> <label for="acc-new-password">New password</label> <input type="password" id="acc-new-password" ng-model="form.password.new" /> </div> <div class="form-group"> <button class="btn btn-outline" ng-click="changePassword()" ng-hide="form.password.waiting">Change password</button> <div class="btn btn-outline modal-button-loader" ng-show="form.password.waiting"> <div class="spinner spinner-three-dots faster"> <div class="bounce1"></div> <div class="bounce2"></div> <div class="bounce3"></div> </div> </div> </div> <div class="form-group"> <p class="msg error" ng-if="form.password.errorMsg">{{form.password.errorMsg}}</p> <p class="msg success" ng-if="form.password.successMsg">{{form.password.successMsg}}</p> </div> </form> </div> </div> <div class="col-xs-12 col-sm-6 col-md-4"> <div class="border-box"> <h3>Site preferences</h3> <form> <div class="form-group"> <label for="account-select-appstore-currency">App Store Currency</label> <select class="form-select" name="account-select-appstore-currency" id="account-select-appstore-currency" ng-model="user.preferences.appstore_currency" ng-options="c.code as (c.code + ' – ' + c.name) for c in APPSTORE_CURRENCY_CODES"> </select> </div> <div class="form-group"> <label for="account-apps-table-rows">Apps per page on compatibility table</label> <select class="form-select" name="account-apps-table-rows" id="account-apps-table-rows" ng-model="user.preferences.table_rows" ng-options="n for n in [10,25,50,100]"> </select> </div> <div class="form-group"> <label for="account-table-default-filter">Default filter on compatibility table</label> <select class="form-select" name="account-table-default-filter" id="account-table-default-filter" ng-model="user.preferences.table_default_filter" ng-options="n.name as n.title for n in [{name:'all', title:'All apps'}, {name:'installed', title:'Installed'}, {name:'favourites',title: 'Favourites'}]"> </select> </div> <div class="form-group"> <button class="btn btn-outline" ng-click="savePreferences()">Save</button> </div> <div class="form-group"> <p class="msg error" ng-if="form.preferences.errorMsg">{{form.preferences.errorMsg}}</p> <p class="msg success" ng-if="form.preferences.successMsg">{{form.preferences.successMsg}}</p> </div> </form> </div> </div> <div class="col-xs-12 col-sm-6 col-md-4"> <div class="border-box"> <h3>Reset</h3> <p> <button class="btn btn-outline btn-danger" ng-click="clearCache()">Clear cache</button> </p> <p class="control-hint">RoaringApps keeps a copy of application and developer data on your computer to make the site quicker and to reduce the amount of bandwidth used over time.</p> <p class="control-hint">Unfortunately sometimes this local cache can become corrupted. If the site isn't working properly, or if you think the data shown is not up to date, you can clear the cache and start again from scratch.</p> <div class="form-group"> <p class="msg success" ng-if="state.clearCacheComplete">The cache has been cleared.</p> </div> </div> </div> </div><!-- /.row --> </div><!-- /.container --> </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-7-1.js"></script> <script> if (typeof lucide !== undefined) lucide.createIcons(); </script> </body> </html>