Adamancia Vault
One vault for every escape route: websites, feeds, desktop apps, Safari, schedules, timers, and strict freezes.
Download
Free. For real.
Everything here is free to use - and I want to be specific about exactly what that means.
- Completely free. No one-time purchase, no freemium tiers, no subscriptions - not now, not later.
- No advertisements. Nothing is injected into your browsing: no banners, no sponsor slots, no "promoted" anything.
- Never shared, never monetized. We will never share your information with third parties or make money from it. You can optionally contribute a public channel link - never titles or viewing history - to improve the shared creator map.
- No hidden monetization. No trackers, no affiliate funnels, no data brokering quietly running in the background.
- Open source. Every line is public, so you can verify all of this yourself instead of taking my word for it.
- Donations only - and optional. The single way I'd ever earn from this is a spontaneous donation. It will always work fully without one.
One blocker for apps, websites, feeds, and rules.
- Blocks distracting desktop apps on Mac and Windows.
- Blocks websites in Chrome, Edge, Firefox, Brave, and Safari.
- Lets one group control apps and websites together.
- Adds schedules, timers, budgets, snooze, and freeze.
- Can quiet the parts of familiar sites that pull you into a loop.
- Uses shared labels and personal plans so your boundaries fit real life.
Apps and websites can share one boundary.
- Think of a group as one promise to yourself. Put the distracting apps and sites together, then switch that promise on or off as one.
- If Discord distracts you on both your desktop and in a tab, the same focus choice can cover both.
- That choice can also share one schedule, one timer, or one daily allowance.
The same intent can travel across sites.
- A shared label names a kind of pull, such as short videos, politics, gambling, shopping, games, comments, or recommendations.
- That same label can travel across YouTube, TikTok, Reddit, Instagram, Twitch, X, and more.
- Instead of rebuilding the same choice for every site, you name the pattern you want less of.
YouTube
Set aside Home, comments, and political recommendations while keeping search, playlists, and course channels within reach.
Distractions are bigger than seven icons.
- The app list covers the things on your computer that can steal an evening: games, chat, video, and more.
- The site list covers the online loops that keep asking for another minute: feeds, shopping, gambling, sports, news, and short videos.
- They live together so your focus plan does not have to split your life into separate systems.
Apps you may want to pause
Sites you may want to pause
Describe the boundary only you need.
- Presets are useful, but real distractions are personal. This is for the cases a normal checkbox cannot capture.
- You can keep one useful playlist while setting aside YouTube Home, comments, and political recommendations.
- You can also let a site and an app share the same daily allowance.
Twenty focus plans. One plain-English ask.
- The upper rail shows what someone might ask for in ordinary language.
- The lower rail shows the focus choices Adamancia can prepare from that request.
- Some examples shape sites and feeds; others keep distracting desktop apps out of the way.
Block YouTube Home, Shorts, comments, and political rage videos. Keep search, course playlists, and exact video links.
On Reddit, allow my research subreddits and saved technical threads, but block r/all, popular, comments, and infinite scroll after two minutes.
After 9 PM, block TikTok For You, Instagram Reels, and Explore. Allow exact profile links and direct messages I opened intentionally.
Let Instagram DMs and three design-reference profiles work for my client project, but hide Reels, Explore, notifications, and suggested posts.
On Twitter/X, allow my market watch list for 20 minutes in the morning. Block For You, Trends, quote-tweet fights, and politics keywords.
Let Discord web direct messages from my study group work, but hide servers, invites, unread pings, and channel lists until the focus timer ends.
Allow Twitch only for scheduled tournament channels from my calendar. Block front page, chat, clips, autoplay, and raids.
Let me read articles I opened from my reading list. Block news homepages, live updates, opinion sidebars, and related-story trails after 10 minutes.
On LinkedIn, allow job search, recruiters, and saved companies. Hide feed posts, notifications, connection suggestions, and creator carousels.
In Gmail, show only starred, school, and urgent family labels during work. Hide Promotions, Social, newsletters, and unread counters.
On Amazon, allow exact item pages from my shopping list and order history. Block deals, recommendations, cart add-ons, and "customers also bought."
On Steam web, let me open support pages and a specific mod guide. Block store discovery, community discussions, reviews, and sale banners.
For online classes, allow Coursera lessons, quiz pages, and linked YouTube lectures. Block recommendations, comments, certificates ads, and course shopping.
In Google Search, if I search my blocked topics, remove News, Videos, Discover panels, and social results, but keep docs and official references.
On Medium and Substack, keep the articles I saved in my notes while hiding home feeds, trending essays, author recommendations, and subscribe popups.
During pomodoro breaks, allow exactly one saved video or article, then re-block entertainment surfaces automatically when the break ends.
If I open Discord or Slack desktop during writing hours, allow it only when Calendar says meeting prep or when a teammate is on my urgent list.
Allow Xcode and VS Code only with my active project folders. If a game, video, or social app is frontmost too, lock the distracting app.
If I launch Steam, Epic, or Minecraft twice in five minutes before 6 PM, force a pause screen and count it against the shared entertainment budget.
When class starts, quit distracting Mac apps, keep Zoom and Notes, and allow Safari only on the class portal and linked assignments.
rule("yt.course.safe", ({ page, watch, user, clock }) => {
const rage = page.text.score(["war update", "destroyed", "humiliated"]);
const allowed = page.search || user.playlists.hasTag("course") || watch.exactLink;
blockIf((page.home || page.shorts || page.comments || rage > 0.62) && !allowed);
dim(page.sidebar.recommendations, { reason: "not part of class plan" });
});
rule("reddit.research.window", ({ reddit, timer }) => {
const safeSub = reddit.subreddit.in(["r/programming", "r/swift", "r/askacademia"]);
const savedThread = reddit.thread.saved || reddit.thread.fromNotes;
allowIf(safeSub || savedThread || reddit.search);
blockIf(reddit.all || reddit.popular || reddit.comments.depth > 3 || timer.onSite > 2.minutes);
});
rule("short.form.night.wall", ({ site, nav, time }) => {
const night = time.after("21:00") || time.before("06:30");
const shortFeed = site.tiktok.foryou || site.instagram.reels || site.instagram.explore;
const intentional = nav.openedDirectly && (site.profile || site.dm || site.exactPost);
blockIf(night && shortFeed && !intentional);
});
rule("instagram.client.references", ({ ig, project }) => {
const references = ig.profile.in(project.list("design-reference-profiles"));
allowIf(ig.dm || references);
blockIf(ig.reels || ig.explore || ig.notifications || ig.suggestedPosts);
hide(ig.page.query("[aria-label='Suggested for you']"));
});
rule("x.market.watch.only", ({ x, time, text }) => {
const marketWindow = time.between("08:45", "09:15");
const watch = x.list.name === "Market Watch" || x.account.in(vault.accounts.market);
const politics = text.matchesAny(vault.keywords.politics);
allowIf(marketWindow && watch);
blockIf(x.forYou || x.trends || x.quoteTweetThread || politics);
});
rule("discord.study.dms", ({ discord, focus }) => {
const studyDm = discord.dm.participants.overlap(vault.people.studyGroup);
const noisy = discord.server || discord.invite || discord.unreadPings || discord.channelList;
allowIf(studyDm && focus.active);
blockIf(noisy && focus.timer.remaining > 0);
replace(discord.sidebar, "DMs only until focus ends");
});
rule("twitch.calendar.tournament", ({ twitch, calendar }) => {
const event = calendar.current({ tag: "tournament" });
const allowedChannel = event && twitch.channel.in(event.channels);
allowIf(allowedChannel);
blockIf(twitch.home || twitch.chat || twitch.clips || twitch.autoplay || twitch.raids);
mute(twitch.player, { unless: allowedChannel });
});
rule("news.reading.list.only", ({ news, nav, timer }) => {
const fromReadingList = nav.referrer.is("reading-list") || news.article.saved;
allowIf(fromReadingList && news.article);
blockIf(news.home || news.liveUpdates || news.opinionRail || news.relatedStories);
blockIf(timer.site("news") > 10.minutes && !fromReadingList);
});
rule("linkedin.job.search", ({ linkedin, user }) => {
const useful = linkedin.jobs || linkedin.messages.recruiter || linkedin.company.in(user.savedCompanies);
allowIf(useful);
blockIf(linkedin.feed || linkedin.notifications || linkedin.peopleYouMayKnow);
hide(linkedin.page.queryAll(".creator-carousel,.promoted-post"));
});
rule("gmail.work.labels", ({ gmail, schedule }) => {
const work = schedule.mode === "deep-work";
const visible = gmail.label.in(["Starred", "School", "Family/Urgent"]);
allowIf(!work || visible);
hide(gmail.tabs.promotions, gmail.tabs.social, gmail.newsletters, gmail.unreadBadges);
blockIf(work && gmail.compose.to.isEmpty() && !visible);
});
rule("amazon.no.impulse", ({ amazon, list, budget }) => {
const exactNeed = amazon.item.in(list.shopping) || amazon.orderHistory || amazon.search.exactSku;
allowIf(exactNeed && budget.monthlyShopping.remaining > amazon.item.price);
blockIf(amazon.deals || amazon.recommendations || amazon.addOns || amazon.alsoBought);
confirm(amazon.cart.add, { delay: 90.seconds, unless: exactNeed });
});
rule("steam.support.and.mod.guide", ({ steam, notes }) => {
const guide = steam.url.equals(notes.link("modding-guide"));
allowIf(steam.support || guide);
blockIf(steam.store || steam.discoveryQueue || steam.community || steam.reviews || steam.saleBanner);
redirect(steam.home, notes.link("current-project"));
});
rule("class.course.guard", ({ web, course, youtube }) => {
const lesson = web.host.is("coursera.org") && (course.lesson || course.quiz);
const lecture = youtube.watch && youtube.id.in(course.linkedVideos);
allowIf(lesson || lecture);
blockIf(youtube.recommendations || youtube.comments || course.catalog || course.certificateAd);
});
rule("search.blocked.topic.filter", ({ google, query }) => {
const risky = query.matchesAny(vault.blockedTopics);
const official = google.result.host.matches([".edu", "docs.*", "developer.*"]);
hide(google.news, google.videos, google.discover, google.socialResults);
blockIf(risky && !official && google.result.rank < 8);
});
rule("article.from.notes.only", ({ article, nav }) => {
const fromNotes = nav.source.in(["Obsidian", "Notion", "ReadingList"]);
allowIf(fromNotes && article.current);
blockIf(article.homeFeed || article.trending || article.authorRecirculation);
hide(article.subscribePopup, article.relatedRail);
});
rule("break.one.saved.thing", ({ breakTimer, saved, surface }) => {
const chosen = saved.current && (surface.video || surface.article);
allowIf(breakTimer.active && chosen && saved.opens.count === 1);
blockIf(!breakTimer.active || saved.opens.count > 1);
onEnd(breakTimer, () => close(surface.entertainment));
});
rule("app.chat.urgent.only", ({ app, calendar, people }) => {
const chat = app.bundle.in(["com.tinyspeck.slackmacgap", "com.hnc.Discord"]);
const urgent = calendar.current.hasTag("meeting-prep") || people.sender.in(vault.people.urgent);
allowIf(chat && urgent);
quitIf(chat && !urgent && schedule.writingHours);
});
rule("app.project.context", ({ app, workspace }) => {
const editor = app.bundle.in(["com.apple.dt.Xcode", "com.microsoft.VSCode"]);
const activeProject = workspace.folder.inside(vault.paths.activeProjects);
allowIf(editor && activeProject);
blockIf(app.category.in(["game", "video", "social"]) && editor.frontmost);
});
rule("app.launch.repeat.friction", ({ app, attempts, budget, time }) => {
const game = app.name.in(["Steam", "Epic Games Launcher", "Minecraft"]);
const repeat = attempts.of(app).within(5.minutes) >= 2;
showPause(game && repeat && time.before("18:00"), "This spends entertainment budget.");
charge(budget.sharedEntertainment, repeat ? 10.minutes : 0.minutes);
});
rule("app.class.start.cleanroom", ({ app, calendar, safari }) => {
const inClass = calendar.current.hasTag("class");
quitIf(inClass && app.category.in(["game", "social", "video"]));
allowIf(inClass && app.name.in(["Zoom", "Notes"]));
allowIf(inClass && safari.url.in(calendar.current.assignmentLinks));
});
Blocking should follow the shape of your day.
- A schedule says when a rule is active, such as weekdays from 08:00 to 18:00.
- The rule can still allow exact course links, assignment pages, or required class tools.
- Weekend rules can protect only the morning, so the rest of the day does not feel locked down.
January 2026
Keep the part you came for.
Make the parts that pull you into a loop step aside, while keeping the moments you opened on purpose close at hand.
Normal Freeze
freeze.normal({ confirmBeforeUnfreeze: 100.seconds });
Lock a decision before impulse gets a vote.
- Freeze is for a rule you already decided should stay on, even if you feel tempted to turn it off later.
- Normal Freeze can be undone, but only after a deliberate 100-second confirmation.
- Strict Freeze combines a timer with Normal Freeze, so it is both time-protected and confirmation-protected.
- Parental Freeze is set by a guardian and requires the guardian password to remove.
- When the cursor clicks a frozen app or site, Adamancia denies the launch instead of opening a loophole.
A waiting room, not an escape hatch.
- Snooze is for softer blocks, where you may want access later but should not open the target immediately.
- The blocked item waits in a short queue, so the user has time to notice the impulse instead of reacting instantly.
- Snooze does not delete the rule, change the schedule, or make the target permanently allowed.
- If Strict Freeze or Parental Freeze is active, snooze is disabled because those modes are meant to have no quick exit.
Delay, not escape
Snooze creates a timed waiting room. If strict or parental freeze is active, snooze is disabled instead of becoming a shortcut around the block.
if (!freeze.strict && !freeze.parental) {
snooze(target, 10.minutes);
} else {
deny(target, "Protected Freeze is active");
}
Let your sites and apps share one boundary
- One part of Adamancia looks after sites; another looks after the distracting apps on your computer.
- Together, they can follow the same schedule, timer, or daily allowance.
- A YouTube tab, Discord, Safari, and a desktop app can all count toward the same choice you made for yourself.