SimpleScrumTools

Developer blog ·

We dropped the ads. Then we finished the list.

Our largest release since the launch removes ads from the plan and adds notifications, item assignment, reports, an Overview, export and a guided Setup. What we decided, and what running the product found.

This is our largest release since the launch, and the first full one in four weeks. It removes ads from the plan, and it adds notifications, item assignment, reports, an Overview, export and a guided Setup. Most of what follows is about the decisions under those features, and about what we found when we ran them.

Why the Free plan has no ads

When we launched, our pricing said the Free plan would show ads. No ad slot ever went live in production. When we looked again in October, the ads had earned nothing. We had switched off one network because of its ad quality, we had no approval from another, and the next candidate sold only push notifications and popunders and asked for three months of traffic first. So we removed the plan: the ad code, the consent banner and the cookie choices that only the ads needed.

The Free plan’s limits did not change. It is still 1 portfolio, 1 Scrum Team, 1 project and 5 members. The difference is that the plan no longer needs ads to pay for them.

A permission that reached nothing

Building item assignment meant reading how team roles reach an item. Our design says a team role applies to that team’s sprints and to the items in them. The code did not do that, so a person whose only write permission was the Developer team role could not move a card on their own board. Our help page described this as a rule. Most people never saw it, because the default Member role already grants that permission.

Sprints had the same gap. A Scrum Master invited as a Member and holding the team’s Scrum Master role could not create, plan, start, end or close that team’s sprints. Both gaps refused too much, so neither exposed anything, and no test had failed. The tests checked the rule that the code had, not the rule the design described. Team roles now reach what the design says, and they reach no further: not the backlog, and not another team’s sprint.

Measure before you build the fix

Everyone knows how to make a long list scroll well: virtualize it. We measured first. A 1,000-item backlog on a slowed CPU at phone width took a median of 53 ms per frame, about 19 frames a second. A 50-item project on the same setup took 17 ms, so size was the cause. But size was not the cause in the way we expected.

There were two causes. The button that follows your scroll position updated its state on every frame, even when it had not moved, and each update rendered every card again. And each frame laid out and painted about 9,800 nodes, most of them off the screen. We moved the button’s state into its own component, and we gave each row the browser’s own content-visibility: auto. The median frame is now 17 ms. No JavaScript virtualization was needed, so find-in-page, keyboard focus and drag-and-drop all work as they did.

Reading a spreadsheet ourselves

Import now reads .xlsx as well as .csv. Our plan named a popular library. A check before the build changed that plan. The library’s last release was three years old, it would have added 193 packages to about 100, and its reader did not limit its memory use. That is the same class of defect we fixed in our CSV parser in October.

So we wrote a small reader that uses Node’s own inflate. It unpacks only the parts of the file it needs, under one budget for the whole workbook, and its XML scanner only moves forward. Writing it ourselves also made its defects ours. A review before this release found small files that still cost the reader too much memory. We added limits for one cell and for a whole sheet, and those files now get a plain refusal.

Setup reads what exists

A new organization now opens on Setup, a list of eight steps from your first settings to your first sprint. We did not build a practice project. On the Free plan it would use your only project, and you would have to build the real one anyway. The steps link to the real screens, and the public demo is there if you want to see a finished example.

Seven of the steps read the rows that exist on every load. The first asks only whether the settings were ever saved, because a default name looks the same as a chosen one, and that one fact comes from the activity log. We rejected recording each step as it happened, and we rejected building the list from the log, because both can disagree with what is really there. A person who joins from now on meets a welcome page instead, which shows their own team, sprint, assigned work and next Scrum Event, and which never names a project that is hidden from them.

What running it found

We ran the full sprint cycle in Chrome emulating a phone, through the screens only, with real touch events. That found a gap we should have seen sooner: no screen could start a Retrospective. A Sprint Review existed only if the product had booked it. Every test passed, because no test had asked. Both screens now offer to start one.

The same habit found a cancelled sprint that kept its dates. New sprint then offered those dates and refused them. It also found an item panel that conflicted with itself when two saves ran close together. A unit test rarely finds this kind of defect. You find it by using the product. We also fixed a limit that our help had described for some time: an invited person who continues with a sign-in provider now comes back to the invitation.

Two scans on release day

On the morning of this release we ran a full security scan over the code and over how the features work together. It confirmed 38 items, some of them the same defect seen from two sides. Some were in new code that had never reached production. Others were not, and those are the reason this release also fixes things in the site you already use.

Then we fixed them and scanned again, because about 45 commits had landed since the first scan. The second scan confirmed 16 more. The one we think about most is one we caused that afternoon: a fix for a formula guard in CSV files was itself far too slow on a crafted file. The second scan measured it, and it never reached production. A fix is new code, and it gets the same suspicion as any other new code.

The function test found something a scan did not. One test client on our development site filled its database connections, and exports began to fail. Production showed no such error, but it had the same settings, so each server now keeps a small, fixed number of connections.

The final code passed 4,038 automated tests and 1,326 of 1,329 checks against the hosted development site, through the API and in a real browser. The other three expected an older answer to a request from another site, and we changed that answer on purpose.

SimpleScrumTools is free for teams of up to 5 members, with no card required and no ads. Create a free account.

Release notes for November 6, 2026

This release adds new screens and changes some defaults. Your projects and data do not change. Starting today, on a day with new unread notifications, you get one summary email. To change how often it comes or to turn it off, use the Notifications card on your account page, or the link in the email.

No ads

  • No plan shows ads, and the plan no longer says it will. You never saw an ad here, so your screens do not change.
  • The Free plan keeps its limits: 1 portfolio, 1 Scrum Team, 1 project and 5 members.
  • The Privacy Policy and the EULA no longer describe ads, a consent banner or an advertising partner.

Notifications

  • A bell in the top bar shows your notifications. They cover your team’s sprint starting or ending, work assigned to you, an invitation to a Scrum Event, a reminder one to two hours before a Scrum Event, a Backlog Refinement left open for a day, and what moved when a sprint closes because the next one started.
  • You get one summary email, not one email for each notification. On your account page, set it to Off, Every hour, Every day or Every week. The default is every day, at about 08:00 UTC. You cannot change that hour or your time zone yet.
  • Scrum Event reminders appear in the email only with Every hour. With the other settings they appear only in the bell.

Assigning items

  • Turn on Assign items to individuals in the project settings. It is off by default. You can then assign an item in an Active sprint to a member of that sprint’s Scrum Team, from the item panel or with Assign on a board card.
  • With that setting on, only the assignee, the team’s Scrum Master or the Product Owner can move an assigned item to Done. Anyone else who can edit the item can unassign it first.

Team roles

  • A team role now applies to the items in that team’s sprint.
  • A person with a team’s Scrum Master role can now create, plan, start, end and close that team’s sprints. Adding someone in the Scrum Master slot grants that role. Moving someone into the slot does not, so change Granted by as well.
  • Cancelling a sprint stays with the Product Owner.

Reports and the Overview

  • Reports on each project shows sprint health, the burndown, and velocity for the last six finished sprints.
  • Overview shows how your work is doing: this sprint, and a 12-week trend. A project hidden from you is left out.
  • Save as PDF on Reports prints a clean sprint report from your browser.

Import and export

  • Import reads the first visible sheet of an .xlsx workbook as well as .csv files, up to 2 MB.
  • A project’s Export section gives the backlog as CSV, which imports into a project with the same phase, type and epic names. It gives the backlog, sprints, Scrum Events and impediments as JSON.

Setup and the welcome page

  • A new organization opens on Setup, eight steps with your progress in the sidebar. You can hide it, and you can show it again from Organization settings.
  • A new member sees a welcome page with their team, sprint, assigned work and next Scrum Event. It stays in the account menu.
  • If your organization has started a sprint, you do not see Setup. If it has not, it opens on Setup for anyone who manages the organization, until you finish or hide it.
  • If you belong to more than one organization, signing in opens the first one that is not in Setup.
  • An account with no organization can start one after sign-in, from the card titled You are not in any organization.

Scrum Events

  • The Retrospective and Sprint Review screens can now start and open a session, for the Active sprint or the one that most recently ended.

Keyboard, phones and accessibility

  • Press ? for the keyboard shortcuts. You can turn them off in the same dialog.
  • The full sprint cycle now works from a phone browser, with 44 px controls.
  • An automated audit against WCAG 2.2 AA now passes on every screen we tested.
  • A 1,000-item backlog now scrolls smoothly on a phone-speed CPU.

Activity

  • The Activity screen shows the last 90 days. Older records move to an archive and stay with your organization.

Fixes

  • A cancelled sprint no longer holds its dates, so New sprint can use them.
  • You can now cancel a Scheduled sprint that has no Sprint Goal or no team.
  • Cancelling a sprint also cancels its Sprint Planning and Sprint Review if they never opened, so nobody gets a reminder for them. A sprint that never started also cancels its Retrospective.
  • Rows that name a phase, type or epic in a non-Latin script now go to that one. Import reports an unknown name.
  • Your column choices in the import wizard stay on the screen when a check fails.
  • Converting a card from two tabs at once now files one backlog item.
  • An invited person who continues with a sign-in provider, such as Google, now returns to the invitation.
  • Two quick changes in the item panel no longer report a conflict with yourself.
  • A session screen no longer shows the previous session’s status.

Security and limits

  • A security review before this release fixed defects in these classes: access checks, data shown to a person who cannot view a project, requests from other sites, memory and time used by one request, and formulas in exported files.
  • We updated two libraries that had published security fixes.
  • A person who cannot view a project gets no notification about it, in the bell or in the summary email.
  • A removed member leaves the attendee list of sessions that are not closed, and stops being their facilitator. An invitation back does not restore those places.
  • You can no longer clear your own project override. Another administrator must do it.
  • One person can send 30 invitations an hour. Only an invitation that was sent counts.
  • Import refuses a workbook with a cell over 50,000 characters, or with more text than an import can read. On a busy server, a preview or an import can ask you to wait a minute.
  • A preview leaves Past imports after 7 days. Real imports stay.
  • In an exported CSV opened in a spreadsheet, you can see an apostrophe in front of =, +, - or @ after a semicolon, a tab or a line break. This includes list bullets. An import removes it.