(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(); } })();
Icon: DockStacks Logo

DockStacks

Your Dock holds apps.
DockStacks holds the whole job.

Download on the App Store
5 Star App Store Rating

US$4.99 One time purchase - No subscription



Stacks

One stack per job.
Switch the whole set at once.

Apps, folders, files and links, grouped by what you're actually doing - then a keystroke away when you need them.

Multiple Stacks. Drag & Drop. Auto-Hide. Always on Top. Adjust Appearance. Global Shortcuts

Built for macOS

Native from the ground up.

Built natively for macOS. DockStacks follows your system appearance and integrates seamlessly with the Dock’s right-click menu, making it easy to switch between stacks.


Image: DockStacks settings menu displayed on a laptop

Every control
where you'd expect it.

Transparency, background hue, dock or menu bar, open at login, and a global shortcut you choose yourself. Settings look and behave like System Settings, because they're built the same way.


Privacy

Nothing leaves your Mac.

No account to create, no cloud to trust. Your data stays on your Mac.

Lock a stack.
It stays locked.

Password-protect individual stacks, stored in the macOS Keychain. They re-lock when your screen locks, or after a set idle time.

Read the privacy policy >

Image: Create private stacks

Pricing

Ready to declutter
your dock.

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

One-time purchase

US$4.99


  • Unlimited stacks

  • Password-protected stacks

  • Transparency and hue controls

  • Global keyboard shortcuts

Download on the App Store

Requires macOS 13 or later. Use DockStacks on every Mac signed in to your Apple Account. Price shown in American 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.


DockStacks is developed by Michael Edwards
All rights reserved © 2026

Image: Your stacks set up your way

Check out our other MacOS apps:

Icon: AppRegister. Know what's installed on your Mac.
Icon: Locktight. Lock your apps. Keep your privacy.


Icon: DockStacks Logo

DockStacks Privacy Policy.

Effective date: 28 August 2026
Minor corrections: The word 'shelf' replaced with the word 'stack'
DockStacks respects your privacy. This app is designed to work locally on your Mac.

1. Information We Collect

  • DockStacks does not collect personal data through the app itself

  • DockStacks does not create user accounts

  • DockStacks does not use analytics, tracking, advertising SDKs, or third-party telemetry


2. Data Stored on Your Device

  • Stack names, app shortcuts, layout, appearance settings, and app preferences are stored locally on your device

  • Stack passwords are stored securely in the macOS Keychain

  • Passwords are not stored in plain text by the app


3. Data Sharing

  • DockStacks does not sell, rent, or share your personal data

  • DockStacks does not transmit your stack data or passwords to external servers

  • Information submitted through the Support page is used to respond to your query and is not sold or shared for advertising purposes


4. Internet and Network Use

  • DockStacks is designed to function without requiring an account or cloud backend for core functionality

  • If future features require network access, this policy will be updated before release


5. Permissions

  • Accessibility permission may be requested so DockStacks can align its panel behavior with the macOS Dock experience

  • You can deny or revoke permissions at any time in macOS System Settings


6. Data Export and Backup

  • If you choose to export settings, files are created only where you select

  • Exported settings do not include stack passwords, these are securely stored in Keychain


7. Children’s Privacy

  • DockStacks is not directed to children under 13 and does not knowingly collect personal information from children

  • DockStacks is a local macOS app designed for general audiences and no data is collected or stored


8. Changes to This Policy

  • We may update this Privacy Policy from time to time

  • The updated version will include a new effective date


9. Contact