Linear Blog https://linear.app/now Updates from the Linear team. Mon, 26 Oct 2026 07:28:43 GMT https://validator.w3.org/feed/docs/rss2.html https://github.com/jpmonette/feed en-US All rights reserved 2026, Linear <![CDATA[Five principles for working with Loops]]> https://linear.app/now/five-principles-working-with-loops https://linear.app/now/five-principles-working-with-loops Tue, 13 Oct 2026 08:06:00 GMT <![CDATA[AI coding has made CI a bottleneck, so we reworked ours to keep up]]> https://linear.app/now/ci-bottleneck-reworked https://linear.app/now/ci-bottleneck-reworked Mon, 21 Sep 2026 12:26:00 GMT <![CDATA[Styling Linear for the future with StyleX]]> https://linear.app/now/styling-linear-for-the-future-stylex https://linear.app/now/styling-linear-for-the-future-stylex Wed, 26 Aug 2026 22:47:00 GMT <![CDATA[Sharing Linear’s growth with the people building it]]> https://linear.app/now/sharing-growth-with-the-people-building-linear https://linear.app/now/sharing-growth-with-the-people-building-linear Wed, 26 Aug 2026 11:43:06 GMT <![CDATA[Rebuilding Linear’s delta sync read path]]> https://linear.app/now/rebuilding-delta-sync-read-path https://linear.app/now/rebuilding-delta-sync-read-path Tue, 18 Aug 2026 12:42:00 GMT <![CDATA[How we built Linear Agent]]> https://linear.app/now/how-we-built-linear-agent https://linear.app/now/how-we-built-linear-agent Mon, 10 Aug 2026 12:19:00 GMT <![CDATA[Introducing Loops]]> https://linear.app/now/introducing-loops https://linear.app/now/introducing-loops Mon, 20 Jul 2026 15:30:00 GMT <![CDATA[Teaching an agent to auto-fix bugs]]> https://linear.app/now/linear-agent-bug-fix https://linear.app/now/linear-agent-bug-fix Fri, 12 Jun 2026 16:34:00 GMT <![CDATA[Now Linear writes the code, too]]> https://linear.app/now/coding-sessions-for-linear-agent https://linear.app/now/coding-sessions-for-linear-agent Thu, 11 Jun 2026 18:25:29 GMT <![CDATA[Reviewing code in the agent era]]> https://linear.app/now/reviewing-code-in-the-agent-era https://linear.app/now/reviewing-code-in-the-agent-era Wed, 10 Jun 2026 14:16:00 GMT <![CDATA[Code review should be fast]]> https://linear.app/now/code-review-should-be-fast https://linear.app/now/code-review-should-be-fast Thu, 28 May 2026 07:00:00 GMT <![CDATA[Code Intelligence for Linear Agent]]> https://linear.app/now/code-intelligence-for-linear-agent https://linear.app/now/code-intelligence-for-linear-agent Thu, 14 May 2026 18:50:00 GMT <![CDATA[How we hire at Linear]]> https://linear.app/now/how-we-hire-at-linear https://linear.app/now/how-we-hire-at-linear Tue, 28 Apr 2026 12:22:00 GMT <![CDATA[Output isn’t design]]> https://linear.app/now/output-isn-t-design https://linear.app/now/output-isn-t-design Fri, 17 Apr 2026 14:23:00 GMT <![CDATA[How we use Linear Agent at Linear]]> https://linear.app/now/how-we-use-linear-agent-at-linear https://linear.app/now/how-we-use-linear-agent-at-linear Fri, 10 Apr 2026 12:17:56 GMT <![CDATA[Post mortem on Linear security incident on March 24th, 2026]]> https://linear.app/now/linear-incident-on-mar-24th-2026 https://linear.app/now/linear-incident-on-mar-24th-2026 Mon, 06 Apr 2026 15:35:15 GMT <![CDATA[A calmer interface for a product in motion]]> https://linear.app/now/behind-the-latest-design-refresh https://linear.app/now/behind-the-latest-design-refresh Thu, 12 Mar 2026 14:18:00 GMT <![CDATA[Design is more than code]]> https://linear.app/now/design-is-more-than-code https://linear.app/now/design-is-more-than-code Fri, 19 Dec 2025 19:30:00 GMT <![CDATA[How our Customer Experience team works in Linear]]> https://linear.app/now/cx-in-linear https://linear.app/now/cx-in-linear Thu, 06 Nov 2025 15:43:19 GMT <![CDATA[Continuous planning in Linear]]> https://linear.app/now/continuous-planning-in-linear https://linear.app/now/continuous-planning-in-linear Thu, 30 Oct 2025 15:24:26 GMT <![CDATA[Designing remote work at Linear]]> https://linear.app/now/designing-remote-work-at-linear https://linear.app/now/designing-remote-work-at-linear Wed, 29 Oct 2025 17:09:18 GMT <![CDATA[Self-driving SaaS: When software runs itself]]> https://linear.app/now/self-driving-saas https://linear.app/now/self-driving-saas Wed, 22 Oct 2025 16:33:34 GMT <![CDATA[A Linear spin on Liquid Glass]]> https://linear.app/now/linear-liquid-glass https://linear.app/now/linear-liquid-glass Tue, 21 Oct 2025 16:32:42 GMT <![CDATA[Best practices for designing Linear Dashboards]]> https://linear.app/now/dashboards-best-practices https://linear.app/now/dashboards-best-practices Tue, 07 Oct 2025 13:09:00 GMT <![CDATA[Why we committed to a zero-bugs policy]]> https://linear.app/now/zero-bugs-policy https://linear.app/now/zero-bugs-policy Wed, 24 Sep 2025 13:18:00 GMT <![CDATA[How Commure uses Dashboards to track performance and guide planning]]> https://linear.app/now/commure-dashboards https://linear.app/now/commure-dashboards Wed, 10 Sep 2025 18:05:00 GMT <![CDATA[How we built Triage Intelligence]]> https://linear.app/now/how-we-built-triage-intelligence https://linear.app/now/how-we-built-triage-intelligence Wed, 03 Sep 2025 14:03:36 GMT <![CDATA[Giving our team liquidity through Linear’s first tender offer]]> https://linear.app/now/giving-our-team-liquidity-through-linear-s-first-tender-offer https://linear.app/now/giving-our-team-liquidity-through-linear-s-first-tender-offer Wed, 27 Aug 2025 14:00:11 GMT <![CDATA[How Cursor integrated with Linear for Agents]]> https://linear.app/now/how-cursor-integrated-with-linear-for-agents https://linear.app/now/how-cursor-integrated-with-linear-for-agents Thu, 21 Aug 2025 14:46:30 GMT <![CDATA[Quality Wednesdays: How we trained our team to see what doesn’t work]]> https://linear.app/now/quality-wednesdays https://linear.app/now/quality-wednesdays Wed, 13 Aug 2025 14:41:47 GMT <![CDATA[Our approach to building the Agent Interaction SDK ]]> https://linear.app/now/our-approach-to-building-the-agent-interaction-sdk https://linear.app/now/our-approach-to-building-the-agent-interaction-sdk Fri, 01 Aug 2025 15:12:19 GMT <![CDATA[Inside Mercury’s six-month journey building with AI agents]]> https://linear.app/now/mercury-linear-ai-agents https://linear.app/now/mercury-linear-ai-agents Wed, 16 Jul 2025 13:19:00 GMT <![CDATA[Building our way: Announcing our Series C ]]> https://linear.app/now/building-our-way https://linear.app/now/building-our-way Tue, 10 Jun 2025 12:40:00 GMT <![CDATA[Why is quality so rare?]]> https://linear.app/now/why-is-quality-so-rare https://linear.app/now/why-is-quality-so-rare Tue, 27 May 2025 17:45:53 GMT <![CDATA[Design for the AI age]]> https://linear.app/now/design-for-the-ai-age https://linear.app/now/design-for-the-ai-age Mon, 07 Apr 2025 17:41:37 GMT <![CDATA[Building what customers need, not just what they ask for]]> https://linear.app/now/building-what-customers-need https://linear.app/now/building-what-customers-need Tue, 04 Mar 2025 12:14:00 GMT <![CDATA[The profitable startup]]> https://linear.app/now/the-profitable-startup https://linear.app/now/the-profitable-startup Fri, 21 Feb 2025 16:46:55 GMT <![CDATA[Why and how Scale migrated to Linear]]> https://linear.app/now/why-and-how-scale-migrated-to-linear https://linear.app/now/why-and-how-scale-migrated-to-linear Fri, 15 Nov 2024 17:00:00 GMT <![CDATA[Simplifying support at scale: How Pleo uses Linear Asks]]> https://linear.app/now/simplifying-support-at-scale-how-pleo-uses-linear-asks https://linear.app/now/simplifying-support-at-scale-how-pleo-uses-linear-asks Mon, 11 Nov 2024 14:24:36 GMT <![CDATA[How we built multi-region support for Linear]]> https://linear.app/now/how-we-built-multi-region-support-for-linear https://linear.app/now/how-we-built-multi-region-support-for-linear Thu, 23 May 2024 14:14:06 GMT <![CDATA[How we redesigned the Linear UI (part Ⅱ)]]> https://linear.app/now/how-we-redesigned-the-linear-ui https://linear.app/now/how-we-redesigned-the-linear-ui Thu, 28 Mar 2024 19:18:53 GMT <![CDATA[A design reset (part I) ]]> https://linear.app/now/a-design-reset https://linear.app/now/a-design-reset Wed, 27 Mar 2024 15:28:00 GMT <![CDATA[Rethinking the startup MVP: Building a competitive product]]> https://linear.app/now/rethinking-the-startup-mvp-building-a-competitive-product https://linear.app/now/rethinking-the-startup-mvp-building-a-competitive-product Wed, 28 Feb 2024 20:26:00 GMT <![CDATA[Descript’s internal guide for using Linear as your work operating system]]> https://linear.app/now/descript-internal-guide-for-using-linear https://linear.app/now/descript-internal-guide-for-using-linear Wed, 31 Jan 2024 22:04:03 GMT <![CDATA[Post mortem on Linear incident from Jan 24th, 2024]]> https://linear.app/now/linear-incident-on-jan-24th-2024 https://linear.app/now/linear-incident-on-jan-24th-2024 Tue, 30 Jan 2024 15:15:09 GMT CASCADE; The intention here was to delete any data in the new table as well as any rows of test data with foreign keys pointing to the new table. However, CASCADE simply truncates the entire contents of any tables that have foreign keys to the table. This caused the full deletion of production data for issue and document descriptions, comments, notifications, favorites, and reactions. When pull requests include migration, we do include CI warnings for dangerous migrations, like large indexing operations. The pull request was tested locally and reviewed by multiple engineers but the cascade operation was missed by both author and peer reviewers. Outage and investigation With the data deleted, symptoms weren't immediately visible to end-users, including our own team. Linear stores most workspace data in a local client cache, and there’s also a database cache which sits in front of the Postgres database. Our sync engine updates this database cache programmatically to add and remove "sync" packets describing database mutations. As this is part of the application logic, deleting rows directly from the database won’t create sync packets and thus won’t update the cache or clients. This meant users would continue to see and receive data for the deleted tables in the Postgres database until they reloaded their local data and the backend cache was invalidated, which usually takes 24 hours. Data caching was also one of the primary reasons the problem was missed in local development. The data loss went unnoticed for 30 minutes due to the multiple layers of cache involved. It was possible to reload the Linear client and not see any visible problems at all. Only mutations caused errors due to underlying database entities no longer existing. The outage first became apparent with notifications, as it is one of our most frequently updated tables, with notifications created and deleted based on many events. There is always a small lag in synchronization state between the backend and its clients. We often see the client trying to update deleted entities and see these as a synchronization lag warning. As an expected part of the system these did not count towards error metrics or trigger alert monitors. An engineer started an internal incident to investigate when they saw problems while using their own notification inbox. User reports confirmed the synchronization issues that the problems pointed to. This happened around 30 minutes after the migration. This caused a critical incident to start and personnel to be paged. The cause wasn’t clear at first due to the caching. But, a spike in warnings from clients to the notificationUpdate GraphQL endpoint offered a clue about when the problem started. The faulty commit was quickly correlated. Our engineers verified that the commit did cause similar symptoms when run locally. Shortly thereafter, an engineer found all notifications had been deleted in their local database. At this point, production data was checked and we found multiple tables had been entirely deleted. Linear was promptly taken into maintenance mode, which blocks any updates and presents a maintenance screen for all users. We created a new backup to capture all the sync packets created up until that point. Then the database was restored from the latest backup from before the faulty migration ran. Linear takes daily full backups in addition to having point-in-time recovery. The last backup was taken at 04:47 UTC and the bad commit landed at 07:01 UTC. With point-in-time recovery engineering could have restored services to the state they were in at 07:01. However, the engineering team had never tested point-in-time recovery, nor had engineering developed tooling to quickly restore the database using point-in-time recovery, so that option wasn’t considered. Restoring from a full backup was a frequently tested procedure and thus executed to get the application up and running as quickly as possible, while initially losing more data than point-in-time recovery. After backup restoration was completed, Linear was brought back online again with data as of the 04:47 UTC backup. The service recovered somewhat quickly, with intermittent problems affecting synchronization. The sync service uses a cursor to get changes not yet sent to clients and caches this cursor in Redis. However, the code did not account for the ID moving backwards, as was the case with a full database restore. Resetting the cache and restarting the sync service resolved these issues. Data restoration After Linear was back online, our engineering team started restoring data that was affected by the rollback. As mentioned earlier, Linear's realtime sync engine keeps a log of every change that affects entities and properties in a form of sync packet ("action") that is sent to clients. This includes the type of action taken (insert, update, archive, delete), a snapshot of the entire entity after the change, and a delta of properties changed in case of an update action. Each change also contains an actor, usually the user that made the change. We used these actions to find all users affected by changes in the outage. We then contacted them to tell them about the problem and when data would be restored. We also sent an email to all administrators of the affected workspaces in the interest of transparency and awareness. Part of our team implemented a new settings page to show administrators the progress of the restoration procedure.This page also listed any lost data and errors during restoration so they could then fix their data, if needed. At the same time, we added a restoration script to run through the lost actions for each workspace. It reapplied the actions by users, integrations, API calls, and Linear automations. The script was first executed as a dry-run to expose and fix any edge cases in the replaying of these changes. When a workspace didn't have any errors in the dry-run, recovery was run for it. We investigated workspaces that had errors to see if we could fix them. Due to the large number of affected workspaces, this investigation took the majority of the recovery time. Some actions were unrecoverable because of unresolvable conflicts and were listed in the individual workspace's recovery page. Most of the errors revolved around: Document content already existed: This meant the description for an issue or document had been recently created. We did not want to override changes made by users. User created: Users created during the outage were not recovered as we had no way to tie them back to an authentication. Ultimately, all the actions involving a new user (e.g. being assigned to an issue) and issues created by these new users were skipped as well. Modifications to entities no longer existed: If an update for an entity was archived or deleted, those updates were skipped. We also excluded some objects from recovery entirely, such as integrations allowed to act in Linear on behalf of a workspace. We did not want to bring these back automatically after this delay. Instead, we chose to let users reconnect any missing integrations themselves. Similarly, we did not recover newly-created workspaces. Instead, we sent the workspace administrators an email telling them about the situation. Impact All users experienced one hour of platform downtime while the backup restored data. In all, 12% of workspaces had data that was unavailable until the restoration finished. Another 7% had automated changes (like generated Cycles) that were also unavailable. We restored over 99% of data within 36 hours. The remaining 4,136 sync packets for unresolvable conflicts represent an average of 0.44 per workspace. Next steps and improvements This incident was the largest in Linear’s five-year history. We strive to build the fastest and most reliable product for our users. This incident revealed many areas where we can do better to find, stop, and recover from similar outages. We learned important lessons from the outage, which we’ll be making actionable in the coming weeks and months. We’ve listed some of the changes we’ll implement below, with more to come as we continue assessing our response: No user on the production databases should have TRUNCATE privileges. Improve how migrations are created and applied to the database. This includes better review practices from database admins—separate from code reviews—and linting of dangerous operations. Make testing of database migrations in a staging environment easier and automated to reduce friction. Create and test tooling to quickly re-create the database from point-in-time backups. Various changes to internal tooling, addressing weaknesses or friction uncovered by the incident response. Improved monitors for data integrity. Implement the ability to turn on a read-only mode for Linear, so that clients have read access even when no changes are allowed to reduce the effects of downtime. Again, we’re extremely sorry that this outage happened and it has involved most of our engineering team over the past week to resolve. We’ll keep working to improve as a team and to commit to a high level of transparency around our incident response, both during and after.]]> <![CDATA[Why and how we do work trials at Linear]]> https://linear.app/now/why-and-how-we-do-work-trials-at-linear https://linear.app/now/why-and-how-we-do-work-trials-at-linear Wed, 13 Dec 2023 18:00:00 GMT <![CDATA[Using AI to detect similar issues]]> https://linear.app/now/using-ai-to-detect-similar-issues https://linear.app/now/using-ai-to-detect-similar-issues Wed, 29 Nov 2023 15:10:00 GMT <![CDATA[Planning for unplanned work]]> https://linear.app/now/planning-for-unplanned-work https://linear.app/now/planning-for-unplanned-work Thu, 16 Nov 2023 16:34:49 GMT <![CDATA[How we run projects at Linear]]> https://linear.app/now/how-we-run-projects-at-linear https://linear.app/now/how-we-run-projects-at-linear Thu, 05 Oct 2023 15:06:22 GMT <![CDATA[Linear raises $35M Series B led by Accel]]> https://linear.app/now/series-b https://linear.app/now/series-b Thu, 14 Sep 2023 13:45:00 GMT <![CDATA[How we think about customer experience at Linear]]> https://linear.app/now/how-we-think-about-customer-experience-at-linear https://linear.app/now/how-we-think-about-customer-experience-at-linear Thu, 07 Sep 2023 07:29:00 GMT <![CDATA[Scaling the Linear Sync Engine]]> https://linear.app/now/scaling-the-linear-sync-engine https://linear.app/now/scaling-the-linear-sync-engine Thu, 29 Jun 2023 07:28:00 GMT <![CDATA[Welcoming Cristina Cordova to Linear]]> https://linear.app/now/welcoming-cristina-cordova-to-linear https://linear.app/now/welcoming-cristina-cordova-to-linear Tue, 23 May 2023 16:00:35 GMT <![CDATA[How we built Project Updates]]> https://linear.app/now/how-we-built-project-updates https://linear.app/now/how-we-built-project-updates Wed, 10 Aug 2022 16:00:00 GMT <![CDATA[Settings are not a design failure]]> https://linear.app/now/settings-are-not-a-design-failure https://linear.app/now/settings-are-not-a-design-failure Wed, 02 Feb 2022 16:46:29 GMT <![CDATA[Linear – 2021 Wrapped]]> https://linear.app/now/linear-2021-wrapped https://linear.app/now/linear-2021-wrapped Fri, 17 Dec 2021 17:13:54 GMT <![CDATA[Fast growing startups are built on Linear]]> https://linear.app/now/fast-growing-startups-are-built-on-linear https://linear.app/now/fast-growing-startups-are-built-on-linear Tue, 29 Jun 2021 19:59:00 GMT <![CDATA[Building at the early stage]]> https://linear.app/now/building-at-the-early-stage https://linear.app/now/building-at-the-early-stage Thu, 21 Jan 2021 17:53:00 GMT <![CDATA[Linear raises $13M in Series A funding from Sequoia Capital]]> https://linear.app/now/linear-raises-usd13m-in-series-a-funding-from-sequoia-capital https://linear.app/now/linear-raises-usd13m-in-series-a-funding-from-sequoia-capital Tue, 08 Dec 2020 21:16:00 GMT <![CDATA[Invisible details - Building contextual menus]]> https://linear.app/now/invisible-details https://linear.app/now/invisible-details Thu, 17 Sep 2020 16:52:00 GMT <![CDATA[Practices for Building — Linear is now open for all]]> https://linear.app/now/practices-for-building-linear-is-now-open-for-all https://linear.app/now/practices-for-building-linear-is-now-open-for-all Tue, 30 Jun 2020 20:18:00 GMT <![CDATA[Startups, Write Changelogs]]> https://linear.app/now/startups-write-changelogs https://linear.app/now/startups-write-changelogs Mon, 18 May 2020 20:21:00 GMT <![CDATA[Linear’s Next Chapter: Announcing our $4.2M Seed Round]]> https://linear.app/now/linear-s-next-chapter-announcing-our-usd4-2m-seed-round https://linear.app/now/linear-s-next-chapter-announcing-our-usd4-2m-seed-round Thu, 21 Nov 2019 21:23:00 GMT