(function(){ function initDockStacksNav(){ var nav = document.getElementById('ds-nav'); if(!nav) return; /* * Move navbar directly into * for reliable fixed positioning in Carrd. */ if(nav.parentNode !== document.body){ document.body.appendChild(nav); } /* * Carrd section break IDs. * * These determine when the navbar * should hide at the beginning of * each section. */ var sectionIDs = [ 'keyfeatures', 'privacy', 'pricing', 'faq', 'support' ]; /* * Get the absolute position of a section. */ function getSectionPosition(id){ var el = document.getElementById(id); if(!el) return null; var rect = el.getBoundingClientRect(); return rect.top + window.pageYOffset; } /* * Update navbar visibility. */ function updateNav(){ var scrollY = window.pageYOffset || document.documentElement.scrollTop; /* * Hide at the very top of the website. */ if(scrollY <= 40){ nav.classList.remove('ds-visible'); return; } /* * Find the most recent section * that the user has entered. */ var currentSectionTop = 0; sectionIDs.forEach(function(id){ var position = getSectionPosition(id); if( position !== null && position <= scrollY && position > currentSectionTop ){ currentSectionTop = position; } }); /* * Calculate how far into the * current section the user is. */ var distanceIntoSection = scrollY - currentSectionTop; /* * Hide navbar for the first 40px * of every section. */ if(distanceIntoSection <= 40){ nav.classList.remove('ds-visible'); }else{ nav.classList.add('ds-visible'); } } /* * Monitor scrolling. */ window.addEventListener( 'scroll', updateNav, {passive:true} ); /* * Handle Carrd section navigation. */ window.addEventListener( 'hashchange', function(){ setTimeout(updateNav,150); } ); /* * Initial state. */ setTimeout(updateNav,100); } /* * Wait for Carrd to finish loading. */ if(document.readyState === 'loading'){ document.addEventListener( 'DOMContentLoaded', initDockStacksNav ); }else{ initDockStacksNav(); } })();

LOCKTIGHT FOR MAC OS

Lock your apps.
Keep your
privacy.

Requires macOS 13 or later · Notarized by Apple · Not on the Mac App Store

Icon: DockStacks Logo



OVERVIEW

One password.
Every app it guards.

Drag an app into LockTight and it's protected from that moment on. No config files, no terminal commands — just your master password standing between anyone and what you've locked.


BUILT FOR MACOS

Native from the
ground up.

LockTight follows your system appearance and lives where you already look — the menu bar and the Dock — so locking and unlocking never means opening the app.
Backup and auto-save your setup.




EVERY CONTROL, WHERE YOU'D EXPECT IT

Six ways to lock.
One settings pane.

Turn on whichever combination feels right, built and laid out like System Settings because it's made the same way.

Icon: DockStacks Logo

SELF PROTECTION

Turn on protection.
It stays on.

A signed background helper stops LockTight itself from being deleted while protection is active — not a flag you could clear, an actual daemon watching the bundle. Turning it off takes your master password, and it re-locks itself if the app hasn't genuinely gone.

Icon: DockStacks Logo

PRIVACY

Nothing about your password leaves your Mac.

No account to create, no cloud to trust. Verification happens on-device, every time.

Read the privacy policy >


PRICING

Ready to lock things down.

No subscription. One-off purchase, yours across every Mac on your Apple Account.

LOCKTIGHT FOR MACOS

$4.99


One-time purchase



  • Unlimited stacks

  • Password-protected stacks

  • Transparency and hue controls

  • Global keyboard shortcuts

Download on the App Store

Requires macOS 13 or later. Direct download, notarized by Apple — not available on the Mac App Store. Price shown in US dollars.



COMMON QUESTIONS

Good to know.

FAQ
DockStacks is a macOS app that organizes apps, folders, files, and links into quick-access stacks, helping you keep your workflow more focused
The Dock gives you one place for your favorite apps. DockStacks lets you create multiple, focused stacks containing apps, files, folders, and links
No. DockStacks works alongside the Dock, giving you another way to organize and access the apps, files, folders, and links you use most
Yes. Create as many stacks as you like for work, projects, creative tasks, gaming, or anything else. Switch between them whenever you need to change focus
Yes. Drag apps, folders, files, images, and web links directly into any stack, then arrange them in whatever order works for you
Yes. Customize the appearance of DockStacks, including panel transparency and background color, so it fits naturally with your Mac
Yes. Individual stacks can be password-protected, with passwords securely stored in the macOS Keychain. Protected stacks can also automatically lock when your Mac locks or after inactivity
(function(){ const settings={ instanceId:"carrd-faq-519bljrxy3d", questionColor:"#ffffff", answerColor:"#ffffff", style:"chevron-down", position:"right", textAlign:"left", size:14, weight:2, border:"0.15", questionSize:"1rem", answerSize:"1rem", bgEnabled:false, bgColor:"#1e293b", bgWidth:"480px", bgRadius:0, bgPadding:32, scrollReveal:false, scrollReplay:"once", scrollHoldTime:1500 }; function getPath(style,open){ if(style==="chevron-right"){ return open ? "M3 5 L8 10 L13 5" : "M5 3 L11 8 L5 13"; } if(style==="plus"){ return open ? "M3 8 L13 8" : "M8 3 L8 13 M3 8 L13 8"; } if(style==="tick"){ return open ? "M3 8.5 L6.5 12 L13 4.5" : "M4 8 L12 8"; } if(style==="dot"){ return "M8 8 L8 8"; } return open ? "M3 11 L8 6 L13 11" : "M3 5 L8 10 L13 5"; } function updateIcon(item,open){ const path=item.querySelector( ".carrd-faq-icon path" ); if(!path){ return; } path.setAttribute( "d", getPath(settings.style,open) ); } function setImportant(el,prop,value){ el.style.setProperty( prop, value, "important" ); } function clearImportant(el,prop){ el.style.removeProperty(prop); } function clearRevealState(answer){ if(answer._revealOpenTimer){ clearTimeout( answer._revealOpenTimer ); answer._revealOpenTimer=null; } if(answer._revealCloseTimer){ clearTimeout( answer._revealCloseTimer ); answer._revealCloseTimer=null; } clearImportant( answer, "display" ); clearImportant( answer, "overflow" ); clearImportant( answer, "max-height" ); clearImportant( answer, "transition" ); } function openAnswer(answer,duration){ setImportant( answer, "display", "block" ); setImportant( answer, "overflow", "hidden" ); setImportant( answer, "max-height", "0px" ); setImportant( answer, "transition", "max-height "+duration+"ms ease" ); void answer.offsetHeight; setImportant( answer, "max-height", answer.scrollHeight+"px" ); } function closeAnswer(answer,duration,callback){ setImportant( answer, "max-height", answer.scrollHeight+"px" ); void answer.offsetHeight; setImportant( answer, "max-height", "0px" ); setTimeout(function(){ clearRevealState(answer); if(callback){ callback(); } },duration); } function setupScrollReveal(root){ if(!settings.scrollReveal){ return; } const prefersReducedMotion= window.matchMedia && window.matchMedia( "(prefers-reduced-motion: reduce)" ).matches; if(prefersReducedMotion){ return; } if(!("IntersectionObserver" in window)){ return; } const staggerStep=130; const openDuration=350; const holdDuration=settings.scrollHoldTime; let running=false; let hasRun=false; function runReveal(){ if(running){ return; } const items= Array.prototype.slice.call( root.querySelectorAll( ".carrd-faq-item" ) ) .filter(function(item){ return !item.classList.contains( "is-open" ); }); if(items.length===0){ return; } running=true; let remaining=items.length; function itemDone(){ remaining--; if(remaining<=0){ running=false; } } items.forEach(function(item,i){ const answer= item.querySelector( ".carrd-faq-answer" ); if(!answer){ itemDone(); return; } answer._revealOpenTimer= setTimeout(function(){ if(item.classList.contains( "is-open" )){ itemDone(); return; } openAnswer( answer, openDuration ); answer._revealCloseTimer= setTimeout(function(){ if(item.classList.contains( "is-open" )){ itemDone(); return; } closeAnswer( answer, openDuration, itemDone ); },openDuration+holdDuration); },i*staggerStep); }); } const observer= new IntersectionObserver( function(entries){ entries.forEach(function(entry){ if(!entry.isIntersecting){ return; } if(settings.scrollReplay==="once"){ if(!hasRun){ hasRun=true; runReveal(); observer.unobserve(root); } }else{ runReveal(); } }); }, { threshold:0 } ); observer.observe(root); } function init(){ const root= document.getElementById( settings.instanceId ); if(!root){ return; } root .querySelectorAll( ".carrd-faq-question" ) .forEach(function(button){ button.addEventListener( "click", function(){ const item= button.closest( ".carrd-faq-item" ); if(!item){ return; } const answer= item.querySelector( ".carrd-faq-answer" ); if(answer){ clearRevealState(answer); } const isOpen= item.classList.toggle( "is-open" ); button.setAttribute( "aria-expanded", isOpen ? "true" : "false" ); updateIcon( item, isOpen ); } ); }); setupScrollReveal(root); } if(document.readyState==="loading"){ document.addEventListener( "DOMContentLoaded", init ); }else{ init(); } })();

SUPPORT

Ask Anything.

Bug reports, feature ideas, or a question before you buy - it all comes straight to us. We aim to respond in 48 hours.


LockTight is developed by Michael Edwards
All rights reserved © 2026

Download on the App Store


Icon: DockStacks Logo

LockTight Privacy Policy.

Effective date: 5 September 2026LockTight is designed to work entirely on your Mac.

This policy explains, in plain terms, what that means in practice — what LockTight collects (almost nothing), what it stores locally, what permissions it needs and why, and how to reach us with questions. It's written to meet the disclosure expectations of Apple's App Store Connect / App Review Guidelines (5.1.1 Data Collection and Storage, and 5.1.4 Kids), even though LockTight is currently distributed directly rather than through the Mac App Store.

  1. Summary
    Data collected by the app and sent to us: none. Data stored, but only locally on your Mac: your password verifier and hint, your protected-apps list, your lock-trigger settings, and a device-only Keychain item used for Touch ID. Data you may choose to share with us directly: your name, email, and message, only if you use the Support form — which sends an email from your own Mail app, not from within LockTight. No analytics, advertising, or third-party tracking SDKs are included in the app.

  2. Information we collect
    LockTight does not collect personal data through the app itself, does not create user accounts, and does not use analytics, tracking, or third-party telemetry. The only information that reaches us is what you choose to send yourself, such as a support email.

  3. Data stored on your device
    A salted, one-way verifier derived from your master password (never the password itself), your optional password hint, your protected-apps list and lock-trigger settings, whether self-protection is currently on, and a device-only Keychain item for Touch ID. None of it is synced to iCloud or made available to anyone but you.

  4. Permissions LockTight uses, and why
    LockTight is not sandboxed because blocking launches of protected apps requires monitoring other running applications, which the App Sandbox does not permit — this is why it's distributed directly rather than through the sandboxed Mac App Store environment. A privileged helper daemon, installed with your permission, enforces uninstall protection by watching the LockTight.app bundle; it does not read your files or personal data. Touch ID/Keychain access is used only to gate unlocking, and always requires your master password to enable.

  5. Data sharing and third parties
    We do not sell, rent, or share any data, because we don't have any to share. LockTight contains no third-party analytics, advertising, or tracking SDKs of any kind.

  6. Data export and backup
    Exported settings include your general settings, lock triggers, and protected-apps list. Your master password is never included in an export — importing a file always requires unlocking with your current password first.

  7. Data retention and deletion
    Because nothing is collected by us, there is nothing on our side to retain or delete. On your Mac, use Reset (requires your master password) to clear stored settings, or remove the app to delete its local preferences and Keychain item.

  8. Children's privacy
    LockTight is a general-audience utility and is not directed at children. In line with COPPA and Apple's children's-privacy guidelines, we do not knowingly collect personal information from children under 13, and LockTight collects no personal data automatically from users of any age. If a parent or guardian believes a child has provided us information through the Support form, contact us below and we will promptly delete it.

  9. Your rights
    Because LockTight keeps your data on your own device, you're already in control of it: view, export, or delete it at any time from within the app. If you've contacted support directly, you may ask us to access, correct, or delete that correspondence at any time.

  10. Security
    Your master password is verified using PBKDF2-SHA256 with a per-user salt and is never stored in plaintext. An additional device-only Keychain-backed pepper protects against offline attacks on an exported settings file. Resetting LockTight, enabling Touch ID, or turning off self-protection always requires re-entering your master password.

  11. Changes to this policy
    This policy may be updated in future versions, with material changes reflected by a new effective date above and, where appropriate, noted in release notes.

  12. Contact
    > Developer: Michael Edwards
    > Email: [email protected] [We aim to respond within 48 hours]
    > Website: