[{"data":1,"prerenderedAt":711},["ShallowReactive",2],{"article-alternates":3,"article-\u002Fen\u002Flifestyle\u002Ftool-stack-2026-roibase-daily-operations":13},{"i18nKey":4,"paths":5},"lifestyle-004-2026-05",{"de":6,"en":7,"es":8,"fr":9,"it":10,"ru":11,"tr":12},"\u002Fde\u002Flifestyle\u002Ftool-stack-2026-operationelle-wirbelsaeule","\u002Fen\u002Flifestyle\u002Ftool-stack-2026-roibase-daily-operations","\u002Fes\u002Flifestyle\u002Ftechstack-2026-operaciones-diarias","\u002Ffr\u002Flifestyle\u002Ftechstack-partnership","\u002Fit\u002Flifestyle\u002Ftech-stack-2026-operazioni-team","\u002Fru\u002Flifestyle\u002Ftool-stack-2026-operational-backbone","\u002Ftr\u002Flifestyle\u002Ftool-stack-2026-roibasein-operasyonel-omurgasi",{"_path":7,"_dir":14,"_draft":15,"_partial":15,"_locale":16,"title":17,"description":18,"publishedAt":19,"modifiedAt":19,"category":14,"i18nKey":4,"tags":20,"readingTime":26,"author":27,"body":28,"_type":705,"_id":706,"_source":707,"_file":708,"_stem":709,"_extension":710},"lifestyle",false,"","Tool Stack 2026: Roibase Team's Daily Operations","Linear, Notion, Slack, Figma, Granola — integration patterns and measurable productivity discipline in a 12-person growth team.","2026-05-30",[21,22,23,24,25],"tool-stack","async-workflow","linear","notion","team-operations",6,"Roibase",{"type":29,"children":30,"toc":690},"root",[31,39,46,66,74,109,121,128,153,159,171,180,185,193,237,242,248,268,301,309,339,344,350,355,360,366,394,412,417,423,428,568,573,579,584,592,610,618,636,644,674,679,685],{"type":32,"tag":33,"props":34,"children":35},"element","p",{},[36],{"type":37,"value":38},"text","Tool stack conversations usually devolve into \"here's the catalog of apps we use.\" But the real issue isn't the tools in isolation — it's integration patterns, context-switching cost, async-first discipline. Roibase's 12-person team has been remote-first since 2018. By 2026, our daily operations are shaped by 5 tools: Linear, Notion, Slack, Figma, Granola. Rather than listing them off, we're opening up the integration layer — where data lives, what triggers workflows, which notification layers stay muted.",{"type":32,"tag":40,"props":41,"children":43},"h2",{"id":42},"linear-not-sprints-flow-metrics",[44],{"type":37,"value":45},"Linear: Not Sprints, Flow Metrics",{"type":32,"tag":33,"props":47,"children":48},{},[49,51,57,59,64],{"type":37,"value":50},"Linear is marketed as project management, but at Roibase it functions as a \"work-in-progress visibility layer.\" We don't do sprint planning — we skip cycle tracking and milestones. Instead, every issue gets ",{"type":32,"tag":52,"props":53,"children":54},"strong",{},[55],{"type":37,"value":56},"priority (P0\u002FP1\u002FP2)",{"type":37,"value":58}," and ",{"type":32,"tag":52,"props":60,"children":61},{},[62],{"type":37,"value":63},"estimate (1-3-5-8)",{"type":37,"value":65},". Priority isn't personal preference; it's system-determined: P0 = blocks production deployment today, P1 = must close within the sprint, P2 = backlog.",{"type":32,"tag":33,"props":67,"children":68},{},[69],{"type":32,"tag":52,"props":70,"children":71},{},[72],{"type":37,"value":73},"Flow metrics:",{"type":32,"tag":75,"props":76,"children":77},"ul",{},[78,89,99],{"type":32,"tag":79,"props":80,"children":81},"li",{},[82,87],{"type":32,"tag":52,"props":83,"children":84},{},[85],{"type":37,"value":86},"Cycle time:",{"type":37,"value":88}," average 2.3 days from issue creation to close (Q4 2025 data). Any issue exceeding 5 days auto-escalates to P0.",{"type":32,"tag":79,"props":90,"children":91},{},[92,97],{"type":32,"tag":52,"props":93,"children":94},{},[95],{"type":37,"value":96},"Work-in-progress limit:",{"type":37,"value":98}," maximum 3 open issues per person. To pick up a 4th, you close one or hand it off.",{"type":32,"tag":79,"props":100,"children":101},{},[102,107],{"type":32,"tag":52,"props":103,"children":104},{},[105],{"type":37,"value":106},"Merge-to-close time:",{"type":37,"value":108}," span between PR merge and Linear issue closure — target \u003C30 minutes (CI\u002FCD + QA automation).",{"type":32,"tag":33,"props":110,"children":111},{},[112,114,119],{"type":37,"value":113},"Linear's Slack integration is disabled. Instead of notification bombardment, we run a ",{"type":32,"tag":52,"props":115,"children":116},{},[117],{"type":37,"value":118},"digest system",{"type":37,"value":120},": every morning at 09:00, Slack gets a daily summary (P0 count, avg cycle time, WIP distribution). No one @mentions in Linear — everyone reads the morning digest anyway.",{"type":32,"tag":122,"props":123,"children":125},"h3",{"id":124},"linear-notion-synchronization",[126],{"type":37,"value":127},"Linear → Notion Synchronization",{"type":32,"tag":33,"props":129,"children":130},{},[131,133,140,142,151],{"type":37,"value":132},"Completed Linear issues are archived to Notion weekly (Zapier workflow). Notion has a \"Retrospective Database\" — each closed issue is tagged to which service it belonged. For example, issues under the ",{"type":32,"tag":134,"props":135,"children":137},"code",{"className":136},[],[138],{"type":37,"value":139},"branding",{"type":37,"value":141}," project are reported under ",{"type":32,"tag":143,"props":144,"children":148},"a",{"href":145,"rel":146},"https:\u002F\u002Fwww.roibase.com.tr\u002Fen\u002Fbranding",[147],"nofollow",[149],{"type":37,"value":150},"Markalaşma & Brand Identity",{"type":37,"value":152}," service. This data drives capacity planning every 3 months: how much engineering time is spent per service?",{"type":32,"tag":40,"props":154,"children":156},{"id":155},"notion-source-of-truth-not-a-wiki",[157],{"type":37,"value":158},"Notion: Source of Truth, Not a Wiki",{"type":32,"tag":33,"props":160,"children":161},{},[162,164,169],{"type":37,"value":163},"We don't use Notion as a wiki — it's our \"decision log.\" Every strategic choice (e.g., \"server-side or client-side tracking for Campaign X?\") is written in Notion as an ",{"type":32,"tag":52,"props":165,"children":166},{},[167],{"type":37,"value":168},"RFC (Request for Comments)",{"type":37,"value":170},". RFC template:",{"type":32,"tag":172,"props":173,"children":175},"pre",{"code":174},"## Decision\n[One sentence — what we're doing]\n\n## Context\n[Why it matters now]\n\n## Alternatives\n[At least 2 options + tradeoff table]\n\n## Measurement\n[How do we know in 4 weeks if this was right]\n\n## Owner\n[Who's accountable]\n",[176],{"type":32,"tag":134,"props":177,"children":178},{"__ignoreMap":16},[179],{"type":37,"value":174},{"type":32,"tag":33,"props":181,"children":182},{},[183],{"type":37,"value":184},"RFCs open with a 48-hour async comment window. No meeting calls — everyone reads on their own time, leaves feedback. After 48 hours, the decision owner writes the final call, and the action moves to Linear.",{"type":32,"tag":33,"props":186,"children":187},{},[188],{"type":32,"tag":52,"props":189,"children":190},{},[191],{"type":37,"value":192},"Data layers inside Notion:",{"type":32,"tag":194,"props":195,"children":196},"ol",{},[197,207,217,227],{"type":32,"tag":79,"props":198,"children":199},{},[200,205],{"type":32,"tag":52,"props":201,"children":202},{},[203],{"type":37,"value":204},"RFC Database",{"type":37,"value":206}," — all decisions",{"type":32,"tag":79,"props":208,"children":209},{},[210,215],{"type":32,"tag":52,"props":211,"children":212},{},[213],{"type":37,"value":214},"Retrospective Database",{"type":37,"value":216}," — completed work from Linear",{"type":32,"tag":79,"props":218,"children":219},{},[220,225],{"type":32,"tag":52,"props":221,"children":222},{},[223],{"type":37,"value":224},"Client Playbook",{"type":37,"value":226}," — per-client operational notes (dashboard location, API key location)",{"type":32,"tag":79,"props":228,"children":229},{},[230,235],{"type":32,"tag":52,"props":231,"children":232},{},[233],{"type":37,"value":234},"Brand Assets",{"type":37,"value":236}," — Figma links, tone-of-voice docs",{"type":32,"tag":33,"props":238,"children":239},{},[240],{"type":37,"value":241},"Notion search gets complaints, but we don't search — every database is filterable and tagged. Search need usually means \"data went in the wrong place.\"",{"type":32,"tag":40,"props":243,"children":245},{"id":244},"slack-async-first-real-time-second",[246],{"type":37,"value":247},"Slack: Async-First, Real-Time-Second",{"type":32,"tag":33,"props":249,"children":250},{},[251,253,259,260,266],{"type":37,"value":252},"Slack notifications are disabled across the team. Only ",{"type":32,"tag":134,"props":254,"children":256},{"className":255},[],[257],{"type":37,"value":258},"@channel",{"type":37,"value":58},{"type":32,"tag":134,"props":261,"children":263},{"className":262},[],[264],{"type":37,"value":265},"@here",{"type":37,"value":267}," are enabled — with strict rules: nothing but P0 incidents. Messaging splits across 3 channels:",{"type":32,"tag":194,"props":269,"children":270},{},[271,281,291],{"type":32,"tag":79,"props":272,"children":273},{},[274,279],{"type":32,"tag":52,"props":275,"children":276},{},[277],{"type":37,"value":278},"#daily-digest:",{"type":37,"value":280}," Linear\u002FNotion summaries, CI\u002FCD deploy logs",{"type":32,"tag":79,"props":282,"children":283},{},[284,289],{"type":32,"tag":52,"props":285,"children":286},{},[287],{"type":37,"value":288},"#async-questions:",{"type":37,"value":290}," Questions where immediate reply isn't expected (24-hour SLA)",{"type":32,"tag":79,"props":292,"children":293},{},[294,299],{"type":32,"tag":52,"props":295,"children":296},{},[297],{"type":37,"value":298},"#sync-now:",{"type":37,"value":300}," Real-time coordination needed (production incident, live campaign optimization)",{"type":32,"tag":33,"props":302,"children":303},{},[304],{"type":32,"tag":52,"props":305,"children":306},{},[307],{"type":37,"value":308},"Response time expectations:",{"type":32,"tag":75,"props":310,"children":311},{},[312,323,334],{"type":32,"tag":79,"props":313,"children":314},{},[315,321],{"type":32,"tag":134,"props":316,"children":318},{"className":317},[],[319],{"type":37,"value":320},"#sync-now",{"type":37,"value":322}," → 15 minutes",{"type":32,"tag":79,"props":324,"children":325},{},[326,332],{"type":32,"tag":134,"props":327,"children":329},{"className":328},[],[330],{"type":37,"value":331},"#async-questions",{"type":37,"value":333}," → 24 hours",{"type":32,"tag":79,"props":335,"children":336},{},[337],{"type":37,"value":338},"DMs → 48 hours (no DM culture; we use channels)",{"type":32,"tag":33,"props":340,"children":341},{},[342],{"type":37,"value":343},"Threads are mandatory. Replying to the main channel is forbidden — every message opens a thread. This keeps parallel conversations from tangling.",{"type":32,"tag":122,"props":345,"children":347},{"id":346},"slack-granola-integration",[348],{"type":37,"value":349},"Slack → Granola Integration",{"type":32,"tag":33,"props":351,"children":352},{},[353],{"type":37,"value":354},"Granola is a meeting note tool — we use it only for client calls. No internal meetings (0–1 sync calls per week). After a client call, Granola AI posts the transcript to Slack; the team reads it async. Action items auto-convert to Linear issues (Zapier trigger).",{"type":32,"tag":33,"props":356,"children":357},{},[358],{"type":37,"value":359},"Granola's killer feature: it highlights numerical commitments from the transcript (\"A\u002FB test results in 2 weeks,\" \"CTR must jump 15%\"). These get automatic reminders — nothing slips.",{"type":32,"tag":40,"props":361,"children":363},{"id":362},"figma-design-handoff-not-design-system",[364],{"type":37,"value":365},"Figma: Design Handoff, Not Design System",{"type":32,"tag":33,"props":367,"children":368},{},[369,371,377,379,385,386,392],{"type":37,"value":370},"Figma isn't just design — it's the \"frontend spec\" layer. Every UI component is defined as a variant. Developers don't extract code from Figma (no \"copy CSS\") — but they read component behavior from it. For example, a button's ",{"type":32,"tag":134,"props":372,"children":374},{"className":373},[],[375],{"type":37,"value":376},"hover",{"type":37,"value":378},", ",{"type":32,"tag":134,"props":380,"children":382},{"className":381},[],[383],{"type":37,"value":384},"active",{"type":37,"value":378},{"type":32,"tag":134,"props":387,"children":389},{"className":388},[],[390],{"type":37,"value":391},"disabled",{"type":37,"value":393}," states exist as frames. Code implements the same state logic.",{"type":32,"tag":33,"props":395,"children":396},{},[397,402,404,410],{"type":32,"tag":52,"props":398,"children":399},{},[400],{"type":37,"value":401},"Figma → Linear connection:",{"type":37,"value":403},"\nEvery Figma file has a ",{"type":32,"tag":134,"props":405,"children":407},{"className":406},[],[408],{"type":37,"value":409},"Linear Issue",{"type":37,"value":411}," plugin. When design is approved, the designer opens a Linear issue and pastes the Figma link in the description. Developer picks it up; the design is already clear — no questions needed.",{"type":32,"tag":33,"props":413,"children":414},{},[415],{"type":37,"value":416},"Figma comments don't flow to Slack (no notification spam). Instead, a weekly \"Figma Digest\" converts open comments into Linear issues.",{"type":32,"tag":40,"props":418,"children":420},{"id":419},"integration-pattern-where-does-data-live",[421],{"type":37,"value":422},"Integration Pattern: Where Does Data Live?",{"type":32,"tag":33,"props":424,"children":425},{},[426],{"type":37,"value":427},"Tool stack conversations usually start with \"which tool do you use?\" The real question should be \"which data is canonical where?\" At Roibase:",{"type":32,"tag":429,"props":430,"children":431},"table",{},[432,456],{"type":32,"tag":433,"props":434,"children":435},"thead",{},[436],{"type":32,"tag":437,"props":438,"children":439},"tr",{},[440,446,451],{"type":32,"tag":441,"props":442,"children":443},"th",{},[444],{"type":37,"value":445},"Data type",{"type":32,"tag":441,"props":447,"children":448},{},[449],{"type":37,"value":450},"Source of truth",{"type":32,"tag":441,"props":452,"children":453},{},[454],{"type":37,"value":455},"Synced to",{"type":32,"tag":457,"props":458,"children":459},"tbody",{},[460,479,497,515,533,551],{"type":32,"tag":437,"props":461,"children":462},{},[463,469,474],{"type":32,"tag":464,"props":465,"children":466},"td",{},[467],{"type":37,"value":468},"Active work (WIP)",{"type":32,"tag":464,"props":470,"children":471},{},[472],{"type":37,"value":473},"Linear",{"type":32,"tag":464,"props":475,"children":476},{},[477],{"type":37,"value":478},"Slack daily digest",{"type":32,"tag":437,"props":480,"children":481},{},[482,487,492],{"type":32,"tag":464,"props":483,"children":484},{},[485],{"type":37,"value":486},"Completed work (retrospective)",{"type":32,"tag":464,"props":488,"children":489},{},[490],{"type":37,"value":491},"Notion",{"type":32,"tag":464,"props":493,"children":494},{},[495],{"type":37,"value":496},"Linear (archived)",{"type":32,"tag":437,"props":498,"children":499},{},[500,505,510],{"type":32,"tag":464,"props":501,"children":502},{},[503],{"type":37,"value":504},"Strategic decisions",{"type":32,"tag":464,"props":506,"children":507},{},[508],{"type":37,"value":509},"Notion (RFC)",{"type":32,"tag":464,"props":511,"children":512},{},[513],{"type":37,"value":514},"Linear (action items)",{"type":32,"tag":437,"props":516,"children":517},{},[518,523,528],{"type":32,"tag":464,"props":519,"children":520},{},[521],{"type":37,"value":522},"Client meeting notes",{"type":32,"tag":464,"props":524,"children":525},{},[526],{"type":37,"value":527},"Granola",{"type":32,"tag":464,"props":529,"children":530},{},[531],{"type":37,"value":532},"Slack thread",{"type":32,"tag":437,"props":534,"children":535},{},[536,541,546],{"type":32,"tag":464,"props":537,"children":538},{},[539],{"type":37,"value":540},"UI spec",{"type":32,"tag":464,"props":542,"children":543},{},[544],{"type":37,"value":545},"Figma",{"type":32,"tag":464,"props":547,"children":548},{},[549],{"type":37,"value":550},"Linear issue description",{"type":32,"tag":437,"props":552,"children":553},{},[554,559,563],{"type":32,"tag":464,"props":555,"children":556},{},[557],{"type":37,"value":558},"Brand assets",{"type":32,"tag":464,"props":560,"children":561},{},[562],{"type":37,"value":491},{"type":32,"tag":464,"props":564,"children":565},{},[566],{"type":37,"value":567},"Figma (embed link)",{"type":32,"tag":33,"props":569,"children":570},{},[571],{"type":37,"value":572},"No dual source-of-truth. If data looks canonical in 2 places, one is wrong.",{"type":32,"tag":40,"props":574,"children":576},{"id":575},"notification-discipline-when-silent-when-loud",[577],{"type":37,"value":578},"Notification Discipline: When Silent, When Loud",{"type":32,"tag":33,"props":580,"children":581},{},[582],{"type":37,"value":583},"The biggest risk in modern tool stacks is notification creep. Roibase's notification strategy:",{"type":32,"tag":33,"props":585,"children":586},{},[587],{"type":32,"tag":52,"props":588,"children":589},{},[590],{"type":37,"value":591},"Completely off:",{"type":32,"tag":75,"props":593,"children":594},{},[595,600,605],{"type":32,"tag":79,"props":596,"children":597},{},[598],{"type":37,"value":599},"Linear mentions (we use Slack threads instead)",{"type":32,"tag":79,"props":601,"children":602},{},[603],{"type":37,"value":604},"Figma comments (weekly digest)",{"type":32,"tag":79,"props":606,"children":607},{},[608],{"type":37,"value":609},"Notion page updates (no one watches)",{"type":32,"tag":33,"props":611,"children":612},{},[613],{"type":32,"tag":52,"props":614,"children":615},{},[616],{"type":37,"value":617},"Digest-based:",{"type":32,"tag":75,"props":619,"children":620},{},[621,626,631],{"type":32,"tag":79,"props":622,"children":623},{},[624],{"type":37,"value":625},"Linear daily summary (09:00 AM)",{"type":32,"tag":79,"props":627,"children":628},{},[629],{"type":37,"value":630},"Figma open comments summary (Friday 17:00)",{"type":32,"tag":79,"props":632,"children":633},{},[634],{"type":37,"value":635},"CI\u002FCD deploy log (post-deploy Slack summary)",{"type":32,"tag":33,"props":637,"children":638},{},[639],{"type":32,"tag":52,"props":640,"children":641},{},[642],{"type":37,"value":643},"Real-time:",{"type":32,"tag":75,"props":645,"children":646},{},[647,657,662],{"type":32,"tag":79,"props":648,"children":649},{},[650,655],{"type":32,"tag":134,"props":651,"children":653},{"className":652},[],[654],{"type":37,"value":258},{"type":37,"value":656}," (P0 incidents only)",{"type":32,"tag":79,"props":658,"children":659},{},[660],{"type":37,"value":661},"Granola client call summary (5 minutes after call)",{"type":32,"tag":79,"props":663,"children":664},{},[665,667,672],{"type":37,"value":666},"Production errors (Sentry → Slack, ",{"type":32,"tag":134,"props":668,"children":670},{"className":669},[],[671],{"type":37,"value":320},{"type":37,"value":673}," only)",{"type":32,"tag":33,"props":675,"children":676},{},[677],{"type":37,"value":678},"When we set up a tool, the first question is: \"Real-time notification or digest?\" Default answer: digest.",{"type":32,"tag":40,"props":680,"children":682},{"id":681},"what-to-do-now",[683],{"type":37,"value":684},"What to Do Now",{"type":32,"tag":33,"props":686,"children":687},{},[688],{"type":37,"value":689},"Instead of \"we should adopt tool X,\" ask \"where should this data be canonical?\" Roibase's 2026 stack is Linear\u002FNotion\u002FSlack\u002FFigma\u002FGranola, but these tools can swap — what matters is integration pattern, notification discipline, async-first culture. If your team still complains \"we're not getting tool X notifications,\" the problem isn't the tool — data ownership is unclear.",{"title":16,"searchDepth":691,"depth":691,"links":692},3,[693,697,698,701,702,703,704],{"id":42,"depth":694,"text":45,"children":695},2,[696],{"id":124,"depth":691,"text":127},{"id":155,"depth":694,"text":158},{"id":244,"depth":694,"text":247,"children":699},[700],{"id":346,"depth":691,"text":349},{"id":362,"depth":694,"text":365},{"id":419,"depth":694,"text":422},{"id":575,"depth":694,"text":578},{"id":681,"depth":694,"text":684},"markdown","content:en:lifestyle:tool-stack-2026-roibase-daily-operations.md","content","en\u002Flifestyle\u002Ftool-stack-2026-roibase-daily-operations.md","en\u002Flifestyle\u002Ftool-stack-2026-roibase-daily-operations","md",1782050759702]