# Listspace - Build in Public

This is the text version of a public Listspace board, read-only: https://listspace.app/@jordi/listspace-build-in-public
It shows what the public link shows: 12 lists and 582 items.

> The real project board for Listspace, built in public. The AI agents that build Listspace read this board at the start of every session and keep it up to date themselves: ideas, open questions, what is next, what is being worked on and what has shipped. Product decisions, with the reason behind them, are in Project Input. Nothing here is staged for show: this is the project's actual memory. Want the same for your own projects and agents? listspace.app

Page 1 of 2. Next page: https://listspace.app/@jordi/listspace-build-in-public.md?page=2

## Project Resources

> Central place for all project documents and assets

### About this board

> This is the real project board for Listspace itself. The AI agents that build Listspace (Claude Code and its helper agents) read it at the start of every session and keep it up to date while they work: ideas, questions, to-dos, what is in progress and what has shipped. Product decisions, with the reason behind them, are in Project Input.
>
> It is the proof of what Listspace is for: **the agentic project memory**. Nobody updates this board by hand.

### Links

> - listspace.app
> - [Connect Claude or ChatGPT](https://listspace.app/setup)
> - [Works with: apps and agents](https://listspace.app/works-with)
> - [Help](https://listspace.app/help)
> - [Connect an AI assistant (MCP)](https://listspace.app/docs/mcp)
> - [REST API](https://listspace.app/docs/api)
> - [Roadmap](https://listspace.app/roadmap)
> - [Brand](https://listspace.app/brand)
> - [Skill, Claude Code plugin and CLI (GitHub)](https://github.com/listspace/agent)
> - [CLI on npm](https://www.npmjs.com/package/listspace)

### Competitor study, 19 Oct 2026: monday.com, ClickUp, Basecamp and Fizzy

> All facts from the vendors' own pages, checked October 2026. Where a page did not say something, this study says "not stated". Third-party pricing pages were read for context only; no prices in the ideas.
>
> ## 1. Per vendor
>
> ### monday.com
>
> - **AI platform.** Five named parts: Agent builder (define an agent's goal and rules, then review its results), AI assistant, Vibe coding (build custom tools inside the workspace), Notetaker, and AI workflows ("how work moves between people and agents"). Source: monday.com/w/ai
> - **monday MCP.** An admin installs it from the marketplace, then the AI tool connects over OAuth. Listed clients: Claude, Copilot, ChatGPT, Cursor. Assistants can create tasks and update data; they can do only what the connected user may do, and access can be limited to some workspaces. No per-action approval is described; the page advises "monitoring activity". Source: monday.com/w/mcp
> - **"Hey AI, learn about us".** A header link to monday.com/w/ai-info. It is not a prompt link (no chatgpt.com/?q= style URL). It is a page of facts written for AI systems: company facts, key terms, capabilities, competitors, customers, trust signals and review comparisons. It also has a section "programmatic signup for agents" with a sign-up URL flagged for agents and a skill file at monday.com/static/agents/skill.md (boards, items, columns, updates, webhooks, via MCP or the GraphQL API with a personal token).
> - **llms.txt.** monday.com/llms.txt exists and maps products (CRM, dev, service), AI (sidekick, agents, vibe), core features (boards, automations, dashboards, 200+ integrations), developer docs and agent setup guides.
> - **"monday for agents".** Only a footer link to a sign-up page, no description (monday.com/w/ai).
>
> ### ClickUp
>
> The help center pages were read through ClickUp's public help center API (the web pages return 403 to tools), checked 19 October 2026.
>
> - **Brain.** "Brain AI" is ClickUp's name for everything that uses AI in the product. Brain answers questions from the tasks, Docs, Chats and connected-app data the user may access, and builds decks, dashboards, HTML pages, emails and research. It has persistent memory (role, coworkers, preferences), connects to external MCP servers, reads and writes Gmail and Slack, and uses reusable "AI Skills". Its default model is called Max; the user can switch to ChatGPT, Claude or Gemini models mid-chat. People reach it from the AI Command Bar, tasks and Docs, or by @mentioning Brain in comments and Chat. Also on clickup.com/brain: Notetaker and Enterprise Search. Source: [What is ClickUp Brain AI](https://help.clickup.com/hc/en-us/articles/12578085238039-What-is-ClickUp-Brain-AI)
> - **Super Agents.** "Brain AI-powered teammates" with "the complete context of your Workspace" that run multi-step workflows "around the clock". Members and admins build them in a natural-language builder or from a catalog, and choose their tools and data sources. Triggers: "automatically or manually"; Super Agent permissions control who can trigger or manage each one. Memory "evolves" and they "learn from errors and feedback". Approval: "every action is logged, and they seek human approval for critical decisions"; which decisions count as critical is not stated. Separate from Autopilot Agents, which act on fixed triggers and conditions. clickup.com/ai shows the log with each action marked complete, warning or cancelled. Source: [What are Super Agents](https://help.clickup.com/hc/en-us/articles/31010910371991-What-are-Super-Agents)
> - **Ambient Answers.** The AI page calls it Ambient Intelligence: context and suggestions "before you even ask", only from what the user may already see. Source: clickup.com/ai
> - **AI Fields.** Custom fields that "actively generate or interpret information based on prompts you write". Long Text types: Summary, Progress Updates, Translation, Action Items, Custom Text. Dropdown types: Categorize, Custom Dropdown, T-shirt Size, Sentiment. Each field has a prompt (up to 65,000 ch [cut short; open the board for the rest]

## Project Input

> Incoming feedback, requirements, and data

### Position: the agentic project memory

> **Listspace, the agentic project memory.** Built for agents from the start.
>
> We are not inventing a new tool; we claim a new position, the way Postiz became "the agentic social media scheduling platform". Short forms: "Project memory for your agents", "The project board for all your agents".

### Headline: Your AI forgets. Listspace remembers.

> Subtitle: Stop re-explaining your project to AI.
>
> Subline: Let your AI do the boring project work. You focus on making it a success.
>
> Closing section: Ready to stop re-explaining your project?
>
> Curiosity lines, once each on the page:
>
> - Not another kanban board. The one your agents keep.
> - Not a second brain. A shared one.
> - Agents propose. You decide.
> - No AI tax. Bring the agent you already pay for.

### Agent access levels 1 to 5

> Set for the account, overridable per board, with reset to the account setting. Enforced by the server; what a level does not allow goes to the board's Inbox.
>
> 1. Read only (writes refused)
> 2. Suggest (everything to the Inbox)
> 3. Capture (default): ideas, bugs, notes, comments directly; can start a project board
> 4. Act (Pro): to-dos, edits, moves
> 5. Full (Pro): also complete, archive, bulk
>
> Never at any level: permanent delete, changing levels or board instructions, share links, board email addresses, tokens.

### Plans: Free, Pro, Team, Business, Enterprise

> Current as of 16 Oct 2026 (Free and Pro updated; Team, Business and Enterprise as of 12 Oct). It replaces the 7, 9 and 12 Oct versions; the history is in the comments. Details for companies are in the document "Business plan for companies (50+ users): first shape" under Ideas.
>
> - **Free:** one person. Your AI works up to level 4 (Act). New accounts start at level 4. 1 guest per board, who can view or comment. 1 GB of storage, 30 days of history, API tokens, and public GitHub pull request status.
> - **Pro:** one person, **€7.99 a month, or €6.99 a month paid yearly** (€83.88 a year). Founding members get 50% off for as long as they keep Pro; founders who cancel, pause or downgrade are told they lose it. Level 5 (Full), **up to 5 guests per board** with any role (view, comment or edit), 50 GB, all history, webhooks, email to a board, private GitHub repositories and items that move with their pull request.
> - **Pro trial:** every account gets 14 days of Pro once, no card needed. Afterwards it pays for Pro or stays on Free, with everything kept.
> - **Team:** any group from 2 people (two freelancers count), **€9.99 per seat a month, or €8.99 paid yearly**, minimum 2 seats. Members see every board in the team's spaces and have their own agent levels. Shared Inbox approval, roles, invites, central billing, a storage pool of 50 GB per seat, and a team agent policy. A seat includes Pro for the member's own spaces. Guests on team boards are free (view and comment). See "Spec: the Team plan".
> - **Business:** companies, per seat, priced above Team. Adds sign-in through Google or Microsoft, a verified domain, an audit log, the admin console and invoice payment.
> - **Enterprise:** custom, with white label or a dedicated instance.
>
> No AI costs and no AI fee on any plan: the agent runs on the user's own Claude or ChatGPT. What Pro adds for agents is more Agent access (level 5), not AI usage.
>
> **Order of work (16 Oct):** a soft launch first, with a personal round of testers, then open sign-up with Free and Pro, then custom fields, then Team.
>
> **Why these prices (12 Oct):** a new product at launch sits in the middle of the market. Todoist and Trello cost about €4 to €6, Linear and Notion about €8 to €12. Team is "€2 more per person", in line with the usual 25 to 50% step to a team plan. The price can rise for new customers once there's proof, and earlier customers keep theirs.

### Name: Listspace in text, listspace in the logo

> Decided 6 Oct 2026. In running text the product is **Listspace**, like any other name (Airbnb, Spotify). The lowercase **listspace** appears only in the logo. ListSpace and ListSpace.app are retired. The domain stays listspace.app where it is an address.
>
> Reason: lowercase at the start of a sentence reads like a typo, and a normal capital keeps copy and screen readers clean while the logo keeps its own look.

### Our own memory lives on Listspace

> Decided 6 Oct 2026. The agents building Listspace no longer keep the project in their own memory files. Project state, decisions and the way we work live on Listspace boards: this public one for the product, and a private one for internal details. The agent's local memory keeps only a handful of personal rules and a pointer to the boards, and those rules are backed up on Listspace too.
>
> Reason: the pitch is "Stop being your agent's memory." Our own agents should prove it.

### Message: the board that keeps itself up to date

> Proposed 7 Oct (Jordi). The pain everyone knows: a board is great until the project gets big, and then nobody keeps it up to date. Maintaining a board costs hours a week, so it drifts, and a stale board is worse than none.
>
> **The promise:** your agents keep the board up to date while they work. Ideas, bugs, decisions, what is in progress and what is done land on the board as a side effect of the work. You open it and it is current.
>
> **Lines to test:**
>
> - "Everyone loves a good board. Nobody loves keeping it up to date. Now your agents do."
> - "The project board that keeps itself up to date."
> - "Stop being your agent's memory. Stop being your board's secretary."
>
> **How honest it is:**
>
> - Trello's MCP lets an agent edit a board when you ask it to, in a chat.
> - Jira with Rovo can create and update work items through its own agents and automation rules, inside Atlassian.
> - Linear lets you assign issues to coding agents.
>
> None of them is built around the board being kept up to date as a by-product of your own agents' work, from any vendor, with Agent access and an Inbox for what needs your OK. So the claim is "the board maintains itself, whichever assistant you use", not "only we have agents".
>
> Use it on the homepage (hero or the line under it), in the LinkedIn post and on the comparison pages.

### Spec: the Team plan (draft, decisions needed)

> Draft, 11 Oct 2026, from the owner's 11 Oct decisions and the related board items. Team ships after the 18 Oct launch.
>
> ## What is decided
>
> - Team is for any group: internal departments, SMEs, freelance collectives. From 2 seats.
> - Members are not guests. Guests stay invited onto one board through `board_guests`.
> - Members reach every board in the team's space.
> - Where a board lives decides who sees it. A board in a team space is visible to every member. A member's own spaces, such as Personal, stay private. Moving a board into a team space shares it with the team.
>
> This replaces "boards in a team are private by default" (9 Oct). Per-member board roles are not needed in v1; guests keep theirs.
>
> ## Data model
>
> Today a space belongs to one person (`spaces.user_id`), a board belongs to its owner, and `board_access(p_board_id)` returns "owner", a guest role (`view`, `comment`, `edit`) or null. Agent levels live in `agent_settings.default_level` (per user) and `board_agent_settings.level` (per board). The plan comes from `account_plan(p_user_id)` and `effective_plan`. Storage is summed per user (Free 1 GB, Pro 50 GB).
>
> New tables:
>
> - `teams`: id, name, owner_id, max_agent_level (1 to 5), guidance for agents, storage_limit_bytes, created_at.
> - `team_members`: team_id, user_id, role (`owner`, `admin`, `member`), approver (bool), agent_level (null follows the member's own default), joined_at. One row per person per team.
> - `team_invites`: team_id, email, role, token_hash, expires_at, invited_by, accepted_at. Same pattern as `board_guests` invites.
> - `team_subscriptions`: team_id, Stripe customer and subscription, seats, interval, status, current_period_end. Kept apart from the personal `billing_subscriptions`.
>
> Changed:
>
> - `spaces.team_id` (null for a personal space). A space with a team id is a team space. `spaces.user_id` stays as the creator.
> - `board_access()` gets one more branch: if the board's space has a team id and the caller is a member of that team, the answer is `member`. Every RLS policy that already goes through `board_access()` then works for teams. Any policy that checks `boards.user_id` directly must move to `board_access()` first.
> - `account_plan()` returns `team` for a member of a paying team, with levels up to 5.
> - Rename `team_accounts` (the Listspace staff list behind the "official" badge) to `staff_accounts`, so "team" means one thing in the schema.
>
> ## Roles
>
> | Role | Can |
> | --- | --- |
> | Owner (one) | Everything an admin can, plus billing, delete the team, transfer ownership |
> | Admin | Invite and remove members, set roles, set the team maximum level and guidance, set member levels and the approver switch, create and remove team spaces, move boards out of the team |
> | Member | Read and edit every team board, create boards in team spaces, move own boards in, invite free guests to a team board, approve the Inbox if switched on |
>
> An admin cannot remove the owner or another admin's admin role without the owner.
>
> ## Invites, leaving and removal
>
> - Invite by email or by link, as admin or owner. Accepting needs a Listspace account. A new person signs up through the invite, past the waitlist.
> - An invite does not take a seat until accepted. If all seats are used, accepting adds a seat and bills it (see Billing).
> - A person can belong to more than one team. Two freelance collectives are common.
>
> When a member leaves or is removed:
>
> - Boards in team spaces stay with the team. Nothing moves to the member.
> - The member's items, comments and history stay, with the name kept.
> - The member's claims on team items are released, with a history line "released: left the team".
> - Open requests to the member go back to the sender as declined, reason "left the team". Requests the member sent stay open, owned by the board.
> - The member's agent tokens lose access to team boards at once, because access is checked on every call.
> - The member's personal spaces are untouched.
>
> ## Agents and the Inbox
>
> - Every member connects a personal [cut short; open the board for the rest]

### Spec: custom fields (decided 12 Oct)

> Draft, 11 Oct 2026. Based on the item "Custom fields" and the template gallery item. Custom fields let the CRM, sales funnel and hiring templates use real fields instead of "write it in the description".
>
> ## How others do it (from memory, not checked today)
>
> - **Trello:** fields per board, on paid plans. Types: text, number, date, dropdown, checkbox. A field can show on the board tile.
> - **Notion:** every database column is a property. Many types, including formulas and relations. Powerful, but a lot to learn.
> - **Linear:** no general custom fields. It uses fixed fields (priority, estimate, cycle) plus labels, on purpose.
> - **Asana:** fields per project, with a shared library on paid plans. Types: text, number, single select, multi select, date, people, formula.
>
> What Listspace takes from this: Trello's small set and per-board scope, Asana's library as a later step, and Linear's restraint.
>
> ## Field types in v1
>
> 1. **Text:** one line, at most 500 characters.
> 2. **Number:** with an optional format: plain, currency (one currency code per field, such as EUR), or percent.
> 3. **Date:** a date, no time.
> 4. **Choice:** one option from a list, each option with a color. At most 50 options.
> 5. **Checkbox.**
> 6. **URL.**
> 7. **Multi choice.**
> 8. **Email.**
> 9. **Phone.**
> 10. **Person:** the people on the board now (owner and guests), team members once Team ships.
>
> Later: formulas, kept as their own idea "Formulas in custom fields".
>
> ## Per board, not per space
>
> Fields belong to a board in v1. A board is a project, and a CRM board needs other fields than a hiring board. To avoid setting the same fields up twice:
>
> - "Copy fields from another board" in the field settings.
> - Templates carry their fields, and "Use this board" copies them.
> - A field library per space or per team comes later, if people ask.
>
> ## Where fields show
>
> - **Item window:** a "Fields" section under labels and dates. Every field of the board, empty ones as a gray "Add". Edit in place.
> - **Board tile:** the board owner picks up to 3 fields per board to show on tiles. Empty values stay hidden. A choice shows as a small colored pill, a number in its format, a checkbox as a check.
> - **Table view:** each field becomes an optional column, hidden or shown per board, sortable by its type.
> - **Filters:** a filter per field: choice (one or more options), checkbox (yes or no), number (min and max), date (before, after, empty), text and URL (contains, empty).
> - **Calendar feed:** date fields can be included per field, off by default.
> - **Search:** text and URL values join the item's search text, so `search_items` finds them.
>
> ## Agents and the MCP
>
> - `get_item` returns `fields`: an array of `{field_id, name, type, value}`.
> - `get_board` returns the board's field definitions once, and each item's set values by field id.
> - `create_item` and `update_item` take `fields`: an object keyed by field id or by field name. The server checks the type and the choice options and answers in plain words ("Stage has no option 'Won?'. Options: Lead, Call, Offer, Won, Lost").
> - `bulk_set_field` (item_ids, field, value), next to the other bulk tools.
> - `create_field`, `update_field` and `delete_field` for definitions.
>
> | Action | Level |
> | --- | --- |
> | Set a value on an item the agent creates | Same as the create (level 3 in capture lists) |
> | Set or clear a value on an existing item | Same as `update_item` (applies at 4) |
> | Create a field or add a choice option | Board change (applies at 4) |
> | Rename a field | Board change (applies at 4) |
> | Delete a field (removes every value) | Inbox below 5 |
>
> A suggestion in the Inbox shows the field change like any other item change. Undo and history record value changes as item changes.
>
> ## Import from Trello
>
> The Trello import does not read custom fields yet. The Trello JSON export has `customFields` (definitions per board) and `customFieldItems` (values per Trello item).
>
> - Map Trello text, number, date, dropdown and checkbox to the matching Listspace types. D [cut short; open the board for the rest]

### Full feature check, 12 Oct: findings and 10 decisions

> **Note, 12 Oct:** written before two later decisions that day. Guests on Pro are now capped at 5 per board (not 10), and Team is €9.99 per seat (€8.99 a month paid yearly). The Plans item has both as comments.
>
> For the board item "Full feature check" (3c01046e), before the 18 Oct launch. A review only: no code, board or server was changed.
>
> **How it was checked.** Main at f5031a1e. The app ran in the app preview with sample data, in light and dark mode, at desktop width, at iPad landscape (1024x768, touch) and iPad portrait (820x1180, touch), and as a guest in each role. The MCP tools were measured from `mcp.ts` itself. The emails, settings and help were read in the source. Nothing from `docs/communication-audit-2026-10.md` (49 items) is repeated here; it is referred to as "audit #n".
>
> ## Summary: the 10 changes with the most impact
>
> 1. **One place for "what needs me": For you.** Today the same work shows in For you, the Important page, the Unsorted section, each board's Inbox, the Agents window, item tiles and the dashboard. Fold Important into For you, move Unsorted to the top of For you, and show one count everywhere.
> 2. **One place for a board's suggestions.** Every suggestion shows in the Inbox column on the board and again in the Agents window's Inbox tab. Keep the column, move its "Select all" there, and drop the tab.
> 3. **One "what happened" view per board.** Catch up, Activity, "Since you were here" and the item's History are four names for one stream. Make it one "History" view with a short summary at the top, and point the banner to it.
> 4. **Cut the agent tools from 80 to about 60.** Every connected agent loads 80 tools of about 117,000 characters (roughly 29,000 tokens) before it does anything. Merge the checklist, bulk, list group and "list" read tools. The alias system already in `mcp.ts` keeps old names working.
> 5. **Fix the words that mean two things.** "For you" is both a page and a request badge ("For you, by Tue"). "Capture" is an Agent access level, a list kind and a tool that writes to Unsorted. The daily email has three names.
> 6. **Make the daily email about other people and agents.** It counts the user's own edits and lists agent changes twice. A new user can get about nine emails in week one. Guests get the owner's onboarding series.
> 7. **Settings: "Connect your AI" first, developer tools last.** Merge "API and AI assistants" with the connection half of "Agents". Put tokens, webhooks and the hourly limit under "Developers". Move the email switches to "Notifications".
> 8. **Ask for the current password when changing it.** Settings > Security asks for it and then throws it away (`SettingsPage.tsx:168-185`). Anyone at an open session can change the password. This is a fix, not a simplification, but it should ship before launch.
> 9. **The item window's footer is six unlabeled icons.** Tooltips do not exist on an iPad. Give the actions words in a "More" menu, and hide "Ask someone" when nobody else is on the board (always the case on Free).
> 10. **A calmer dashboard.** The same board can show three times (Starred, Recently viewed, Boards in this space), with the same three lists again in the sidebar. Drop Recently viewed from the dashboard, and with it the five-switch "Board display" setting.
>
> ## Findings by area
>
> Ranked within each area by impact for a new user at launch. Verdicts: keep, simplify, merge or remove.
>
> ### A. What needs me: For you, Important, Unsorted, Inbox, Requests, mentions
>
> **A1. Seven surfaces for one question.**
>
> - _Saw:_ A suggestion from Claude to move "Pick up dry cleaning" to Done appears on the For you page (as a row), on the dashboard's For you block, in the board's Inbox column, in the Agents window, and as a count on the Agents button. A request to the user appears in For you ("Waiting for you"), on the item tile ("For you, by Tue"), as a banner in the item window, in the daily email and in its own email.
> - _Why:_ A new user has to learn where to look, and every surface is a place [cut short; open the board for the rest]

### Listspace's values (draft, 12 Oct)

> Jordi on 12 Oct: the key values of the tool are **truth, transparency, easy and clean**, plus a fifth: **in control** (you decide, agents suggest). Decisions v1 makes Listspace the source of truth for your project.
>
> **Proposed sharper set, for Jordi to decide:**
>
> 1. **True:** Listspace knows what is still true. Confirmed decisions, and no stale notes that look equally valid.
> 2. **Transparent:** you see what every agent did, when and why; the price is clear, with no AI fee; you know where your data lives (EU).
> 3. **In control:** you decide, agents suggest. Agent access, the Inbox, and decisions only a person confirms.
> 4. **Simple:** easy and clean as one value. Calm screens, few settings, one place for what needs you.
> 5. **Yours:** your data, your own AI (Claude, ChatGPT or another), export always free, no lock-in.
>
> Use: a test for every feature ("which value does this serve, and does it break one?"), the homepage, the pitch, and agent guidance.

### Decision log: legal, privacy and security (4 to 12 Oct)

> Decisions from the build conversations of 4 to 12 Oct that were not yet on this board. Newest first. Each line gives the date, the decision and, where known, why.
>
> - **12 Oct:** The privacy page explains the cookieless view count on shared boards, and its "Last updated" date moved with it. Why: transparency.
> - **10 Oct (and 4 Oct):** Every change to the terms, privacy or trust texts updates their "Last updated" date (10 Oct). Small additions do not raise the terms version (4 Oct, first for the API lines in PR #32). A version bump happens only with Jordi's OK. Why: a new version makes every user accept the terms again.
> - **6 Oct:** The terms get a section "Notices about unlawful content (UK and EU)": report it with the report button or by email, it is removed quickly, and the uploader is told and can respond. Why: the UK has no DMCA-style register. Hosts are protected under the E-Commerce Regulations 2002 and the DSA.
> - **6 Oct:** Board backgrounds, board avatars and profile pictures stay public at unguessable addresses, and the privacy statement says so. They are covered by the report button on public boards, a removal path and CSAM scanning. Why: illegal content must be catchable.
> - **6 Oct:** Signed file links last 15 minutes in the app and 10 minutes for agents. Why: the app asks for a new link anyway.
> - **6 Oct:** Webhooks go only to port 443. Any other port is refused when the webhook is created, in the form, in the agent tool and in the database.
> - **5 Oct (first 4 Oct):** No Google Analytics. Only cookieless Umami, and only on the public pages (home, terms, privacy, roadmap, docs). Never in the app, on shared boards or during sign-in, and the build fails if it reaches an app page. Why: Google Analytics without consent would need a consent banner under EU rules. This way the privacy policy can say there are no tracking cookies.
> - **4 Oct:** The terms and privacy policy say openly that publicly visible images are CSAM-scanned by Cloudflare and files on private boards are not (PR #19). Why: openness helps legally.
> - **4 Oct:** Liability is capped at USD 50 or the amount the user paid in the last 12 months. Why: usual for a free service. Open: check whether the terms say "the greater of", now that there are paid plans.
> - **4 Oct:** The content license users grant covers only what is needed to run the service. No worldwide license to publish or distribute. Why: the old license was far broader than private boards need.
> - **4 Oct:** Listspace may be used for any legal purpose, including work and commercial use. Illegal content is not allowed. Why: the template clause ruled out using Listspace for work.

### Decision log: positioning, marketing and pricing (4 to 12 Oct)

> Decisions from the build conversations of 4 to 12 Oct that were not yet on this board. Newest first. Each line gives the date, the decision and, where known, why.
>
> - **10 Oct:** In the homepage hero, ChatGPT, Claude, Claude Code and Cursor link to Listspace's own setup guides, as text links only.
> - **7 Oct:** Listspace is for everyone who uses AI (ChatGPT, Claude), including non-technical people. Headlines must speak to both groups. Why: "Stop being your agent's memory" was too technical.
> - **6 Oct:** Live board updates are a headline selling point and the core of the tour video. Why: watching an agent add and move items live is the most visual thing Listspace has.
> - **5 Oct:** The homepage links the live public board as proof. Why: it shows the real work, and unfinished visuals don't matter.
> - **5 Oct:** Prices show in euros by default, with a switch to dollars. Each currency gets its own round price, not a converted amount (never something like $5.22). Euro prices include VAT. Dollar prices exclude sales tax ("+ tax where applicable"). Dollar prices are not built yet.

### Decision log: UX (4 to 12 Oct)

> Decisions from the build conversations of 4 to 12 Oct that were not yet on this board. Newest first. Each line gives the date, the decision and, where known, why.
>
> - **12 Oct:** "Set it up by hand" on Connect your AI is always open, with Claude open and the other six apps folded behind an arrow. Why: the folded section looked weird.
> - **12 Oct:** Items open in read mode. A click on the title or the text switches straight to editing. The item window keeps some breathing space between the comments block and the divider line.
> - **12 Oct:** A For you item set to Done lights up soft green with a check for a moment, then folds away. Why: it used to disappear at once.
> - **12 Oct:** The decision panel takes much less room and does not show the internal key to users. Agents and the API still use the key. Why: only show data that makes sense to the user. The panel changed again later that day (one-click decisions, #241), and the key stays hidden.
> - **12 Oct:** The Important flag sits in the bottom row of the tile, before the date, as a small red flag. The same in For you rows. Why: titles fell out of line.
> - **12 Oct:** On iPad, the item window's unlabeled footer icons go into a labeled More menu, and hover-only list tools move into the list's menu. As built (#227): an always-visible list "..." menu holds five tools, while List type, Sort, Select all and Move to group keep their hover buttons. Why: touch has no hover or tooltips.
> - **12 Oct:** Small board pictures show the board avatar, otherwise the first letter. Nothing else: no background thumbnails or colors.
> - **12 Oct:** For you leaves the left sidebar and stays only as the top-bar button. Why: it appeared twice, and the left menu is about boards.
> - **12 Oct (form from 4 Oct):** Add a group opens the same small form as Add another list, with Cancel, and the list form is only as tall as its fields (4 Oct). Since 12 Oct (#239), Add a group always sits under Add another list on every board, the 6-list rule is dropped, and the list menu keeps New group. Why: Add a group could not be cancelled, and an empty full-height list appeared.
> - **11 Oct:** Public profile and shared board pages get a short footer: Listspace by YHD, Make your own board, Report, Terms, Privacy. On a profile the link reads "Report this page" and opens an email to legal@. On a shared board it reads "Report this board" and opens the report form. Why: the full footer was too much.
> - **11 Oct:** One format for anything active. A list shows its current sort with a check mark in its menu, with no extra line under the list. Why: one format for active things. Side effect: an unsorted list shows the check at "Date added, oldest first".
> - **11 Oct:** Small calls. "Remove end date" instead of "No end date". Recently viewed shows what fits on one line from the last 7 days, up to 12. For you rows highlight on hover and are clickable, and their board names link to the board. A guest invite prefills the email. Has attachments and Has comments filters, with a wider filter button. Previous and next item navigation, with swipe on touch. No grouping of items inside lists. Recently viewed and the filters still need a check against the 12 Oct feature check.
> - **5 Oct:** Hover controls float over the end of the title without reserving space. Delete is not on the item face. It stays in the item window and in select, then delete. Why: select next to delete invites misclicks, and titles wrapped early.
> - **5 Oct:** A flat look with no gradients anywhere. Boards without a photo pick from 10 flat colors. A board with an old gradient shows the nearest color, and its stored value is not overwritten. Why: the gradients looked AI-made.
> - **5 Oct:** Select all on a list is a toggle: a second click clears the selection.
> - **4 Oct:** Full features get their own page: settings, archive, templates, labels, import, the legal pages and the roadmap. Small, focused tasks use a window: the item window (with its own link), Share, Contact and the search pale [cut short; open the board for the rest]

### Decision log: naming and features (4 to 12 Oct)

> Decisions from the build conversations of 4 to 12 Oct that were not yet on this board. Newest first. Each line gives the date, the decision and, where known, why.
>
> - **12 Oct:** The first daily summary email opens with a short introduction to the daily summary. It is sent once.
> - **6 Oct:** Links an agent writes get their preview fetched right away, the same way as attached links. Not for suggestions that wait in the Inbox. Why: a small change.
> - **4 Oct:** The platform is X, never Twitter. The share window says "Share to X". Why: Twitter is now X.

### Listspace launches on Sunday 18 Oct 2026

> Decided by Jordi on 12 Oct 2026. Replaces Monday 19 Oct.
>
> **What:** Listspace launches with Free and Pro, and open sign-up, on Sunday 18 Oct. The full app is finished and tested by then. Payments are live at launch.
>
> **Why:** The 19th is a family day for Jordi.
>
> **Jordi's words:** "deadline is actually the 18th" and "launch on 18 Oct with Free and Pro"

### Boards in a team: Private, Team or Public; anyone in the team can start a board

> Decided by Jordi on 12 Oct 2026. Like Trello's model, in our own words.
>
> **Who sees a board in a team space:**
>
> - **Private:** only the people invited to the board (for example management, or whoever the creator adds).
> - **Team:** everyone in the team.
> - **Public:** anyone with the public link, our existing "build in public" link. In a team this is off by default; only admins can allow it in the team settings, and only admins can then publish a board.
>
> **Who can do what:** anyone in the team can start a new board and invite other team members to it. The setting lives in the board's ⋯ menu, with its value shown.
>
> **Why:** "Public" already means our public link, so it keeps that meaning. "Team" says plainly who sees it (Trello calls this "Workspace").
>
> **Also decided:** paying per seat gets built now as well. Only Jordi (a Listspace admin) can create a team at first, to test it, including seat billing in the Stripe Sandbox.

### Team billing rules, and a discount Jordi can give a team

> Decided by Jordi on 12 Oct 2026.
>
> 1. **Only the team owner manages seats and billing**, as Slack and Notion do by default.
> 2. **Inviting when no seat is free:** the invite screen says "This adds a seat when Sara joins, at most €9.99 today", and the admin's Send is the approval. Nobody is charged without having seen it.
> 3. **Leaving a team:** the person keeps Pro for 7 more days and is asked right away to choose Pro (paid by them) or Free.
> 4. **If pausing a personal Pro does not work in Stripe:** the person's own Pro ends at the end of its period, and the founder discount stays reserved while the seat lasts.
> 5. **A discount on Team that Jordi can give a team,** for example a freelance collective that works with many agencies and shows Listspace to them. Set by a Listspace admin per team: a percentage and how long it lasts.
>
> **Why:** simple billing people know, no surprise charges, nobody loses Pro mid-work, and a way to win collectives that bring in new customers.

### Go-live work happens on Saturday 17 Oct; Sunday 18 Oct stays free (Jordi's son's birthday)

> Decided by Jordi on 13 Oct 2026: "I'd rather prepare and do as much on Saturday as Sunday is the birthday of my son."
>
> **Saturday 17 Oct:** the go-live PR is merged and deployed, and the server steps run: live Stripe keys, open sign-up, the admin switches and the smoke tests.
>
> **Sunday 18 Oct:** stays free. At most a quick look.

### Everything deployed by Saturday evening 17 Oct; on Sunday 18 Oct Jordi only flips the switch; posting starts Monday 19 Oct

> Decided by Jordi on 13 Oct 2026. This replaces the earlier "all go-live work on Saturday".
>
> - **Saturday 17 Oct:** everything merged and deployed, including the go-live PR. The switch is still off.
> - **Sunday 18 Oct:** Jordi flips the switch in the morning or evening: open sign-up, payments live and live Stripe keys. It takes a few minutes, with no deploy.
> - **Monday 19 Oct:** posting and outreach start.
>
> The launch date stays Sunday 18 Oct.
>
> **Also decided:**
>
> - 20 real testers is enough; it doesn't have to be 100.
> - No marketing emails yet. Jordi reaches out to his own contacts personally.

### Decided: a password reset also disconnects all AI apps and revokes all API tokens; a normal password change keeps them

> Decided by Jordi on 14 Oct 2026, after PR #331. (Recorded as a plain item: record_decision came back "declined on the confirm screen" although no confirm window ever showed; that bug is being fixed. Jordi can mark this item as a decision.)
>
> A reset usually means something went wrong, so a stolen session must not leave a working token behind: the forgot-password reset also disconnects every connected AI app and revokes every API token, and the email says so with a link to reconnect. A normal password change in Settings signs out other devices (#331) and keeps the agents.

### Positioning: Listspace is an agent-first platform

> ## Core positioning
>
> **Listspace is an agent-first workspace where humans and AI agents share project context, coordinate work, and maintain continuity across sessions and tools.**
>
> **Category:** Agent-first project management.
>
> **Technical description:** An agent-native project memory and coordination layer.
>
> ## Why agent-first
>
> Listspace is not a conventional human-first project-management application with AI bolted on. Agents are a foundational part of the architecture:
>
> - **Shared project memory:** Different agents can access and maintain the same project context.
> - **Agent-native interface:** MCP lets agents interact directly with project data and actions.
> - **Controlled autonomy:** Five permission levels determine what agents can do independently.
> - **Human oversight:** The Inbox, decisions, and action history keep humans in control.
> - **Agent coordination:** Claims and work states help agents avoid interfering with one another.
>
> Listspace does not need to run its own models or launch autonomous agents to be agent-first. It supplies the durable context, coordination, and permissions for agents people already use.
>
> ## Terminology
>
> - **Agent-first** = product philosophy and primary positioning: designed for agents from the ground up.
> - **Agent-native** = architecture: project data, memory, and workflows directly accessible to agents.
> - **Agentic** = capability: agents can take actions and pursue work under permissions.
> - **Agentic-first** = less precise and risks implying that Listspace runs autonomous agents itself.
>
> ## Messaging guidance
>
> Lead with **agent-first**, use **agent-native** for technical audiences, and use **agentic** when describing what connected agents can do. Avoid leading with 'agentic project management', which may imply Listspace supplies its own autonomous agents.
>
> **Decision rationale:** This positioning reflects the product's actual foundational design, not an AI feature added to an existing human-only project manager. Jordi explicitly endorsed the agent-first description on 14 October 2026.

### Custom fields: build plan (17 Oct), 7 decisions and 3 PRs

> # Custom fields: build plan
>
> This builds on "Spec: custom fields (decided 12 Oct)" and the decision to start in the week of 26 Oct. The points settled on 12 Oct stay as they are.
>
> ## 1. What the user gets
>
> - Your own fields on a board, such as Deal value, Stage, Close date or Candidate email.
> - Ten kinds: text, number (plain, money or percent), date, single choice, multi choice, checkbox, web link, email, phone and person.
> - You fill them in from the item window, right under labels and dates.
> - Up to 3 fields show on the items on the board, so the stage or value shows at a glance.
> - A table view column for each field, with sorting, a total under number columns, and filters on any field.
> - Date fields can go in your calendar feed, and every field goes in exports.
> - Agents read and fill in fields. The CRM, sales funnel and hiring templates come with real fields.
> - Free: 3 fields per board. Pro: no practical limit.
>
> ## 2. Decisions for Jordi
>
> Already settled on 12 Oct:
>
> - Fields belong to a board, with "copy fields from another board".
> - All ten types ship in v1.
> - Free gets 3 fields per board.
> - The board owner picks up to 3 fields for the tile.
> - An agent deleting a field goes to the Inbox below level 5.
> - Formulas come later.
>
> Still open, each with my recommendation:
>
> 1. **An item moves to another board.** A value moves over when the new board has a field with the same name and type. Other values are dropped but kept in the history, and the result names them, for example "Deal value was not moved: Hiring has no such field". Undo brings them back.
> 2. **Copying items.** The same rule as 1.
> 3. **Person field: one person or several?** One. If that guest leaves the board, the value stays and shows as "Former member".
> 4. **Who can manage fields.** Anyone who can edit the board can add or rename a field. Only the owner or a team admin can delete one, the same as for labels.
> 5. **Changing a field's type.** Not allowed in v1: delete the field and make a new one. That keeps bad data out.
> 6. **Templates.** Yes, 3 fields each, so every template also works on Free:
>    - CRM: Stage, Value (EUR), Contact email.
>    - Sales funnel: Stage, Value, Chance (%).
>    - Hiring: Role, Email, Interview date.
> 7. **Where field settings live.** "Fields (3)" in the board's ... menu, plus an "Add field" link at the end of the Fields section in the item window. No toolbar button.
>
> ## 3. Build in 3 PRs
>
> ### PR 1: data, item window, agents (large, about 7 to 9 hours)
>
> **Database**, new tables and functions only:
>
> - `board_fields`: one row per field, holding its name, type, choices or number format, position, whether it shows on the tile, and whether it goes in the calendar.
> - `item_field_values`: one value per item and field.
> - A trigger checks that the value fits its type and that the field and the item are on the same board.
> - Access follows the labels pattern, for the owner, guests and team members.
> - The database enforces the Free limit of 3, so the app, agents, import and templates all keep to it.
> - Every value change goes in the history and can be undone.
> - The move rule from decision 1 ships here.
>
> **Agents and API:**
>
> - `get_item` and `get_board` return the fields.
> - `create_item` and `update_item` take `fields`.
> - New tools: `create_field`, `update_field`, `delete_field` and `bulk_set_field`, plus the matching REST endpoints.
>
> **App:** a Fields section in the item window and a Fields dialog in the board menu. At the Free limit, "Add field" shows Pro.
>
> **Tests:** access for every role, the limit, the types, history and undo, the move rule, and the agent tools.
>
> ### PR 2: showing and using fields (medium to large, about 6 to 8 hours)
>
> - Up to 3 fields on the tile.
> - Board load: one query for the board's values, with live updates.
> - Table view: a column per field, sorting, and a total under number columns.
> - Filters on fields.
> - Date fields in the calendar view and the calendar feed.
> - Text values in search.
> - Fields in every export (CSV, JSON, markdown, [cut short; open the board for the rest]

## Decisions

### A board belongs to exactly one space, and agent access is set per account and per board, not per space

> Decided 6 Oct 2026.

### Free stays generous; Pro is worth paying for through collaboration, more AI freedom, full memory and developer tools

> Decided 16 Oct 2026. As on the pricing page:
>
> - **Free:** agent access up to level 4 (Act), 1 guest per board (view or comment), 1 GB, the last 30 days of history, API tokens.
> - **Pro:** level 5 (Full), up to 5 guests per board with any role, 50 GB, all history, webhooks and email to a board.

### Every new account gets 14 days of Pro, with no card needed

> Decided 16 Oct 2026. Like Trello, Asana, Notion and Linear: a trial of the paid plan without a card. One trial per account, with reminder emails before it ends. After it ends the account is on Free and nothing is deleted.

### Marking an item done takes one click and moves it to the board's Done list

> Decided 14 Oct 2026.
>
> - **Mark done** sits in the item footer next to Archive and Mark important.
> - It marks the due date done and moves the item to the board's Done list when the board has one. With no Done list, only the date is marked done.
> - Right after, the button reads **Mark not done** and moves the item back to the list it came from.
> - In the table view the Done cell is a checkbox with the same rule.

### Use cases stay one link to the /use-cases page, not tabs on the homepage

> Decided 20 Oct 2026.

### Step-by-step guides live in the app's Help menu under Docs, and only there

> Decided 20 Oct 2026.

### Your AI can't confirm a decision on its own: the confirm screen in your AI app stays, because there you click yes yourself

> Decided 21 Oct 2026, during a review of what the site and help promise against what the app does. The copy now reads "Your AI can't confirm a decision on its own".

### When your AI sends a request to another person in your name, it always waits in your Inbox first, at every agent access level

> Decided 21 Oct 2026, during a review of what the site and help promise against what the app does.

### Decision: a guest's AI follows the guest's own plan

> Decided 12 Oct by Jordi, updated 16 Oct for the new Free plan (proposed as a decision, waiting in the Inbox).
>
> A guest's AI follows the guest's own plan, and never gets more than the owner allows on that board.
>
> - **Free guest who never chose a level:** their AI gets level 4 (Act).
> - **Paying guest:** their AI starts at the level the owner set for that board. The guest can lower it.
> - **Both are capped** by the owner's level for that board and by the guest's role (view, comment or edit), whatever the guest's plan.
>
> **Why:** the owner decides how much freedom agents get on their own board. Since 16 Oct, Free includes level 4, so a Free guest gets the same as any Free account.
>
> Before 16 Oct: a Free guest got level 3 at most, and 3 by default.

### Confirm all decisions in one click

> Decided by Jordi on 12 Oct 2026 ("yes to confirm all").
>
> **What:** when several decisions wait for confirmation, the Inbox offers "Confirm all" next to confirming them one by one. It is still a person confirming, so the rule that only a person confirms a decision holds.
>
> **Why:** an agent that captures decisions well can propose many at once, and confirming each in a separate click is tedious. One click for a batch keeps it easy.

### Agents capture decisions by default, and a check catches what slips

> Decided by Jordi on 12 Oct 2026 ("yes build it").
>
> **What:** keeping track of decisions must not depend on an agent remembering to.
>
> - The server instructions and the decision tool tell every agent, in plain words with examples: when the user picks an option, says yes to a proposal or corrects a fact, record it right away. It arrives as Proposed, and only a person confirms.
> - The end-of-session summary asks for the decisions made in that session. Any that were not recorded go to the Inbox for the user to confirm.
> - The Listspace plugin for Claude Code adds a check at the end of each turn that sends the agent back when a decision was missed.
>
> **Why:** remembering decisions is what Listspace promises. On 12 Oct it turned out that the agent building Listspace had left a week of decisions in the chat instead of on the board. If our own agent slips, every user's agent will.

### Confirm decisions without opening Listspace: in the AI app itself, and from the daily email

> Decided by Jordi on 12 Oct 2026 ("build 1, and 3").
>
> **What:** people who mostly work through their AI can confirm decisions without opening the Listspace app.
>
> 1. **In the AI app itself:** Listspace asks the person directly through the AI app's own confirm screen (MCP elicitation), where the app supports it. The AI cannot answer it for the person, so "only a person confirms" still holds.
> 2. **In the daily summary email:** Confirm buttons next to each decision that waits.
>
> **Not:** a one-tap confirm link in the chat. It opens a new browser tab every time.
> **Later, only if users ask:** an opt-in "my AI may confirm what I say yes to in chat", marked "Confirmed in chat".
>
> **Why:** with an AI-first user, the app is rarely open, so decisions would wait forever. The confirmation must still come from the person, not from the AI's word.

### Agents tell the user what waits in the Inbox, with a link; Listspace speaks the newest MCP version next to the old one

> Decided by Jordi on 12 Oct 2026 ("yes to all 3").
>
> **What:**
>
> 1. **Confirm buttons in the daily summary email** for decisions that wait.
> 2. **The newest MCP protocol version (2026-07-28) next to the old one,** so apps that already speak it get it and all others keep working unchanged. With it, Listspace asks Claude Code users to confirm a decision in Claude Code's own confirm screen. Shown on the board as "Confirmed in Claude Code", since the AI app reports the answer. Tested in Claude Code, Claude.ai, ChatGPT and Cursor before it goes live.
> 3. **At the start of a session, the agent tells the user what waits in the Inbox,** with a link to it. Agents never accept or confirm for the user.
>
> **Why:** people who mostly work through their AI should not have to remember to open Listspace to find what waits, and the confirmation must still come from the person.

### The Inbox stays the board's first list; a popup points to it when it is out of view

> Decided by Jordi on 12 Oct 2026. Replaces "A board's Inbox is a bar under the header" (confirmed earlier that day) and the popup-only idea.
>
> **What:**
>
> - The Inbox stays the first list on the board, as it is now. No panel from the right: the app has one panel, on the left.
> - When you arrive on a board and the Inbox is not in view (because the board opens where you left it), the existing popup in the bottom right says what waits ("Claude suggested 3 changes"). A click on it scrolls to the Inbox.
> - Once the Inbox is in view, the popup goes away.
> - The popup uses the Inbox color; other popups such as "Saved" keep their look.
> - The gap between the Inbox and the first list is the same as between all other lists.
>
> **Why:** the board opens where you left it, so the Inbox on the far left can be out of view and fill up unnoticed. The popup reuses what the app already has and keeps the Inbox in one place.

### Listspace has a flat look, with no gradients anywhere

> Decided by Jordi on 5 Oct 2026.
>
> **What:** No gradients anywhere. Boards without a photo pick from 10 flat colors. A board that had a gradient shows the nearest flat color, and its stored value is not overwritten.
>
> **Why:** The gradients looked AI-made.
>
> **Jordi's words:** "drop the gradients. we go with the flat look", and "2. ok" to the 10 flat colors.

### No Google Analytics: only cookieless Umami, and only on public pages

> Decided by Jordi on 4 Oct 2026, narrowed on 5 Oct.
>
> **What:** No Google Analytics. Only cookieless Umami, and only on the public pages (home, terms, privacy, roadmap, docs). Never in the app, on shared boards or during sign-in. The build fails if Umami reaches an app page. So the privacy policy can say Listspace uses no tracking cookies and needs no consent banner.
>
> **Why:** Google Analytics without consent would need a consent banner under EU rules.
>
> **Jordi's words:** "yes, remove google analytics" (4 Oct) and "umami should only work on the public pages" (5 Oct).

### Listspace is for everyone who uses AI, including non-technical people

> Decided by Jordi on 7 Oct 2026.
>
> **What:** Listspace speaks to everyone who uses AI, such as ChatGPT and Claude, including people who are not technical. Not only people who work with coding agents. Headlines and copy must speak to both groups.
>
> **Why:** "Stop being your agent's memory" was too technical.
>
> **Jordi's words:** "we need a text that speaks to both groups"

### The homepage headline is "Your AI forgets. Listspace remembers."

> Decided by Jordi on 11 Oct 2026. Replaces "Stop re-explaining your project to AI." as the headline (7 Oct), which becomes the subtitle.
>
> **What:**
>
> - Headline and tagline: "Your AI forgets. Listspace remembers."
> - Subtitle: "Stop re-explaining your project to AI."
> - Subline: "Let your AI do the boring project work. You focus on making it a success."
> - Closing section: "Ready to stop re-explaining your project?"
> - "Stop being your agent's memory" is no longer used.
>
> **Why:** It is the strongest line, especially with several people on a board.
>
> **Jordi's words:** "shouldn't this be the main message? Your AI forgets. Listspace remembers."

### Prices show in euros by default, with a switch to round dollar prices

> Decided by Jordi on 5 Oct 2026.
>
> **What:** Prices show in euros by default, with a switch to dollars. Each currency gets its own fixed, round price, not a converted amount (never something like $5.22). Euro prices include VAT. Dollar prices exclude sales tax ("+ tax where applicable"). Dollar prices are not built yet.
>
> **Jordi's words:** "price should show in euro, but dollar should be selected too. but round it, so not 5,22 in dollars for instance"

### The founder offer is 50% off for as long as you keep Pro, not "for life"

> Decided by Jordi on 12 Oct 2026.
>
> **What:** Founding members get 50% off Pro for as long as they keep Pro. Never write "for life". Founders who cancel, pause or downgrade are told they will lose the discount.
>
> **Why:** "For life" would mean a founder can cancel, come back later and still have it.
>
> **Jordi's words:** "50% of as long as you keep Pro. for life means they can cancel and come back and still have it"

### Listspace presents itself as European: a Dutch company with data in the EU, never a country

> Decided by Jordi on 12 Oct 2026.
>
> **What:** Listspace is made by a Dutch company, and boards and files are stored in the EU. Copy always says "in the EU", never a country. A country name appears only in legal lists. No other location appears in Listspace copy.
>
> **Why:** Different locations in the copy contradicted each other.
>
> **Jordi's words:** "ideally we keep everything within europe", and he agreed to "always in the EU, never a country".

### The platform is X, never Twitter

> Decided by Jordi on 4 Oct 2026.
>
> **What:** Copy and buttons say X, never Twitter. The share window says "Share to X".
>
> **Why:** Twitter is now X.
>
> **Jordi's words:** "the share modal says Twitter, should be X now"

### "Agent access" is the only name for what an agent may change, never "freedom level"

> Decided by Jordi on 12 Oct 2026.
>
> **What:** "Agent access" is the one name everywhere, in the app and in all copy. Never write "freedom level". The level names stay Read only, Suggest, Capture, Act and Full.
>
> **Jordi's words:** "agent access over freedom level"

### A team seat gives Pro everywhere; on removal the person chooses Pro or Free

> Decided by Jordi on 12 Oct 2026.
>
> - **Everyone on a team has Pro**, on the team's boards and in their own Personal space, for as long as the team owner pays for their seat.
> - **Already paying for Pro yourself?** When you join, Listspace offers to pause your own Pro, so you do not pay twice.
> - **When you leave or are removed from the team,** you choose: continue with Pro (paid by you) or switch to Free. You get an email, and the choice also shows when you next sign in.
> - **Guests on a team board:** up to 10 per board (Pro boards: 5).
>
> **Why:** one plan to think about, like Slack and Notion; nobody pays twice, and nobody silently loses Pro features when a seat ends.

### Team v1: guests, seats, invites, storage and several teams

> Decided by Jordi on 12 Oct 2026, answering the open questions in "Spec: the Team plan".
>
> - **Guests on team boards:** free, not counted as seats, view and comment only, with a maximum number of guests per board.
> - **Removing a seat:** the bill drops at the next renewal, no refund.
> - **Who invites members:** the owner and admins only, in the first version.
> - **Storage:** 50 GB per seat, shared by the whole team.
> - **Several teams per person:** allowed (for example two freelance collectives).
>
> Already decided earlier on 12 Oct: Team costs €9.99 per seat a month, €8.99 paid yearly, from 2 seats. Still open: the guest maximum per team board, private spaces inside a team, and whether a seat also covers the member's own spaces.

### One "Accept all" in the Inbox; its confirm step lists the decisions it confirms

> Decided by Jordi on 12 Oct 2026 (option A).
>
> **What:** when suggestions and decisions both wait in a board's Inbox, there is one button, "Accept all (N)". Its confirm step lists what will happen and names the decisions it confirms ("This also confirms 2 decisions: ..."). It replaces the two buttons "Confirm all" and "Accept others", which did not fit on one line in the Inbox column. Single decisions can still be confirmed one by one.
>
> **Why:** one click, one place for the same action, and the confirm step keeps it clear that decisions are being confirmed by a person.

### Decisions can be switched off per board, with the default set by the template

> Decided by Jordi on 12 Oct 2026: "this way the user has freedom. sometimes a board doesn't need any extra decision layer, sometimes yes."
>
> **What:**
>
> - Each board has a Decisions setting in the board's ⋯ menu, showing its value ("Decisions: On").
> - The default comes from the template: on for project boards (client project, code project, legal matter, my business), off for personal ones (groceries, personal tasks).
> - When it is off, agents just update the board and never ask to confirm a decision. Decisions already on the board stay visible.
> - An account default for new boards in Settings > Agents.
>
> **Why:** decisions help on project boards (an agreed price, a chosen date), but on a grocery list they are noise. Since agents now record decisions without being asked, a board that does not need them must be able to say so.

### Each team pays its own seats; freelancers can also work together as guests on Pro boards

> Decided by Jordi on 12 Oct 2026.
>
> - **Seats are per team, per person** (like Slack and Notion). Someone in two teams has a seat in each, paid by each team for its own boards. A seat never opens another team's boards.
> - **A member's own Pro pauses** while they have a seat, so nobody pays twice. Pro in the person's own space needs only one seat.
> - **No team made of people who each pay their own Pro** while the team pays nothing.
> - **Freelancers who each have Pro can already work together without a team:** they invite each other as guests with Edit, up to 5 per board. A real team (one shared space, roles, shared Inbox approval) costs €9.99 per seat.
> - **The help and the pricing page say this** for small collectives.
>
> **Why:** simple, fair billing that matches what people know, and a free answer for loose collaboration.

### Team is 2 to 50 seats; above 50, companies get in touch

> Decided by Jordi on 12 Oct 2026.
>
> - **Team: 2 to 50 seats,** self-service, card payment, the owner manages seats.
> - **More than 50:** the seat screen says "More than 50 people? Contact us" (hello@listspace.app). That conversation is the start of Business (company sign-in, verified domain, audit log, invoice payment).
> - **The server grows with the customers:** we start small, and before accepting businesses the server moves up to a much larger one.
>
> **Why:** big companies need what Business adds, and the 12 Oct load test (fine at about 200 active users and 50 agents, breaking at 350 to 450) shows one large company could take a big share of today's server.

### During the Team beta, a Listspace admin gives people access to start a team, without joining it

> Decided by Jordi on 12 Oct 2026.
>
> - A Listspace admin gives an account beta access in Admin ("May start a team").
> - That person starts the team and becomes its owner, with billing in their own name.
> - The Listspace admin is not a member of that team and does not see its boards. Admin sees only what it needs to support the beta: the team's name, owner, seats and billing status.
>
> **Why:** a company's boards are its own; Listspace staff should not be inside customer teams.

### No cheaper tier for people without AI for now; measure it after launch

> Decided by Jordi on 12 Oct 2026.
>
> **What:** no cheaper plan for people who do not connect an AI, for now. After launch the admin dashboard shows two numbers to decide on later:
>
> 1. How many Pro buyers never connected an AI.
> 2. How often a Free user who never connected an AI hits a Pro limit (for example "guests need Pro").
>
> **Why:** Listspace has no AI costs, so a cheaper tier saves nothing; Free already serves people without AI; a cheaper tier would pull AI users down from Pro; and Listspace's story is the memory your AI shares. Lowering a price later is easy, raising it is hard.

### Team stays a beta: only Jordi and people he invites can start a team

> Decided by Jordi on 12 Oct 2026.
>
> - **Team is a beta** until Jordi has tested it properly, including paying per seat.
> - **Who can start a team:** Listspace admins (Jordi), plus accounts Jordi gives beta access to from Admin. Members those teams invite join as usual.
> - **The public site does not sell Team** until it opens: the pricing page keeps "not available yet", and there is no "Start a team" for anyone without beta access.
>
> **Why:** Team touches who sees which board and how money is taken, so it opens to everyone only after real use.

### A click on "See Pro" or "Upgrade to Pro" counts as hitting a Pro limit

> Decided by Jordi on 12 Oct 2026, for the admin "AI use" numbers.
>
> For guests and Agent access levels 4 and 5, Free never lets a person try, so a click on "See Pro" or "Upgrade to Pro" at those spots counts as hitting the limit. Storage counts a real refused upload. History counts reaching the end of a board's History on Free.
>
> **Why:** the click is exactly the signal: someone wanted a Pro feature.

### Board icons: star first, then the globe, everywhere

> Decided by Jordi on 12 Oct 2026.
>
> Where a board shows both icons, the star (starred) comes first and the globe (public) after it: in the left panel, the same order as in the board header left of the title. In the left panel the icons line up in one column on the right.
>
> **Why:** one order everywhere, so the icons read the same in every place.

### An agent can't create an account on its own: a person always reads the 6-digit code from the email to the agent

> Decided by Jordi on 12 Oct 2026 (PR #262).
>
> create_account always answers "code sent", for new and existing addresses alike. The email has a 6-digit start code, and the agent exchanges it for its token with confirm_account. An address that already has an account gets a "someone tried to sign up" email with no code.
>
> **Why:** a real person is always involved in creating an account, and nobody can find out from create_account whether an address has an account.

### Claude Code's confirm screen confirms decisions as is; an On/Off setting for it only comes if someone asks

> Decided by Jordi on 12 Oct 2026 (PR #259).
>
> Only apps signed in with OAuth get the confirm screen, at Agent access Capture or higher. Listspace trusts the app to report the user's Accept. In theory, an agent with a shell could read Claude Code's stored login and send an Accept itself.
>
> **Why accepted:**
>
> - The damage is small. A decision's status can be changed back, and it shows "confirmed in Claude Code".
> - The same login already lets the agent change items up to its access level.
> - A "Confirm in AI apps: On/Off" setting in the Agent access menu can come later if a user asks for it.

### The brand page offers the current light (logo in the middle) and dark (logo bottom right) backgrounds for now; better matching ones come later

> Decided by Jordi on 13 Oct 2026 (PR #267): "let's start with these two backgrounds. they are not perfect yet, we will make new ones later". The light one is the app's default board background. The dark one is listspace-board-background.png from 6 Oct.

### Team members get roles: view, comment or edit

> Decided by Jordi on 13 Oct 2026: "teams need roles indeed". The pricing page already promises Team "roles to view, comment or edit". Team v1 (PR #264) gives every member full edit rights, so the roles are built on top of Team v1. They also serve schools, for example students who may only comment on a teacher's board.

### Schools and Business are client types next to Team, set up by Jordi through contact, proposal, contract and invoice, not online

> Decided by Jordi on 13 Oct 2026.
>
> **The plans:**
>
> - Team stays self-serve, with 2 to 50 seats.
> - Schools and Business are separate client types. They get in touch, and Jordi helps set everything up, then sends a proposal, a contract and an invoice.
>
> **Schools:**
>
> - Start with small independent language schools, then secondary schools and up (after primary). Larger schools may ask for SOC 2.
> - File uploads matter most to schools. Agents are a nice extra.
> - Teachers invite students from a list (Excel or CSV).
>
> **First pilot:**
>
> - Students 16 or older only. Going younger needs legal advice.
> - The data agreement can start from our DPA.
> - Removing a student must never send the "continue with Pro or go to Free" email.
>
> **Why:** with 50 seats, Team doesn't fit a school, and organisations need a contract and an invoice anyway.

### The Inbox's third action on a decision is called "Not a decision"

> Decided by Jordi on 13 Oct 2026. The text link under Confirm and Reject keeps the item without the decision mark and tells the agent it was not a decision. It shows on decisions only, in the shared style for a less important action.

### Guests can be anyone: copy never limits them to "a client or freelancer"

> Decided by Jordi on 13 Oct 2026: "client or freelancer is limiting". On a personal board, a guest could be your partner, mother or neighbour. For a student, it could be a fellow student. This applies to the share window, pricing, roadmap and help copy.

### An item in a Done list reads as done everywhere: app views, agent due list, calendar feed, public board and the item's tick

> Decided by Jordi on 13 Oct 2026 (PR #266). Being in a done-type list counts as done. That applies to the Table, Calendar, item badges, the agent's due list, the iCal feed, the public board and the item window's tick.
>
> Nothing copies it into the stored tick, so no live rows change and the daily summary doesn't count a finish twice.

### Item view without boxes: plain description, one "Attached" section for links and files, light section headings with counts

> Decided by Jordi on 13 Oct 2026.
>
> **Layout:**
>
> - No boxed content blocks. The description is plain text under the title.
> - Links and files share one "Attached" section, as the same compact rows, with no double "Files / Files (1)" heading.
> - A link with a generic preview shows its address.
> - Section headings are small and grey with a count, like the list headers. The spacing between sections is the same everywhere, with thin dividers.
>
> **Comments in the same view:**
>
> - Documents also show the general comment thread in the view.
> - An unsent comment is kept as a draft per item and marked "Not sent yet".
> - A mention or comment link opens the item's view, scrolls to that comment and highlights it.
> - The Edit > Comments tab stays.
>
> **Why:** the boxes didn't match the rest of the app, the spacing between sections was uneven, and comments are used often, so they belong in the view.

### Comments show in an item's view and stay in the Edit > Comments tab too

> Decided by Jordi on 13 Oct 2026 (PR #265).
>
> The view has the comment thread with an "Add a comment" box, so commenting takes one click. The Edit > Comments tab stays, on the same thread. Only one comment box is ever on screen.
>
> An unsent comment is kept as a draft per item, and the box shows that it is not sent yet.

### Share window: guests and the public link in sight, rare link settings behind one "Link settings" fold that shows their current values

> Decided by Jordi on 13 Oct 2026: "let's see how this looks, we can always change it".
>
> **Guests:**
>
> - The invite row is email, role and Invite.
> - "Access until" and Remove go in each guest's ⋯ menu.
> - The extra hint lines go.
> - The text becomes "Invite someone to just this board", not "a client or freelancer", because a guest can be anyone.
>
> **Public link:**
>
> - The switch, the link, Copy and the view count stay in sight.
> - "Link settings" folds open to: password, show comments, show images (plus Update images), the badge, change link name and get a new code link. When it's closed, it shows the current values in one line.
> - The "What visitors see" text moves behind an ⓘ.
>
> **Why:** the window had about 20 visible controls. Jordi's UX rule says frequent things go in plain sight and rare ones in a menu that shows their value.

### Decisions are Off by default for new accounts; one switch in Settings > Preferences with an explanation; when Off, an agent's decision becomes a normal item

> Decided by Jordi on 13 Oct 2026. This replaces "defaults by template" from #263.
>
> 1. New accounts start with decisions Off. Templates no longer turn them On, so the account setting is the one rule for new boards.
> 2. The setting moves from Settings > Agents to Settings > Preferences, with a clear explanation. It also says what you miss when it's Off: agents don't learn what still holds, why, or what replaced what.
> 3. When decisions are Off, an agent's record_decision becomes a normal item (nothing lost), and the agent is told, instead of a refusal.
> 4. The per-board switch in the ⋯ menu stays.
> 5. Existing accounts and boards keep their current setting. No live data change.
>
> **Why:** most people find decisions confusing at first, and the feature should be easy to find and turn on.

### Item read view details: old comment links open the view's comments, "On the text (N)" for passage comments, comments keep their light card

> Decided by Jordi on 13 Oct 2026 (PR #270).
>
> **Changes:**
>
> 1. Old ?tab=comments links open the read view's comments too.
> 2. On a narrow window, a document's passage-comments button is called "On the text (N)".
>
> **Accepted as they are:**
>
> - Link preview images, book details and the large image grid show only in Edit.
> - A link in the description also shows as a row under Attached.
> - Labels show as pills with no heading.
> - Comments keep their light grey card within the thread, which helps tell people apart.

### Teams, schools and businesses can switch AI agents off completely ("AI agents: Off"); no agent can reach their boards

> Decided by Jordi on 13 Oct 2026. A new lowest setting below Read only for a team, school or business account. When it's on, no agent connection of any member can read or change that team's boards, whatever level the member chose.
>
> **Why:** schools with minors, and organisations that don't want AI on their data. Listspace itself works fine without agents.
>
> It's on the Team follow-ups after Team v1.

### Credit Constance and the Continuity SDK as the origin of Listspace's decision layer: in the decisions help article and on About, not in the app's screens

> Decided by Jordi on 13 Oct 2026.
>
> **Wording, true to the facts:** Listspace's decisions follow Constance (trustconstance.com), the model by Yellow House Digital, whose one rule is that no claim becomes truth without a decision a person owns. They are based on the ideas of Yellow House Digital's Continuity SDK. Listspace doesn't use the SDK's code: the SDK is Node with SQLite, and Listspace runs on Postgres. The SDK repo is private, so it isn't linked.
>
> **Where:** a short "Where this comes from" paragraph at the end of the decisions help article, and one sentence on the About or "How it works" page.

### Agents keep the board up to date without being asked: server reminders on claimed items, a progress check in Claude Code, a connect-guide line and one more instruction sentence

> Decided by Jordi on 13 Oct 2026: "this should be for every user".
>
> 1. **Server reminders, for every app.** Listspace answers carry a short note about items the agent claimed and hasn't moved, for example "You are still working on X (2 hours). Move it to Done with a comment when it's finished."
> 2. **Claude Code plugin.** An end-of-turn progress check next to the decisions check. When the turn changed files, made a commit or ran a deploy with no Listspace write since the last check, it nudges once.
> 3. **Connect guide.** An optional line for a project's CLAUDE.md or AGENTS.md: "Keep this project's Listspace board up to date as you work."
> 4. **Server instructions.** One more sentence: when work is tracked elsewhere (a pull request, a deploy), still move the matching item and comment.
>
> **Why:** the instructions are read at the start of a session and fade during long work. On 12 and 13 Oct, Claude Code recorded the decisions but didn't move shipped work until Jordi asked.

### Only the team owner can move a board out of a team; a member moving a public board into a team is warned that the public link turns off

> Decided by Jordi on 13 Oct 2026 (PR #264).
>
> - **Moving out:** only the team owner can move a board out of the team back to a personal space. Admins and members can't. This protects the team's work when someone leaves.
> - **Moving in:** when a plain member moves a board with a public link into the team, the link turns off, because only admins share team boards. The member sees a warning before the move, and an agent's move result says so.

### create_list takes an optional place (before or after a given list), so an agent puts a new list where it belongs in one step

> Decided by Jordi on 13 Oct 2026. Today a new list always lands at the end of the board, and moving it takes a second call with its own Inbox step. The change adds optional before_list_id or after_list_id to create_list (API and MCP), like move_item's before_item_id. It is part of the board-upkeep PR.

### The main headline is "Your AI forgets. Listspace remembers."

> Decided by Jordi on 13 Oct 2026. "Stop being your agent's memory" (an earlier candidate in the use cases item) is not the headline. The subline "Stop re-explaining your project to AI." stays.

### Team boards are team-wide by default and can be set to Private (only the people on it) when created; team roles must exist before anyone uses Team

> Decided by Jordi on 13 Oct 2026 (PR #264).
>
> **Visibility:** a new team board is team-wide by default, and can be made Private when it's created. Private means private within the team: only the people on that board. This replaces the 9 Oct idea of "private by default".
>
> **Roles:** members need roles (view, comment, edit) before Team is used by any customer. Team v1 can merge without them because Team stays closed, but the roles PR comes before the first team.

### Team rules: a suspended owner locks guests out (with a notice), no grace period after removal, a new team's maximum Agent access is 4 (Act) with a note to the admin

> Decided by Jordi on 13 Oct 2026 (PR #264, contract section 5).
>
> 1. **Suspended owner:** guests on the team's boards are locked out too. They see a clear notice when they try to open the board.
> 2. **No grace period** after someone is removed from a team or a board. Access stops at once, because the removal can be on purpose.
> 3. **New teams start at Agent access level 4 (Act).** Admin settings show a note that completing, archiving and moving to Done wait in the Inbox at this level, and that the admin can raise it to 5.

### On touch screens, item tiles show no hover buttons: the important flag shows once, select with a long press or "Select items"

> Decided by Jordi on 13 Oct 2026, from an iPad screenshot where the flag showed twice and the checkbox showed all the time.
>
> - On touch devices (no hover), the hover buttons (flag, labels, select) are hidden.
> - The important flag shows once, as the state.
> - Select with a long press, or "Select items" in the board menu.
> - Change the flag and labels in the item itself.
> - Desktop stays as it is.

### Messaging: AI apps do remember, but per app, unseen and without knowing what still holds; that is where Listspace differs

> Decided by Jordi on 13 Oct 2026: "we have to be super clear. the first thing people do when reading our posts is question us."
>
> **Never say:** "every new chat starts from zero". Claude and ChatGPT have Projects and memory.
>
> **What is true:**
>
> 1. That memory lives inside one app, so Claude doesn't know what you told ChatGPT or what your coding agent did.
> 2. You can't see or correct what it keeps.
> 3. It doesn't know what still holds and what was replaced.
>
> The headline "Your AI forgets. Listspace remembers." stays.
>
> **Also decided the same day:**
>
> - The level 5 text is "Agents change anything they can, including completing and archiving. They never delete anything, and every change is logged."
> - Comparison pages come out clearly positive for Listspace and stay factually true.
> - The welcome email says plainly that Listspace works without connecting an AI.

### The contact form gets Cloudflare Turnstile, and anonymous direct inserts into contact submissions are closed

> Decided by Jordi on 13 Oct 2026. "Get in touch" and the contact form get Turnstile, like sign-up and password reset. The server checks the token. The direct anonymous insert into contact_submissions through the database API is closed, so all contact messages go through the protected function with its rate limit.

### No hard launch deadline: Listspace goes live when Jordi has tested everything by hand (1 to 2 days), not before

> Decided by Jordi on 13 Oct 2026: "if that means we will not go live on sunday, that's ok. there is no hard deadline. it's my project and i decide when it's going live."
>
> - Jordi first tests the whole application by hand, which takes about 1 to 2 days. That includes Team, using the updated test scenarios.
> - The go-live PRs (#285 and #286) wait until Jordi picks the day.
> - This replaces the fixed Saturday deploy and Sunday switch from earlier today.

### On /pricing, the Team card's "Get in touch" and "Join the Team waitlist" open a modal, like Contact

> Decided by Jordi on 13 Oct 2026.
>
> - "Get in touch" (more than 50 seats) opens the contact modal, instead of a mailto link.
> - "Join the Team waitlist" opens the waitlist form in a modal.
> - One modal at a time, keyboard accessible, and it works on a phone.

### Team roles details; a Listspace company page on LinkedIn; a Suggest role with reject-with-comment and send-back after launch

> Decided by Jordi on 13 Oct 2026 (PR #284).
>
> **Team roles:**
>
> 1. On a Private board, the board's maker can raise or lower a member's role.
> 2. A Commenter's agent comments directly.
> 3. Commenters and Viewers can't export, like guests.
> 4. The Share button is hidden for Viewers and Commenters.
> 5. For you must not show edit controls to a team Viewer.
> 6. Texts that say "guest" where a team member is meant get fixed.
>
> **LinkedIn:** a Listspace company page carries the product posts and the weekly Build in Public update. Jordi's own profile carries the personal posts.
>
> **Review workflow:** the Suggest role, reject with a comment and send back are on After Launch. People who suggest don't see the Inbox.

### AI first in onboarding and messaging: connect your AI is step 1; "also works without an AI" closes; testers get 1 month; Listspace posts from Jordi's own and new Listspace accounts

> Decided by Jordi on 13 Oct 2026.
>
> - **The main USP is AI agent first.** The welcome email and the first steps start with connecting your AI. "Listspace also works fine on its own" closes the email. Without an AI is the option; with an AI is not optional. The checklist still completes without an AI, so nobody is blocked.
> - **The memory message gets one more true point:** ChatGPT's and Claude's own project memory is messy. It's hard to get an overview, and project documents are one basket of files. Listspace gives structure: lists, items, status, decisions.
> - **Testers get 1 month of free Pro** instead of 3.
> - **Accounts:** posts go out from Jordi's own X and LinkedIn and from new Listspace accounts. A new X account needs warming up so it isn't flagged as spam.
> - **Gemini and Grok** stay on the home page. Jordi tests them.
> - **The delete sentence** "Agents never delete your items, lists, boards, comments or files" is confirmed.

### Listspace gets its own Content Bible v1 and Post Blueprint v1: YHD's honesty and voice, plus a sales and marketing part

> Decided by Jordi on 13 Oct 2026. The YHD Content Bible and Blueprint are built for trust in Jordi as an expert and avoid selling. Listspace is a product and needs clearer, more assertive communication with a call to action.
>
> The new documents (v1, on the private Ops board under Project Resources) keep:
>
> - the honesty and specificity rules
> - Jordi's voice
> - the lessons on structure
>
> They add:
>
> - the one promise
> - proof rules
> - calls to action
> - tone per channel
> - the launch rhythm
> - comparisons
> - the tester campaign

### No lock screen on deploys but a "new version, reload" popup; an admin maintenance switch usable from a phone, with an announcement bar ahead of time

> Decided by Jordi on 13 Oct 2026.
>
> 1. **Deploys** show no lock screen. When a new version is live, people see "A new version of Listspace is ready" with a Reload button.
> 2. **Maintenance mode** is in Admin > Settings: a switch, a message and an optional end time. It must be usable from a phone.
>    - Signed-in users see a maintenance screen in the app's own style at their next action.
>    - Admins keep working, with a banner.
>    - The public site and sign-in keep working.
>    - Agents and the API get "temporarily unavailable" with the message.
> 3. **The deploy script** can switch maintenance on and off by itself for risky migrations, opt-in per deploy.
> 4. **The announcement bar** under the header shows planned maintenance in advance.
>
> **Also decided:**
>
> - The three tester questions are the teaser in the invitation and a LinkedIn post. Yes to all three means "Try Listspace for free".
>   1. Do you work on a project with an AI assistant?
>   2. Do you sometimes have to explain your project to your AI again, or check what it did?
>   3. Will you use Listspace for a real project for a week and answer 5 short questions?

### The team owner can close the team: members get the Pro or Free choice, and all team boards are deleted

> Decided by Jordi on 13 Oct 2026.
>
> - In Settings > Team, the owner (only) can close the team, after an export offer and typing the team name.
> - Every member, the owner included, gets the existing removal choice: continue on Pro, or go to Free.
> - All of the team's boards are deleted. The owner's personal boards are untouched.
> - Staff can also close a team from Admin > Teams.
> - Jordi will test Team with a team owned by a second email address, not the admin address.

### Listspace must rank above listspace.io for "listspace"; brand links and directories are the main lever

> Decided by Jordi on 13 Oct 2026: listspace.io is no competition, but listspace.app must end up above it on Google and Bing. The plan is on To Do as "Rank above listspace.io for "listspace" on Google and Bing". Closing a team (owner, export offer, type the name, Pro or Free for members, team boards deleted) is confirmed as proposed.

### At release, Listspace gets its own big feature on yellowhousedigital.com, not an indie-build paragraph

> Decided by Jordi on 13 Oct 2026. Listspace is no longer on the YHD site; the old "ListSpace" indie-build text is only leftover data in yhd-site-v2 (src/lib/indieBuilds.ts) and isn't shown. Once Listspace is released, it becomes the biggest build presented on the YHD site, with its own feature and a link to listspace.app, which also helps the brand rank above listspace.io.

### Team must be ready, seat billing included, before Listspace goes live

> Decided by Jordi on 13 Oct 2026: "i want teams ready before i go live." This replaces "Team opens later if it isn't solid".
>
> The launch waits until Team, with seat billing and a self-serve "Start a team", passes Jordi's hand test. There's no hard launch date, and Jordi decides the day.

### Boards overview shows "N new" per board for changes by guests, team members and agents since your last visit; delete-files and cron routes tightened

> Decided by Jordi on 13 Oct 2026.
>
> - **Board updates:** a calm "N new" marker on each board in the overview and the left panel, for changes by others since your last visit, plus the Inbox marker. It clears when you open the board.
> - **From the rights audit, all three of the advice points are agreed:**
>   - delete-files only deletes stored files for the owner or team admins, and only for deleted or archived items;
>   - the cron functions are blocked on the public server;
>   - export-item emails are watched, with no action now.

### When an agent claims an item, it moves to the board's doing list by itself

> Decided by Jordi on 13 Oct 2026. He saw "Claude Code is working on this" on an item still in To Do.
>
> - Claiming (claim_item, and next_item when it claims) moves the item from a to-do list to the board's doing list, when the agent's level allows moving it and the board has a doing list.
> - The result says where it went.
> - Releasing doesn't move it back.
> - The agent still moves it to Done with a comment when it's finished.

### All state icons on an item tile sit in the bottom row; a list's type label hides when it equals the title

> Decided by Jordi on 13 Oct 2026.
>
> - The lightbulb (and any other state icon in the title row) moves to the bottom row of the tile, next to the important flag, so the tiles are consistent.
> - A list's type label stays hidden when it's the same word as the list title ("Doing" with type doing). Jordi likes it that way.

### Profession pages stay at /use-cases/<slug>; closed-team records are deleted after 12 months automatically

> Decided by Jordi on 13 Oct 2026.
>
> - One URL per page: /use-cases/lawyers and so on. No /for/ duplicate.
> - The team_closures staff log keeps a record 12 months, then the hourly cleanup deletes it. Jordi hears about it in the admin daily email.

### Team billing rules: owner manages seats, consent on invite, 7 days of Pro after leaving, admin discount, read-only in the database, Team opens with payments live

> Decided by Jordi on 12 and 13 Oct 2026. This one decision holds all Team billing rules; it merges the 12 Oct "Team billing rules, and a discount Jordi can give a team" with the 13 Oct answers for PR #302.
>
> **From 12 Oct:**
>
> 1. **Only the team owner manages seats and billing**, as Slack and Notion do by default.
> 2. **Inviting when no seat is free:** the invite screen says "This adds a seat when Sara joins, at most €9.99 today", and the admin's Send is the approval. Nobody is charged without having seen it.
> 3. **Leaving a team:** the person keeps Pro for 7 more days and is asked right away to choose Pro (paid by them) or Free.
> 4. **If pausing a personal Pro does not work in Stripe:** the person's own Pro ends at the end of its period, and the founder discount stays reserved while the seat lasts.
> 5. **A discount on Team that Jordi can give a team,** for example a freelance collective that works with many agencies. Set by a Listspace admin per team: a percentage and how long it lasts.
>
> **From 13 Oct:**
>
> 6. A read-only team (failed payment, grace over) is read-only for its owner too, enforced in the database policies, not only in the app.
> 7. Someone who leaves a paid team and picks Pro during the 7 days starts paying when those 7 days end.
> 8. Opening Team needs both switches: teams_open and payments_live.
> 9. The Terms' paid plans section gets Team seat billing lines before Team opens (with a "Last updated" bump).
> 10. The pricing, compare, roadmap and help copy that says Team is "not open yet" is updated in the PR that opens Team.
> 11. A seat is charged before a member is added. A failed seat charge adds no one and removes no one, and the team does not go read-only.
>
> **Why:** simple billing people know, no surprise charges, nobody loses Pro mid-work, and a way to win collectives that bring in new customers.

### A team over its storage after a member leaves: nothing is deleted, new uploads pause, the remove dialog warns first and the owner gets a notice

> Decided by Jordi on 13 Oct 2026. Files belong to the board, not the uploader, so a removed member's files stay. If the team ends up over its storage, the Pro rule applies: nothing deleted or hidden, uploads pause until the owner makes room or adds a seat. The remove dialog says how far over the team will be, and the owner gets a notice.

### Item deletion: members with edit rights archive only; the board owner and team admins delete permanently

> Decided by Jordi on 13 Oct 2026. Archive can be undone and keeps the files, so members and guests with edit rights archive. Permanent delete (also "Clean up list") is for the board owner and, on team boards, team owners and admins. This matches agents, which never delete, and means deleted items always take their files with them.

### A read-only team blocks every write path in the database, also through functions; under 2 days of the 7 left, Pro is charged at once

> Decided by Jordi on 13 Oct 2026, after PR #302.
>
> - One database guard blocks all writes on a read-only team's rows, including writes through database functions, for everyone including the owner. Exceptions: removing members and closing the team.
> - Stripe needs a trial of at least 2 days, so someone who picks Pro with less than 2 days of the 7 left pays at once. Accepted as a rare edge.

### The 7 days of Pro after leaving a paid team come at most once per person per team in any 90 days

> Decided by Jordi on 13 Oct 2026. Closes the rotation loophole: removing A and B in turns from one paid seat gave both Pro for free, indefinitely.
>
> - A second departure from the same team within 90 days gives no extra Pro days. The person moves to Free at once and still gets the Pro or Free choice.
> - A courtesy that is still running is not extended or restarted by a new departure.

### Go-live: Team opens together with payments; live Team prices are created as soon as possible; test founder rows are removed without an email

> Decided by Jordi on 13 Oct 2026, for the go-live runbook (#285, #286).
>
> 1. Team opens on go-live day together with payments (teams_open and payments_live both on), if Jordi's hand test of Team passes.
> 2. The live Team product and prices (€9.99 per seat a month, €107.88 per seat a year, tax inclusive) are created in Stripe live mode as soon as possible, not left optional.
> 3. Test founder rows are removed at go-live, and the accounts that lose test Pro get no email (only testers have them). Removing them is a production change and gets its own OK at the time.
>
> Also: the Inbox shows the decision being replaced as "Current decision" next to the "New decision" (PR #308), the friendliest wording.

### Closing a team is the owner's; others report a team to Listspace, and a staff close gives the owner time to export first

> Decided by Jordi on 13 Oct 2026, after seeing the Admin close dialog with no way to export.
>
> - The team owner closes the team (with export) in Settings > Team.
> - Anyone else in the team reports it ("Report this team"), and a Listspace admin gets the report and decides.
> - A staff close is rare (abuse, legal, owner gone). It sits in the row's "..." menu in Admin, needs a reason, and emails the owner. The team is not deleted at once: it turns read-only and the owner gets 14 days to export, then it closes. Details as built in the PR.

### The 7 days of Pro after leaving need at least 7 days in the team; Jordi's hand-test teams are closed before go-live

> Decided by Jordi on 13 Oct 2026 (PR #307).
>
> - On top of the once-per-90-days rule: the 7 days only come after at least 7 days in the team, so one seat can't hand out free Pro weeks to a stream of people.
> - Jordi tests Team himself; any test team on production is closed before go-live, with its own OK at the time.

### Files: members remove only their own uploads, owners and admins any; a removed file stays restorable for 30 days by the board owner or a team admin

> Decided by Jordi on 13 Oct 2026.
>
> - Members (and Edit guests) may remove only files they uploaded themselves; the board owner and team owners and admins may remove any file.
> - A removed file is not deleted at once: it is kept 30 days, and only the board owner or a team owner or admin can bring it back. After 30 days it is deleted for good.
>
> **Why:** a wrong upload should be easy to fix, but nobody should be able to destroy other people's work out of bad behaviour.

### When Team opens, the Team waitlist gets one short email (it is empty today, since Listspace isn't promoted yet)

> Decided by Jordi on 13 Oct 2026. The privacy text promises one email when Team is available, so the runbook keeps that step after the Sunday switch. Today the waitlist has no records, because Jordi isn't promoting Listspace yet, so in practice nothing is sent.

### Encryption at rest confirmed as the Trust page states; the virus scan for uploads is built now that Teams are live

> 13 Oct 2026, Jordi said yes to the check and the virus scan.
>
> - R2 files: encrypted at rest (AES-256, Cloudflare). Off-site database backups: encrypted with restic before they leave the server, with a restore test. The server's own disk is not encrypted, and the Trust page already says so. Full-disk encryption on the VPS is not planned (reinstall, manual unlock at every reboot, little gain).
> - Virus scan: ClamAV on our own server, as planned on 7 Oct. Installing it on the live server gets its own OK.

### Removed files: Restore all and Delete all, binned files don't count toward storage; Admin analytics gets tabs with nothing collapsed; testers losing test Pro get no email

> Decided by Jordi on 13 Oct 2026.
>
> - The Removed files window has "Restore all" and "Delete all for good" (owner and team admins). Binned files don't count toward storage; they are deleted for good after 30 days.
> - Admin, Analytics is split into tabs (Overview, Growth, Usage, Money, Feedback and waitlist). Nothing is collapsed: the sections fill up quickly after launch.
> - Moving an item to a done list ends its claim (build it).
> - At go-live, the testers who lose test Pro get no email.
> - Next: triage the Ops to-do list, then the virus scan for uploaded files and the encryption-at-rest check.

### "Parse rows at the boundary" is built now as a draft PR and merges the week after launch

> Decided by Jordi on 13 Oct 2026. The last action of the 11 Oct code health check touches almost every data service and changes nothing a user sees, so it isn't merged during the launch week. It is built now as a draft PR, kept rebased, and merged the week after launch.

### Listspace runs its own launch posts on a board, and gets a "Social content" template and a page for content creators

> Decided by Jordi on 14 Oct 2026.
>
> - The launch posts run on the board "Listspace launch posts" (Work space, Agent access 3): Claude drafts, Jordi approves in the Inbox (an agent's move to Ready to post is the publish approval), Claude schedules through the Content Calendar and writes the results back.
> - A "Social content" template and /use-cases/content-creators: one board per client, the client as a guest, the publish date as the due date (board calendar, per-board calendar feed, daily email). Listspace doesn't post itself: the AI does, through the person's posting tool.
> - This template is the first use case for custom fields (channel, publish time, post link, status).

### Lovable and Bolt are tested; connectors that work next to Listspace are named with a "should work, on our list to test" footnote

> Decided by Jordi on 14 Oct 2026.
>
> - Lovable and Bolt connect to Listspace's MCP server and work (Jordi tested both). In Bolt the Listspace connector must be switched on per chat; in both apps "Always allow" stops the per-tool questions.
> - A "Works well next to Listspace" list names apps the AI can use side by side with Listspace (Granola, Fireflies, Figma, Canva, Miro, Linear, Jira, GitHub, Sentry, Zendesk, HubSpot, Pipedrive, Notion, Postiz, LinkedIn, X, WordPress, beehiiv), each with how they work together, and a footnote that each combination should work but is still on our list to test. No integration is claimed.
> - Postiz has an MCP server and is named as a posting tool for the Social content flow.
> - The Pro retry window (retry_days) is set to 14 during the Stripe live walk-through.

### Settings use one column width for every section; short fields stay short and tables use the full column

> Decided by Jordi on 14 Oct 2026. Settings sections mixed widths (448, 576, 672 px and full width), so the right edges jumped between Profile and Developers. Now every section sits in the same column (about 768 px); single text fields stay about 448 px inside it; tables and lists (tokens, agents, team members, invoices) use the full column. Nothing stretches across a wide screen.

### Team admins may remove people from private team boards

> Decided by Jordi on 14 Oct 2026 (PR #338). The "Visible to" window already let team admins change who sees a private team board; the database now agrees, so admins can remove people from it too. Admins already manage visibility and per-board access, so it is the same right.

### Risky changes go in before launch, even if launch moves a week

> Done before launch: speed (load the sign-in library only when needed, critical CSS, weekly Lighthouse), "parse rows at the boundary" (#314), the database indexes and pg_stat_statements, and a design consistency check across the app. New features (imports, templates, agent rules, multi-language, custom fields, mobile app and the rest of "To Do - After Launch") stay for later, mostly once there are paying users.

### A Confirmed decision can be replaced or withdrawn, never erased

> The owner and anyone who can edit can replace a decision or withdraw it with a reason; it stays in the history. Comment guests can only propose a change. Agents can only propose, through the Inbox.

### Keeping boards current is fixed in the MCP server first, so it works in every app

> Reminders in tool results for items an agent worked on without updating, and the next session checks and updates unfinished items before anything is shown to the user as stale. Claude Code hooks and the GitHub link come on top, not instead.

### A Comment guest can propose a change to a decision; it waits in the board's Inbox for the owner

> A guest with Comment access uses "Propose a change" on a decision. It becomes a normal Inbox suggestion that the owner accepts in one click, or rejects. Only a person with the right to decide confirms it. Shipped 15 Oct, after replace and withdraw (#370).

### Only people who can edit tick checklist items; Comment guests and team Commenters can't

> The board owner, team members who can edit and Edit guests tick and untick checklist items, also in read mode. Guests with Comment access and team Commenters can't. Enforced in the database, the AI tools, the app and the help pages. Shipped 15 Oct.

### Board reminders pause while an item waits on someone, until anything changes on it (7 days at most)

> An agent can say what an item waits for (a review, a merge, a reply). The item shows "Waiting for: ...", and reminders skip it until anything changes on the item, with a 7-day safety limit. Shipped 16 Oct.

### Soft launch: everything deployed by Saturday 17 Oct, then a personal round of a handful of testers before sign-up opens to everyone

> Replaces "Everything deployed by Saturday evening 17 Oct; on Sunday 18 Oct Jordi only flips the switch; posting starts Monday 19 Oct" (13 Oct).
>
> Still holds:
>
> - Saturday 17 Oct: everything merged and deployed, including the go-live PR. The switch is still off.
> - No marketing emails yet. Jordi reaches out to his own contacts personally.
>
> Changed on 15 Oct:
>
> - Sign-up does not open on Sunday 18 Oct. First 5 to 10 testers, invited personally, use Listspace for about two weeks. Jordi flips the switch (open sign-up, payments live) after that round.
> - Posts in the meantime ask for a handful of testers, not for sign-ups (see "Draft: LinkedIn launch post").
> - "20 real testers is enough" becomes 5 to 10 for this first round.

### Custom fields are built the week after next (from 26 Oct)

> The 12 Oct order (launch testing, custom fields, then Team) was only in a comment on the spec and never recorded, so Team went first. Custom fields now follow the tester round, in the week of 26 Oct, from the spec "Spec: custom fields (decided 12 Oct)"; its 6 open decisions are settled first.

### On a touch screen, holding an item drags it; selecting only through Select items

### On a touch screen, items show no checkbox, flag or label buttons

### Public pages follow the device's light or dark setting, with no switch on the page

### Homepage H1: "Project memory for you and your AI." with "Your AI forgets. Listspace remembers." under it

### Custom fields ship as one release: all 3 PRs built first, then merged and deployed together

### Timeline view and dependencies are on every plan, Free included

> Views are not what people pay for: calendar and table are free too. The reasons to pay stay collaboration, AI freedom, memory and developer tools. A free timeline is an edge over Trello, which keeps its timeline for paid plans.

### Critical path and baselines in the Timeline are Pro and Team features

> The Timeline view and dependencies stay on every plan, Free included. Critical path and baselines are project-manager tools that the bigger tools keep for paid plans; on Free, the switch shows a Pro note.

### Roadmap: reword "Link boards to code on GitHub" to only what isn't built yet

> Pull request and issue links on items, with their open, merged or closed status, already ship. The Later item keeps only the part that is still planned (for example a whole board linked to a repository, or items that move when their pull request merges), checked against the code. Done in the 22 Oct content PR.

### Design rules from the 20 Oct design check: 22 approved, switches unchanged, narrow toolbar shows the basics plus "More"

> Approved by Jordi on 22 Oct: findings 1 and 3 to 23 with the rules as written in the design check, with these specifics: one filled button per window (ink in light, yellow in dark), everything else outline; Delete is a red outline button, solid red only for the final "Delete X" in the confirm window; red only for errors and final destructive actions; theme tiles stay but share the radio rows' selected style; stars gold everywhere. Finding 2 (switches in dark) rejected: the difference is clear. Finding 24: option A, like Word or OpenOffice: bold, italic, list, link and code visible, the rest behind a "More formatting" button, always one row.

### Role pages with story-style workflows: "Are you a designer, developer, project manager...?" each gets the docs, how-tos and a fictional workflow with the tools they already use

> Decided by Jordi on 23 Oct 2026.
>
> - One entry per role: designer, developer, project manager and more.
> - Each page tells a fictional workflow as a short story, with the tools the reader already uses (for example Figma and Claude for a designer; Jira, GitHub and ChatGPT for a developer).
> - Each page also links the docs and how-tos that fit that role.
> - Builds on the profession pages at /use-cases/<slug>.

### A board can be handed over to another account: the recipient accepts, the sender chooses to stay as editor or leave, history, instructions and files go along, and it lives in the board's ... menu

> Decided by Jordi on 23 Oct 2026.
>
> - The recipient accepts the handover first.
> - The sender picks: stay on the board as an editor, or leave it.
> - History, board instructions, decisions and files go with the board.
> - Agent access levels reset to the new owner's settings; the new owner's plan limits apply (for example 3 custom fields on Free).
> - A rare action, so it sits in the board's "..." menu as "Hand over board", not on the toolbar.
>
> Use case: setting up a board for someone else (a friend's project, a client) and giving it to them.

### The CLI gets a generic call command that reaches every MCP tool, plus short commands for comment, update, lists and new-board --template; the docs on the site cover all of it

> Decided by Jordi on 23 Oct 2026.
>
> - `listspace call <tool> --json '{...}'` reaches the same tools as the MCP server, so the CLI never falls behind MCP again.
> - Short commands for what people type often: comment, update (title, description), list create and rename, and new-board --template.
> - Every command added is documented on the site in the same PR.
>
> Found while setting up a board through the CLI: lists could not be renamed and items could not get a comment or an edit.

### Role stories live in Use cases, not in a new Workflows section or in Notes

> Decided by Jordi on 23 Oct 2026.
>
> - Use cases: "Is this for someone like me?" An "Are you a designer, developer, project manager...?" picker and one story page per role at /use-cases/<role>.
> - Guides: how to do one task. Linked from the stories, never copied.
> - Docs: reference (MCP, API, CLI). Linked from the developer story.
> - Notes: the blog. The project managers note stays and is linked from the project manager story.

### A handover moves the full board, files included: uploaded files are copied to the new owner, and the same copy makes moves into and out of team spaces work

> Decided by Jordi on 23 Oct 2026, after PR #579 shipped handover for boards without files.
>
> - Attachments, images in descriptions and an uploaded background or avatar move with the board on a handover.
> - The same file copy lifts the refusal on moving a board with files into or out of a team space.
> - Until it ships, a board with files cannot be handed over (the window says so).

### Inviting someone without an account says so where it matters: a line in the Share window and in the invite email, and no "Invite friends" button during the beta

> Decided by Jordi on 24 Oct 2026.
>
> - Share window (and inviting a team member): when the address has no account yet, one line says the invite lets them sign up and join.
> - The guest or team invite email says plainly that it also gets them into the beta, so they do not join the waitlist first.
> - No referral or "Invite friends" button while Listspace is invite-only; people invite others to real work.

### The handover email names the board, in quotes

> The handover email says: Name (address) wants to make you the owner of the board "Title". The title is cleaned to one plain line, at most 100 characters. The subject stays without it. The guest invite email still leaves the title out, because it can go to a stranger.

### Copy says "your AI" to readers; "agent" only as a name or technical term

> "Your AI" (or "your AI apps" for several) on the site, in emails, onboarding and the app. "Agent" in Agent access, coding agents, the developer docs, MCP tool texts and instructions agents read.

### A public board's own address leads to its public page, except when the public link has a password

> /board/<id> sends people who cannot open the board to its public page (#576). Boards whose public link has a password do not redirect: signed-out visitors go to sign-in and signed-in people without access see "no access", as before. Owner, team and guests always keep the private board.

### Board and item titles in running email text go in double quotes, full stop outside

> Headings (like the per-board sections of the daily summary) and app names (Claude Code, Listspace test) stay unquoted. Applied in PR #593 to the getting started email; the handover and follow emails already did this.

## Questions

> Items that need answers or clarification

### Which chat apps pass uploaded images on to tools?

> For attach_file: ChatGPT has a mechanism, Claude.ai partly. Test both before we promise "send a screenshot from chat".

### Who is the first Team customer?

> Team collaboration is going to be an important feature: every person on a team has their own AI assistant, and one shared board lets all of them claim work, leave summaries and propose changes through the Inbox. The open question is who buys Team first, because that decides what goes into the Team plan.
>
> **Candidates (3 to 15 seats, bought on a card, no procurement):**
>
> - **Agencies:** strategists, designers and developers each with their own Claude or ChatGPT, client projects that need one shared memory. The world Jordi knows best.
> - **Small product or dev teams** in startups and scale-ups that already use Claude Code or Cursor and find Jira too heavy.
> - **Consultancies and freelance collectives:** short projects, changing teams, lots of context to hand over.
>
> **Why not a large IT department first:** they already have Jira (now with a free agent connector), and procurement asks for SSO and SCIM, audit logs, SOC 2, a pen test and uptime guarantees. 50 seats is more likely to come from one happy team spreading inside a company.
>
> **Build order this implies:**
>
> 1. Share a board privately (foundation)
> 2. Team: shared boards, roles, each person's agents with their own levels, per-seat billing
> 3. Business: SSO, audit log, SOC 2, once teams pay and ask for it
>
> Related: "Plans: Free, Pro, Team, Business, Enterprise", "Share a board privately with someone", "Business plan for companies (50+ users): first shape".

## Ideas & Scribbles

> Brainstorm notes and rough sketches

### GitHub link

> Items linked to pull requests and commits. An item moves to Done when its PR is merged.

### Markdown and git sync

> Export a board to a markdown file in your repo and read it back. Wins people who use Backlog.md or Beads.

### Public board as context for other people's agents

> A shared board that other people's agents can read, like an llms.txt for your project. A public roadmap your customers' agents understand.

### Lists for ChatGPT and Claude in daily life

> ChatGPT has no lasting lists. "Give ChatGPT a list that stays": reading list, groceries, trips, gift ideas. The second market after builders.

### Open source Listspace (like Postiz)

> Core app under AGPL-3.0 with a CLA, hosted version with Pro as the business model; skill, CLI and plugin under MIT. Needs: secrets scan of the history, internal server details out of the repo, billing code separated, one-command self-hosting (deploy/selfhost is a head start), CONTRIBUTING, SECURITY.md, trademark policy for the name and logo, a place for the community. Timing: once the agent features are stable.

### Compliance: GDPR, SOC 2 Type II and more

> Being built now (6 Oct): a public Trust page (how data is protected, responsible disclosure), a sub-processor list, a DPA template for business customers (to be reviewed before it goes live), security.txt, and internal records of processing, a data breach procedure, a DPIA screening for agent features, a SOC 2 readiness gap list and an accessibility note.
>
> Later:
>
> - SOC 2 Type II audit (3 to 12 months observation; tools like Vanta or Drata)
> - ISO 27001
> - Accessibility audit and fixes (European Accessibility Act, WCAG 2.2 AA)
> - Status page
> - Penetration test
> - Two-factor sign-in for users, if not on yet

### White label for larger companies

> Offer Listspace under a company's own name and domain, as a dedicated instance at a high monthly price. The self-hosted setup already runs as one stack on one server, which makes a dedicated instance per customer realistic.
>
> What it needs:
>
> - theming (logo, colours, name)
> - a custom domain
> - SSO
> - a separate database per customer
> - a support agreement
> - ideally the compliance work (SOC 2 or ISO 27001), because large companies ask for it first
>
> Not before the product has its first paying users and basic collaboration (more people on a board).

### Pay with crypto, for agents with their own budget

> An agent with its own budget could pay for its tools without a person's card. Ways that exist today:
>
> - **Stablecoin payments (USDC) in Stripe:** fits the planned Stripe setup.
> - **x402 from Coinbase:** an HTTP 402 "payment required" standard, made for agents paying per request.
>
> Check what each one supports for subscriptions and EU VAT before building. Interesting as a differentiator ("an agent can buy its own Pro"), but after normal plans work.

### Private lists on a shared board (instead of passwords)

> Question from Jordi: should you be able to password protect a list on a board?
>
> Advice: no passwords per list. They are easy to share, easy to forget, and they give a false sense of security. The real need is "this list is only for me" on a board other people can see. That belongs with collaboration: a list visible only to its owner, hidden from shared views, agents and exports unless allowed. Revisit when boards get more people.

### More agents and designers: MCP clients, Mermaid, Figma

> **Other places the MCP server works (to verify per tool and list on /setup and the docs):**
>
> - **Coding agents:** Cursor, Windsurf, VS Code (Copilot agent mode), Zed, Cline, Continue, Goose, Codex CLI, Gemini CLI, Claude Code.
> - **Chat apps:** Claude, ChatGPT, Mistral Le Chat, Perplexity (Mac app), Raycast AI, LM Studio.
> - **App builders:** Lovable and Replit support MCP connectors in some form; Bolt and v0 need checking. A guide per builder ("plan your app on a Listspace board, let the builder pick up items") fits the positioning well.
> - **Automation:** n8n's MCP client, and Microsoft Copilot Studio.
>
> **For designers and UX designers:**
>
> - **Mermaid diagrams:** a code block marked `mermaid` renders as a diagram (user flows, sitemaps, sequences), and agents can write them. It is cheap to add and very visual.
> - **Figma:** link previews for Figma frames (oEmbed), and later a Figma plugin to send a frame or a comment to a board as an item with the frame linked.
> - **Image annotations:** draw arrows and notes on a screenshot attachment. Useful for design reviews and bug reports.
> - **Board templates:** design sprint, UX research, design review, a feedback board for clients.
> - **Whiteboard:** an Excalidraw-style sketch as an item type (bigger, later).

### Business plan for companies (50+ users): first shape

> # Business plan: first shape
>
> Approved by Jordi on 7 Oct: **Team, Business and Enterprise**, as below. Goal: a group of people, from two freelancers to a company of 50, can start on Listspace in an afternoon without talking to sales.
>
> ## Team is any group, not only a company
>
> Two freelancers who share a space are a team, not a company. So:
>
> - **Team needs no company:** a team is just a group with a name. From 2 seats, no company details, no domain needed. Anyone can start one with a card.
> - **Shared spaces:** each member keeps a personal space and sees the team's shared spaces next to it. Leaving a team keeps your personal space intact.
> - **Guests (growth loop):** a Pro user can invite up to 2 guests to a single board for free, for example a client or a co-freelancer. Guests can view and comment, or edit if allowed. When they need more, they start a Team.
> - **Business is Team plus company needs:** SSO, audit log, invoice payment, a verified domain and an admin console.
>
> ## What a group needs first
>
> 1. **Working together.** Several people on the same boards, with roles: owner, editor, viewer. This is the real prerequisite; it is on the roadmap for 2027 and has to come forward.
> 2. **A team or organisation** above personal accounts. It holds the members, the shared spaces, billing and the policies.
> 3. **Easy onboarding:**
>    - invite by email, link or CSV
>    - for Business: "anyone with an @company.com address may join" (verified domain), and sign-in with Google Workspace or Microsoft
> 4. **Control over agents.** A team-wide maximum Agent access level, the agents and apps that are allowed, and agent activity visible to admins.
> 5. **Trust:**
>    - an audit log (who did what, including agents)
>    - data export
>    - a DPA
>    - EU hosting
>    - a status page and uptime promise
>
> ## Plans (prices to test)
>
> | Plan | For | Price idea | Adds |
> | --- | --- | --- | --- |
> | Free | one person | 0 | agents at levels 1 to 2 |
> | Pro | one person | about 6 to 9 euro a month | everything for one person, plus 2 free guests per board |
> | Team | 2 to 50 people, any group | about 8 euro per person a month, about 80 a year | shared spaces and boards, roles, invites, central billing, team agent policy |
> | Business | companies, often 50+ | about 14 euro per person a month | SSO, verified domain, audit log, admin console, invoice payment, priority support |
> | Enterprise | large or regulated | custom | white label or dedicated instance, SAML/SCIM, contract and SLA |
>
> ## The setup flow
>
> 1. "Start a team": a name, and payment by card (Business: invoice), per seat.
> 2. Invite: paste emails, share an invite link, or upload a CSV (Business: domain join).
> 3. Pick shared spaces (for example Clients, Product, Marketing) and starter templates.
> 4. Set the agent policy (maximum level, allowed agents).
> 5. Done. Members get an email, sign in, connect their own assistant, and see the shared spaces next to their personal one.
>
> ## Billing details
>
> - Per seat, counted monthly. Removing a person frees the seat at the next billing date.
> - Annual billing gets 2 months free.
> - EU VAT handled by Stripe Tax or a merchant of record.
> - Business: invoices with a PO number.
>
> ## Order of work
>
> 1. Collaboration (shared boards, roles, guests)
> 2. Teams and invites
> 3. Team billing
> 4. Business: admin console, audit log, SSO, domain
> 5. Enterprise

### Smart lists: items that fill themselves in

> How smart can we make lists? A list knows what kind of thing it holds and looks up the rest when you add an item.
>
> - Add a book: it finds the cover and the ISBN.
> - Add a movie: it finds the cover, the trailer and the IMDb link.
>
> Open question: how far does this go, and for which kinds of lists?

### Paste-a-link context for chats without a connector

> A secret read-only link to a board that you paste into any chat, even one without the Listspace connector. The agent fetches the link and has the project context. No write-back, but no setup either.
>
> Solves day one for non-technical testers and works in any chat app that can read a web page. Needs: secret, revocable links and a plain-text or markdown view of the board that agents read well.
>
> Related: "Invite the first testers when v1 is ready", "Setup page for non-technical users".

### Sponsored backgrounds for free users, like WeTransfer

> Idea from Jordi, 8 Oct: free users get sponsored board backgrounds, like WeTransfer's full-screen ads. Pro removes them.
>
> Earlier version: "WeTransfer style advertisement backgrounds" on the old ListSpace.app board, put On Hold / Cancelled in 2025.
>
> **Points to weigh:**
>
> - **Scale:** sponsors pay for impressions. WeTransfer has tens of millions of users; at a few thousand free users the income is small, and every deal needs selling.
> - **Agent-first means fewer eyes on the board:** much of the work happens through the agent, so the human sees the board less often than a WeTransfer page.
> - **Trust:** ads inside a workspace where people keep client projects sit uneasily next to the Trust page, the AI-training promise and "Generous by default".
> - **Upside:** a visible reason to go Pro, and a curated sponsor (a design tool, an AI tool) can feel like a feature rather than an ad.
>
> **Alternatives that pay in reach instead of money:** a small "Made with Listspace" badge on public boards for free users, or curated backgrounds from partner brands without tracking.

### Browser extension: save a page or all open tabs to a board

> Idea from Jordi, 9 Oct. A browser extension that:
>
> - saves the current page to a chosen board and list (title, link, preview), optionally with a short summary;
> - grabs all open tabs and saves them as items on a board, as a backup of a browsing session (like OneTab or Toby).
>
> Earlier versions: "Chrome extension: safe to board" and "Browser Extension: Save to specific lists" on the old ListSpace.app board (2025).
>
> **Points to weigh:**
>
> - **The agent can already do part of this.** With an assistant that can read the page (Claude in Chrome, ChatGPT's browser) and the Listspace connector, "summarize this page and add it to my reading board" works without an extension. The extension adds value mainly for one-click saving without an agent, and for saving all tabs at once.
> - **Summaries cost money.** If the extension summarizes, someone pays for the model calls. Simplest: save the page without a summary, and let the user's own agent summarize later (or make summaries a Pro feature).
> - **Upkeep:** store reviews (Chrome, Firefox, Safari, Edge), sign-in inside the extension, and updates when browsers change.
> - **Cheaper first steps:** a bookmarklet, a share target in the installable web app (phone share sheet to a board), and an email-to-board address.
>
> **Timing:** after launch. Fits the board-only users and the "Smart lists" idea (link previews, books, movies).
>
> Related: "Smart lists: items that fill themselves in", "Recurring items, installable mobile web app", "Connect Slack, WhatsApp, Teams and email".

### Branded templates for PDF and Word files (nice to have)

> From Jordi on 12 Oct, a nice to have. Agents and the app can now make PDF and Word files from an item (PR #219). Next step: branded templates, with your logo, colors, font, a cover page, and header and footer text. Chosen per board or per account, for proposals, reports and briefs that go to clients. Probably a Pro or Team feature. Note: the PDF renderer uses standard fonts today; a custom font means embedding it, which costs memory on the server.

### Formulas in custom fields

> Kept as an idea by Jordi on 12 Oct, not in custom fields v1. Examples: "value × chance = weighted value", "days until the due date", "price × quantity", "is the budget over?". A formula field needs its own parser and evaluator, sorting and filtering on computed values, errors when an input field is deleted or renamed, and rules for agents (read the result, never set it). A sum row under number columns in the table view covers most of the need first. Revisit when users ask. See "Spec: custom fields".

### Search inside attached files, without an AI bill

> Jordi, 15 Oct: should people be able to search through documents and attachments too, like a RAG system?
>
> **Today:** search covers item titles and descriptions, so documents (whose text is the description) are already found. The contents of attached files (PDF, Word, text) are not searched.
>
> **Proposal: the agent is the "AI", Listspace does the finding.** Listspace runs no AI and charges no AI fee; the user's own assistant already does the reasoning. So Listspace only needs good retrieval:
>
> 1. **Extract text on upload** from PDF, Word, Markdown and text files (no OCR for scans in v1), store it with the file, and add it to the same full-text search in Postgres. No AI and almost no cost. Search results show the file name and a snippet with the page.
> 2. **Two agent tools:** `search_files` (passages that match, with the item, file and page) and `read_file_text` (the text of one file or a page range). The assistant searches, reads the relevant pages and answers with its own model: RAG where the "generation" happens in the user's assistant.
> 3. **The same search in the app:** one search box that also finds words inside files, with "in: brief.pdf, page 4".
> 4. **Later, only if keyword search falls short:** meaning-based search with embeddings in pgvector, possibly as a Pro feature. That brings a small running cost, so measure first whether people need it.
>
> **Rules:** extracted text follows the file's access rules (private boards stay private, guests only see what they can open) and is deleted with the file; it stays in the EU like the files.
>
> **Why it matters:** briefs, contracts and specs often arrive as PDFs. An assistant that can find "what did the brief say about the deadline?" inside them makes the board the real project memory, not only the cards.
>
> Related: "Agents upload files without pasting them as text", "Plans" (storage per plan).

### Spike: a file picker inside the chat (MCP Apps widget) for Claude and ChatGPT

> From the 15 Oct research: Claude and ChatGPT both show MCP Apps (small interactive widgets). A widget with a file picker could upload straight to the item. Unconfirmed: whether a file input works inside Claude's sandboxed widget. Small spike first. Also track the MCP "files" extension being drafted (experimental-ext-file-uploads); when a host ships it, add it on top of the upload links.

### Custom fields v2: what comes after the first 3 PRs

> Kept by Jordi on 17 Oct, so we don't forget them. Decide once people use custom fields v1 and we know what they miss. Plan for v1: "Custom fields: build plan (17 Oct)" in Project Input.
>
> - **Change a field's type** (for example text to single choice), converting the existing values. In v1 you delete the field and make a new one.
> - **Formulas**, such as "value × chance" or "days until the due date". See the idea "Formulas in custom fields".
> - **Several people in a person field** (v1: one).
> - **Fields shared across boards**: one "Customer" field for all client boards, instead of copying fields per board.
> - **Required fields and default values.**

### Agent profiles per board: a named role with a goal, rules and its own access level

> From the competitor study (idea 4): https://listspace.app/board/6b1bbf10-4401-43df-abdc-cc8b8b245fbc/card/3ca80e20-90b2-4310-b6b6-511b9f730b25
>
> monday's Agent builder and ClickUp's named Super Agents present agents as teammates. Listspace version: a profile (for example Reviewer or Builder) that any MCP client takes on at start_session, so it behaves the same in Claude or Cursor, with an access level per profile so people stay in charge. About 3 to 4 PRs.

## Nice to Have

No items.

> Optional enhancements for later

## To Do - After Launch

### Earned autonomy: agents earn a higher Agent access level

> Every connected agent (Claude, ChatGPT, Cursor, Codex) has its own Agent access level and its own track record: how many of its suggestions were accepted and how many rejected. Listspace then proposes a change: "Claude Code had 40 of 42 suggestions accepted, raise it to Act?" Trust that grows from evidence instead of a setting you guess once.
>
> Also works the other way: lower an agent's level after a run of rejections.
>
> Builds on the Inbox, Agent access levels and who-did-what history that already exist.
>
> Goes hand in hand with Constance.

### Agent rules: agents that listen to lists and act

> Agents that listen to certain lists and act based on rules, like Trello's automation rules but with agents doing the work.
>
> ## Example rules
>
> - **Bugs:** an item lands there, an agent tries to reproduce it and writes a fix plan as a comment.
> - **Questions:** an agent researches the question and adds the answer to the item.
> - **Done:** an agent writes a changelog line, and maybe a LinkedIn post draft, per finished item.
> - **Ideas:** an agent checks for duplicates and overlaps with existing ideas.
>
> ## A rule has
>
> - A trigger: list, label or move.
> - Which agent runs it.
> - What it should do.
> - An Agent access level for that rule.
>
> ## Big decision: who runs the agent?
>
> - **Listspace runs it:** one click for users, but we pay for model calls, handle API keys and runaway costs, and become an agent platform next to Rovo and Zapier. Large scope.
> - **Bring your own agent:** Listspace stores the rules and fires the webhook; the user's own Claude Code (scheduled or webhook-triggered) does the work. No compute cost, fits "your agent, your board", builds on what is already shipped.
>
> Suggestion: start with bring your own agent; consider hosting later if testers ask for it. Candidate Pro feature (covers "automation rules" from the Trello-inspired list).
>
> Related: "Plan in ChatGPT, Claude picks up the todos on its own" (the workflow this would automate), "Pro features inspired by Trello's paid plans".

### Plan in ChatGPT, Claude picks up the todos on its own

> Plan work in ChatGPT (or any chat app) onto the board, and let Claude pick up the To Do items autonomously, without a human prompting each one.
>
> The board side is built and in Done ("Agents use Listspace autonomously": claim_item, release_item, next_item, start_session, webhooks, Agent access with the Inbox). What is missing is something that wakes Claude up, because a chat app only acts when you type.
>
> ## Options
>
> 1. **Scheduled Claude Code session.** Runs on a timer (every morning or every hour), calls next_item, claims the item, does the work, moves it along and leaves a summary. Simplest to set up.
> 2. **Webhook-triggered.** A Listspace webhook fires when an item lands in To Do; a small service starts a headless Claude Code or Agent SDK run with the Listspace connector. Real time, but more to build and run.
> 3. **Semi-autonomous.** Open Claude Code once and say "work through the To Do list"; it loops on next_item until the list is empty or it gets stuck.
>
> ## Notes
>
> - Run the unattended agent at level 3 (Capture) or 4 (Act), not 5 (Full), so completing and archiving go to the Inbox and nothing reaches Done unseen.
> - Builder use case: needs setup, not for the non-technical testers. On the website, phrase it honestly as "plan in ChatGPT, Claude Code picks it up on a schedule".
> - Could become a product feature later: a "run my agent on this board" setting that handles the schedule or webhook for the user.
>
> Related: "Agents use Listspace autonomously" (Done), "Agent rules: agents that listen to lists and act" (the product feature that would automate this), "Use cases for the website" (use case 3).

### Message board: announcements on a board

> Taken from Basecamp (9 Oct). Teams need a place for announcements that aren't tasks: "from Monday we use the new brief", "the client approved the homepage", "Sara is off next week".
>
> - A list kind "Updates": each item is a post with a title, text and author (person or agent).
> - New posts reach every board member: in the daily or weekly email, in the catch-up summary, and in their assistant at the next session.
> - Agents can post too, for example a weekly "what moved" update; at lower Agent access levels a post waits in the Inbox first.
> - Comments on a post work as replies, so no separate chat is needed.
>
> Later than Team, catch-up and requests. Related: "Listspace vs Basecamp" (Ops), "Catch up: what happened since I was last here?", "Requests between people, through their assistants".

### Video and animations

- Due 2026-10-25. Not done

> One shoot, three cuts (merged from "Tour video and polished visuals", "Conversation animation with Claude" and "How-to clip for testers" on 7 Oct):
>
> 1. **Tour video, 60 seconds:** a coding session where the board fills up live as the agent works. For the homepage and launch posts.
> 2. **Conversation animation:** an animated chat between a user and Claude. Asking what is pending, adding an idea, moving items, with the board updating alongside the conversation. For the homepage hero and social posts.
> 3. **How-to clip for testers, about 60 seconds:** only the connect flow, step by step. Claude desktop (Settings, Connectors, add Listspace, sign in) and ChatGPT (Apps). The word "MCP" does not appear. Re-cut it to the one-click version once Listspace is in the connector directories.
>
> Plus short clips of 10 to 15 seconds cut from these for social media. Record after the header and modal changes, so the app looks final.
>
> ## 4. Explainer videos for companies (added 8 Oct)
>
> Very clear explanatory videos for companies such as agencies and brand consultancies: people who use ChatGPT or Claude every day but do not code. The cuts above are aimed at builders (a coding session, a connect flow), so this audience needs its own set.
>
> - **Main explainer, 2 to 3 minutes, no jargon:** a client project, not code. One person plans in ChatGPT, another works in Claude, and the board keeps everyone's work and decisions in one place. What it is, why it helps, what it costs.
> - **Short use-case clips, about 60 seconds each:** one per use case from "Use cases for the website" (new chat without re-explaining, the Inbox, one document across assistants).
> - **Trust clip:** where the data lives (own server in Europe), who sees what, what agents may and may not do (Agent access). Companies ask this before anything else.
> - No words like MCP, connector setup or API. Business language, real project, voice-over plus captions.
> - A team version needs private sharing and shared boards first; until then show one person's project.

### Multi-language: English, Spanish, German and Dutch

> Site and app in four languages, English first.
>
> **What it takes:**
>
> - Move all text into translation files (react-i18next or similar). This is the biggest job, because the text now sits directly in the components.
> - A language switch, plus detection from the browser.
> - Language-specific URLs for the public site (/es/, /de/, /nl/) with hreflang, so search engines and AI find each version.
> - Emails in the user's language.
> - Translated legal pages.
> - The MCP tool texts stay English, because agents handle that fine.
>
> **Estimate:** roughly two or three PRs. The first moves the text out of the components. The second adds the languages for the app and emails. The third covers the public site with separate URLs. The translations themselves can be drafted by AI and checked by a native speaker per language.

### Parallel agents on one board: Listspace's answer to Claude Projects

> Jordi, 11 Oct: Claude Projects runs several agents at once and reports back. How do we offer that too?
>
> **Principle:** Listspace doesn't run agents itself. That would mean an AI bill, breaks "no AI costs, it uses the assistant you already have", and competes with Anthropic on its own ground. Instead, Listspace is where parallel agents **coordinate**, from any vendor: the user's own agents do the work, the board keeps them apart and shows what's happening. Claude Projects can't do this across Claude, Codex and Cursor, or for a team.
>
> Most pieces exist already: next_item and claims (two agents never take the same item), webhooks, catch_up, my_items, the Inbox.
>
> ## Build
>
> 1. **Agents panel on the board** (the "Overview" equivalent). Per agent and per claimed item: working, waiting on you, ready for review, done, with the last update time. A dot on the board header when something waits on you. Built from claims, history and the Inbox.
> 2. **A "Ready for review" status** for items: an agent marks work as ready, with a link to its pull request or document. The person approves (moves to Done) or sends it back with a comment.
> 3. **Parallel in one sentence.** "Work through To do with 3 agents": a ready-made Listspace skill (Claude Code, and the same instructions for Codex and Cursor) where the coordinator starts sub-agents and each picks items with next_item, does the work, reports on the item and takes the next. Shipped as a skill or plugin and a copy-paste prompt.
> 4. **Waiting on you goes to For you.** When an agent needs a decision, it sends a request to the person (see "Requests and tasks between people (and agents)") and moves on; the person sees it in For you and in the next catch-up.
> 5. **A run report.** At the end, a short summary: done, ready for review, waiting on you, skipped and why. Saved as a comment on the board, so the next session and other people see it.
> 6. **Mixed vendors as the demo.** Claude Code, Codex and Cursor working the same To do list side by side. The video for the launch week.
>
> ## Later
>
> Agents that keep working after you close your laptop, through Claude Projects or Codex cloud tasks using the Listspace connector (a guide, not a build), or through a runner people host themselves.
>
> Related: "Your agent works your list", "Requests and tasks between people (and agents)", "For you", "Catch up", "Watch: Claude's new Projects" (Ops).

### Team boards: keep a busy board readable, board access, agent levels per member

> Question (9 Oct): if a team of 10 works on one board, with 10 assistants capturing, the board explodes. And should Agent access be set per member, with a gatekeeper approving?
>
> The number of items is not the real problem (Trello teams live with hundreds of cards). The problems are **noise** (everything captured goes straight into view) and **duplicates** (ten agents capture the same idea ten times).
>
> ## Decided (9 Oct)
>
> **Keeping a busy board readable**
>
> - **A board is a project, not a team.** One board per project keeps each board small. Say this in onboarding and templates.
> - **"Mine" view by default.** Each person sees what they or their agent own or claimed, plus unassigned items in To do. Filters by person, agent and label.
> - **Agents search before they create.** Before adding an item, an agent searches the board; if a match exists, it comments or adds to it instead.
> - **Agent captures go to Ideas, not To do.** Moving to To do is triage, by a person or an agent with a high enough level.
> - **Done cleans itself up.** Done shows the last two weeks; older items archive on their own. Archived items are in the board menu (Archive > archived items) today, for the whole board. Add: a filter by list in that view, and a "Show older items" link at the bottom of Done that opens it filtered to Done.
>
> **Agent access per member, Team v1**
>
> - **Effective level = the lowest of** the team maximum, the board level and the member's level.
> - **Approvers, not one gatekeeper.** Board owners plus members marked as approver. A suggestion goes to the owner of the item it touches first, then to the approvers.
> - **Only some changes need approval:** completing, archiving, moving to Done, editing documents. Capturing and commenting don't.
> - Approval rules per list or per label wait for Business.
>
> **Who sees which board**
>
> - Boards in a team are **private by default**: only people the board owner invites have access. When inviting, the owner sets the role, the member's agent level on this board, and whether they can approve the Inbox.
> - **Team-visible boards (optional).** The owner can mark a board visible to the whole team: everyone can find it and join, nobody is added automatically.
> - **Team admins can reach every board**, to take over ownership when someone leaves or a board is orphaned; also for billing and export. Admin changes are in the history.
> - Admins see private boards **only on the team admin page**, not in their own board list.
>
> ## Proposed: roles
>
> Rule: **an agent never gets more rights than its person.**
>
> Two levels of roles, kept apart:
>
> **Team roles** (for the whole team): **Team admin** (billing, members, team maximum level, reach to every board) and **Member**.
>
> **Board roles** (per board, four):
>
> | Role | The person can | Their agent can |
> | --- | --- | --- |
> | Owner | Everything, plus invite people, set roles and levels, board settings | Up to the owner's level |
> | Editor | Work on the board | Up to the member's level |
> | Commenter | Read and comment | Read and comment; other changes go to the Inbox as a suggestion (level 2) |
> | Viewer | Read | Read only (level 1) |
>
> - A board can have **more than one owner**, so it never hangs on one person.
> - **Approver is a switch, not a role.** Owners always approve; an owner can switch it on for editors.
> - Commenter fits clients and outside guests: input without changing the board.
>
> Related: "Business plan for companies (50+ users): first shape", "Who is the first Team customer?", "Plans: Free, Pro, Team, Business, Enterprise", "Share a board privately with someone".

### Mobile app: the functions people need on the go

> Jordi decided on 13 Oct 2026 which functions the mobile app needs. These are the things people do away from their desk.
>
> **For everyone**
>
> - Quickly add a new item to a board or list
> - See your due items
> - See your boards and lists
> - Share a board and add people
> - The Inbox on the go: accept or reject agent suggestions, confirm decisions
> - Notifications: mentions, requests for you, new Inbox items
> - For you and requests
> - Search across boards
> - Quick capture from other apps via the share sheet: a link, photo or text to a list
> - Mark done and comment on an item
>
> **For the admin**
>
> - Invite people
> - Suspend accounts
> - Reports and feedback
> - A glance at the numbers: sign-ups, payments
> - The service status

### Suggest role for people, reject with a comment, and send back (review workflow for teams)

> Jordi, 13 Oct 2026, from a researcher scenario. A head researcher has a team that adds research outcomes to a board. Everything the team adds must be approved by the head researcher only. On a rejection, the head researcher wants to send a comment back to the person who added it.
>
> **Decided, keep it simple:**
>
> 1. **A "Suggest" role for people** (guests and team members), next to View, Comment and Edit. Everything they add or change lands in the owner's Inbox (or the approvers' on a team), like agent level 2. **People who suggest don't see the Inbox** their suggestions end up in.
> 2. **Reject with a comment:** the comment goes back to the person who suggested it, through For you and an email.
> 3. **Send back:** instead of rejecting, the suggestion returns to the person as a request with the owner's comment (for example "Add the source and suggest it again"). The person adjusts it and suggests it again.
> 4. Reject with a comment also works for agents' suggestions. The agent gets the comment in its results.
>
> **Fits:** Team roles (#284) as a fourth role; schools (a student suggests, the teacher approves); editors and clients.

### Labels per board or label groups, once account labels grow too big

> Jordi, 14 Oct 2026: labels belong to the account (team spaces have their own team labels), so channel labels from social client boards (LinkedIn, X, Facebook...) also show on boards that have nothing to do with social. Fine for now; revisit when the label list grows.
>
> Options to weigh then: labels that belong to one board (made from a template), label groups (Channels, Priority) you show or hide per board, or a filter that shows only labels used on this board in the picker (smallest change, may be enough).

## To Do

> Tasks ready to start

### Test the Trello and Notion imports

> Jordi, 24 Oct. Import a real Trello board export and a Notion export. Check lists, items, labels, checklists, comments, attachments and due dates against the source.

### Test Safari on a Mac

> Jordi, 24 Oct. Sign in, open a board, drag items, open an item, upload a file, For you, settings. Note anything that looks or works different from Chrome or Edge.

### Test Cursor, Windsurf and GitHub Copilot in VS Code

> Jordi, 24 Oct. In each: add mcp.listspace.app as a remote MCP server, sign in, read a board, add an item and move one. Note setup steps for /connect. Copilot in VS Code goes in the hero's coding agents line once it passes (say "GitHub Copilot in VS Code", not "VS Code").

### Launch weeks: LinkedIn posts for the waitlist (for Jordi to edit)

> Goal: waitlist sign-ups. Each post follows the Post Blueprint's launch shape (situation, the turn, what it does and does not do, a bare link) or is an episode with a door, so it stays inside the Content Bible's trust phase: no "sign up now", no "DM me", the link sits at the end on its own. Links carry ?ref=linkedin so the waitlist shows where people came from.
>
> The plan (Jordi, 21 Oct): Thursday 22 Oct is the real launch.
>
> | Day | Lane | Post |
> | --- | --- | --- |
> | Thu 22 Oct | Building in Public | The launch post |
> | Fri 23 Oct | Playbook | The Friday board |
> | Thu 29 Oct | Building in Public | Going from building to marketing Listspace |
> | Fri 30 Oct | Playbook | How I keep a project up to date without updating it |
> | Thu 5 Nov | Building in Public | 96 decisions in public |
>
> ## Thursday 22 Oct: the launch post
>
> About 170 words. Link in the body.
>
> ```text
> You don't need a better project tool. You need one that updates itself.
>
> I ran an agency for twelve years. Every board we used worked for a week. Then the work moved on in calls, chats and email, the board fell behind, and someone spent Friday afternoon catching it up.
>
> Listspace launches today. It is a project board your AI keeps up to date. You tell Claude or ChatGPT what happened, in the chat you already use, and the board follows: items move, notes get added, decisions are recorded with their reason. The next chat picks up from there, in any AI you connected.
>
> You stay in charge. You decide how much your AI may change on its own. Anything more waits in an Inbox for your OK, and a decision only counts once a person confirms it. Listspace runs no AI of its own, so there is no AI fee on top of the plan you already pay for.
>
> It is invite-only while a small group tests it. The first invites go out from the waitlist.
>
> listspace.app/waitlist?ref=linkedin
> ```
>
> ## Friday 23 Oct, Playbook lane: the Friday board
>
> About 170 words. Link in the body (record the arm for the link test).
>
> ```text
> It's Friday, 4 pm. Your Trello board still says it's Monday.
>
> I ran an agency for twelve years, and that was every Friday. The work had moved on all week, in calls, chats and email. The board had not. So someone spent the last hour of the week making it true again, and usually that someone was me.
>
> That hour is what Listspace takes away. You already tell your AI what happened while you work, in Claude or ChatGPT. Listspace gives it a board to keep. It moves the item, adds the note, and records what was decided and why. On Friday the board is already right.
>
> It does not do the work for you, and it does not decide for you. You set how much your AI may change on its own. Anything more waits in an Inbox for your OK, and a decision only counts once a person confirms it.
>
> Listspace is invite-only while a small group tests it. New invites go out from the waitlist.
>
> listspace.app/waitlist?ref=linkedin
> ```
>
> ## Thursday 29 Oct, Building in Public: going from building to marketing Listspace
>
> Jordi's own text (written 19 Oct, it was scheduled for 22 Oct and is moved here). Link in the first comment. One edit: "after that I start telling more people" became "now I am telling more people", since the launch post has gone out by then. Check that it still reads right.
>
> ```text
> Two of my products have been live for a long time, and I have done no marketing for either. BookmarksIQ and Vendo Mis Juguetes work, a few people use them, and almost nobody knows they exist.
>
> It was not that I did not want to. Both times I was already working on the next idea, and the next idea won. I could have built in public as I went. I preferred to build in silence until a thing was finished, and then I moved on.
>
> My new SaaS, Listspace, will be different, and the reason is something I noticed over the last month. I have used it every day for all my projects, and it has become the place where my work lives. My agents read from it and write to it, so it stays up to date without me nursing it. I never got that from Trello or Jira. Th [cut short; open the board for the rest]

### Launch in communities, Field Report

> - skills.sh, Claude Code plugin, MCP lists (Smithery, PulseMCP, Glama, mcp.so)
> - r/ClaudeAI, r/ChatGPTCoding, Show HN, Product Hunt
> - A Field Report after a month of building Listspace with this board, with real numbers

### Remove duplicate content on the site (one place per thing): review the proof images, then one fix PR

> Duplicate-content check of listspace.app, redone on 24 Oct (the first run was 21 Oct): the same content on several public pages, against the rule "one place per thing". 98 public pages crawled from the sitemap (legal and sign-up pages left out), compared paragraph by paragraph, then checked by hand. The proof images are attached to this item (one per finding, red outline around the repeated part) and saved in `C:\Users\jordi\Documents\GitHub\listspace-dupcheck\`. The overview is 00-overview.png (use the newer of the two: the first one says 9 findings to fix, the right count is 10).
>
> **To fix (8 from 21 Oct still there, 2 new):**
>
> - **01 Agent access levels** (01-agent-access-levels.png). The five levels are written out on / (twice: the Agent access section and the FAQ "What is agent access?"), /help/inbox-and-agent-access, /guides/choose-how-much-your-ai-may-change and /docs/agents. Home: /help/inbox-and-agent-access. The others: the home section and FAQ become one line and a link; the guide and /docs/agents link to the list instead of repeating it (/docs/agents keeps its per-action table).
> - **02 Roadmap vs features, and now the changelog too** (02-roadmap-features-changelog.png). /roadmap "Shipped" (about 95 entries) repeats /changelog and /features. Home: /changelog for what shipped and when, /features for what the app does. /roadmap keeps Next and Later, with one line linking to the changelog.
> - **03 Home pricing vs /pricing** (03-home-pricing.png). / shows the Free and Pro plans with prices, the yearly price, the founder offer and the trial, and the FAQ "Is it free?" repeats it. Home: /pricing. The homepage becomes one line with the price (from PLAN_PRICES) and "See the plans"; the FAQ answer becomes one line and a link.
> - **04 Prices typed by hand** (04-hand-written-prices.png). /compare (src/content/compare.ts line 101), /help/teams (src/content/help/articles/teams.ts line 19) and the /pricing meta description (src/content/pageMeta.ts line 125, also "5 guests" and "50 GB") type the amounts themselves. Home: PLAN_PRICES, TEAM_PRICES and PLAN_LIMITS. The three texts read from them.
> - **05 Decisions explained twice** (05-decisions.png). Explained in full on / (the Decisions section and the FAQ "What are decisions?"), /how-listspace-remembers, /help/decisions and /guides/record-decisions-your-ai-works-from. Home: /how-listspace-remembers for what a decision is and why, /help/decisions for how. The home section and FAQ become a short summary and a link; the guide keeps its steps and links to the help article for the reference parts.
> - **06 "Safe by design" vs the Trust page** (06-safe-by-design-vs-trust.png). The seven points on /features repeat /trust. Home: /trust. /features becomes one line plus the link it already has.
> - **07 Supported apps lists** (07-supported-apps-lists.png). /help/which-apps-work repeats the whole "Works well next to Listspace" list of /works-with word for word, and lists every app by kind again. Home: /works-with. The help article becomes a short answer and a link. The per-app connect steps on /docs/mcp are fine.
> - **10 Claude connect steps** (10-claude-connect-steps.png). The same click steps are on /setup, /help/connect-claude-or-chatgpt, /docs/mcp, /connect and in the homepage demo. Home: /setup for people; /connect stays as the version for the AI. The help article and /docs/mcp become one line and a link to /setup. Homepage demo: optional, shorten the AI's reply.
> - **11 New: the Trust page says everything twice** (11-trust-says-it-twice.png). /trust opens with "How we keep your data safe" (about 55 points) and then repeats each topic in the detailed sections. Home: the detailed sections. The overview becomes a short list of links to them.
> - **12 New: guides repeat help articles word for word** (12-guides-repeat-help.png). For example /guides/draw-a-diagram-with-mermaid and /help/mermaid-diagrams, /guides/see-your-board-as-a-table-or-calendar and /help/calendar-feed, /docs/agents and /help/let-yo [cut short; open the board for the rest]

### Test how well AI apps pick the right Listspace tool

> Listspace offers about 130 tools over MCP. Guidance from Anthropic says tool choice gets less reliable past roughly 30 to 50 tool definitions, unless the app loads tools on demand (Claude Code does, ChatGPT and Claude.ai may not).
>
> Test before deciding anything:
>
> - About 10 typical tasks: add this to my board, what's due this week, record this decision, move this to Done, what changed since yesterday, start a board for a new project, attach this file, what waits in the Inbox, catch me up, plan this week.
> - Run each in ChatGPT and in Claude.ai, twice (failures can be intermittent).
> - Note per task: right tool first time, wrong tool, or extra calls before the right one.
>
> Only if it goes wrong often: group tools by what the user wants to do, or slim the set apps see up front.
>
> Source: https://claude.com/resources/articles/building-agents-when-to-fold-subagents-into-your-main-agent-loop

## Doing

> Awaiting info, approval, or prerequisites

### Directory listings: Claude, then ChatGPT

- Labels: Priority

> After the agent surface is complete. Claude: annotations, privacy policy, docs with example prompts, reviewer account. ChatGPT: verified organization, domain proof, 5 positive and 3 negative test cases.

### ChatGPT directory: plugin package and domain check

> Plugin package updated (8 Oct): the test cases now run on the real reviewer account and don't depend on the date; starter prompts are generic. ZIP built and checked. Waiting on: OpenAI business verification (Jordi), then the domain token from the dashboard, which goes in the same PR as a file on listspace.app plus a small nginx block. Then the demo video and the submission.
>
> Branch `chatgpt-plugin-package` (local, not pushed yet).

### Capture from Slack, Teams, WhatsApp and email, and push notifications when an agent needs your OK

> Jordi, 19 Oct 2026: "these two features are golden". Effort estimate, cheapest first:
>
> 1. **Email to board:** built, switched off (On Hold). Turning it on is a server change plus a hand test. About 0 to 1 PR.
> 2. **Push notifications:** web push for the installed app. It works on Android, desktop and iPhone (iOS 16.4+, added to the home screen). Needs a service worker, a subscription table, server keys, and sends from the functions when a suggestion or decision waits, with per-type settings. About 2 PRs.
> 3. **Slack:** a Listspace Slack app with a "Save to Listspace" message action and /listspace. Needs OAuth install and the events API. About 2 to 3 PRs. Works unlisted at once; the Slack directory listing takes a review.
> 4. **WhatsApp:** Meta's Business API needs business verification, per-conversation fees and message templates. About 2 to 3 PRs plus the waiting time. A forward-to-email address is a cheap first step.
> 5. **Teams:** an Azure bot registration and an app manifest, the most friction. About 3 PRs. Do it when Team customers ask.
>
> Suggested order: email on, push notifications, Slack, then WhatsApp and Teams on demand.

### Check "your agent" vs "your AI" everywhere

> Jordi, 22 Oct: check where the copy says "your agent" and where it says "your AI", and make it consistent.
>
> **What is already settled:**
>
> - The headline says "Your AI forgets. Listspace remembers."
> - The app's menu changed "Connect your agent" to "Connect your AI" (fact fix, 14 Oct).
> - The setting is called "Agent access" (Content Bible, section 7).
>
> **Suggested rule, for Jordi to confirm:**
>
> - **"Your AI"** in everything a general reader sees: the site, emails, posts, onboarding, the menu. Not everyone knows the word "agent", and the Content Bible says Listspace is for people who aren't technical too.
> - **"Agent"** only where it is a name or a technical term: "Agent access", "coding agents" (Claude Code, Codex, Cursor), the developer docs and the MCP tool descriptions.
> - Never mix the two in one sentence or on one screen without a reason.
>
> **Where to check:** the homepage (hero, FAQ, Agent access section), pricing, /connect, /compare, /use-cases, the About page, the Trust page, help articles, onboarding, settings, the emails (daily summary, invites), the sales documents and PDFs, the Content Bible and Post Blueprint, the LinkedIn profile, and the MCP directory listings.
>
> **Then:** add the rule to the Content Bible's word list (section 6).

### iPad: extra line break in the For you items

> Jordi, 22 Oct, from a photo of the For you panel on the iPad (Work space, 7 items).
>
> **What happens:** every item has a blank line between its title and the line under it (board name · Due date). The rows are about twice as tall as they need to be, so only five items fit on the screen. It looks like an empty element or a forced line break between the title and the meta line, or a min-height that only applies at the iPad width.
>
> **Also check:** the meta line shows the words "Due date" for every item, without a date. Either it is a label with its value missing, or these items have no due date and the line shouldn't show at all.
>
> **Test on:** iPad Safari in portrait and landscape, and compare with the desktop and a phone. Look at the same rows in the full For you page ("See all in For you"), not only the panel.
>
> Related: "iPad date fields bug" (also on this board).

## Done

> Completed tasks and deliverables

### Inbox: show a decision's own reason, not a line about the confirm screen

> Jordi, 24 Oct: decisions from Claude Code showed "Your AI app couldn't show the confirm screen..." in the Inbox, which read like an error. Now the Inbox shows the decision's because, or nothing. PR #591, functions deploy after merge.

### Hero: add Bolt and Lovable to "and with coding agents like…" (test first), and GitHub Copilot in VS Code

> Jordi, 21 Oct: add Bolt and Lovable to the hero line "and with coding agents like…" on the homepage. Question: VS Code too?
>
> **What their docs say (checked 21 Oct):**
>
> - **Bolt:** Connectors page, then "Custom MCP server" with a URL, sign-in by MCP OAuth or an API key. Tools can read and write (Bolt's own examples edit Notion pages and create GitHub issues). It can be turned on per project. The docs don't say which plans include it. support.bolt.new/building/using-bolt/connect-mcp
> - **Lovable:** Connectors, then +, then MCP server with a URL, on all plans, sign-in by OAuth (or a token). The docs only describe reading ("live context in the project chat"); they don't say whether tools can write. Connections are personal per workspace member. docs.lovable.dev/integrations/custom-mcp
>
> **Test each one before it goes on the site** (Content Bible: we name only apps Jordi has tested; the others sit under "Also works with"):
>
> 1. Add mcp.listspace.app as a custom MCP server and sign in.
> 2. Ask it to read a board.
> 3. Ask it to add an item and move one. **Lovable is the doubtful one here.** If it can only read, it doesn't keep the board up to date, and it belongs under "Also works with", not in the hero.
>
> **VS Code:** yes, but say "GitHub Copilot in VS Code", not "VS Code". VS Code is the editor; the agent is GitHub Copilot's agent mode, which supports remote MCP servers. Test it the same way.
>
> **Then:**
>
> - Update the hero line with the apps that pass.
> - Add each one to /connect with setup steps and screenshots.
> - Update the Content Bible's list of named apps (section 6, "Works with").

### Handover email names the board

> The email for a board handover now says which board is handed over, in quotes, in the first line. The subject stays the same. PR #589, functions deploy (board-guests) after merge.

### Inviting someone new: say it lets them sign up (Share window, invite email)

> From the decision of 24 Oct 2026 (invite-others-wording).
>
> - Share window and team invites: a line when the address has no account yet.
> - The guest and team invite emails say the invite also gets them into the beta.
> - No "Invite friends" button.
>
> Same PR (internal admin part): the waitlist shows "Invite..." only when there is no working invite, and "Invite again" when it expired or was canceled.
>
> Branch: feat/invite-new-people (worktree listspace-wt-invite-new).

### Bug: signing out on a public board's address opens its public page

> Found by Jordi on 23 Oct 2026, right after #576 went live.
>
> Signing out keeps the page's address. Since #576 a signed-out visit to a public board's /board/<id> goes on to its public page, so the person who just signed out landed there instead of on the sign-in page.
>
> Fix in PR #580: a visitor who was just signed in on this browser gets the sign-in page again (like after the server ends a session); a visitor following a link still gets the public page. App only.

### Hand over and team moves carry the board's files

> From the decision of 23 Oct 2026 (board-handover-files). Follow-up to PR #579.
>
> Copy every stored file of a board (attachments, images in descriptions, uploaded background and avatar) to the new owner's storage when a handover is accepted, and when a board moves into or out of a team space. Then lift the "boards with files cannot be handed over" refusal and the matching team-move refusal.
>
> Branch: feat/handover-files (worktree listspace-wt-handover-files).

### Hand over a board to another account

> From the decision of 23 Oct 2026 (board-handover).
>
> - "Hand over board" in the board's "..." menu.
> - The recipient accepts first; the sender chooses to stay as an editor or leave.
> - History, instructions, decisions and files go along; agent levels reset to the new owner's; the new owner's plan limits apply.
>
> Needs a database migration (ownership transfer and a pending handover), so the deploy needs "OK database".

### Role pages: "Are you a designer?" with a story-style workflow per role

> From the decision of 23 Oct 2026 (role-workflow-pages).
>
> One page per role (designer, developer, project manager, and more), each with:
>
> - A short fictional story of a week of work with the tools the reader already uses (designer: Figma, Claude; developer: Jira, GitHub, ChatGPT; project manager: Slack, Google Docs, Claude).
> - The docs and how-tos that fit that role.
> - An entry point that asks "Are you a designer, developer, project manager...?"
>
> Builds on the profession pages at /use-cases/<slug>. Only claim integrations that really exist (Figma's MCP server, ChatGPT's MCP connectors, GitHub links); no fake ones.

### CLI reaches every MCP tool: listspace call, plus comment, update, list and new-board --template

> From the decision of 23 Oct 2026 (cli-mcp-parity).
>
> - `listspace call <tool> --json '{...}'` and `listspace tools` to list them, so the CLI matches MCP without hand work.
> - Short commands: `comment`, `update`, `list add`, `list rename`, `new-board --template`.
> - Docs on the site and the CLI README updated in the same PR.
>
> Why: setting up a board through CLI 0.4.0, an agent could not rename lists, comment or edit an item.
>
> Branch: feat/cli-mcp-parity (worktree listspace-wt-cli).

### Design check, 20 Oct 2026: inconsistencies and proposed rules

> Design check of the app and the public pages, 20 Oct 2026, for the audit item "Thorough design check: are we consistent in our use of elements across the app?". Nothing is changed yet: each finding has one proposed rule for Jordi to approve, reject or edit.
>
> **How it was checked.** The app preview (sample data, no database) and the public pages in Edge through Playwright, at 1280 wide with a mouse and 390 wide as a phone, light and dark: dashboard, For you, the board in each view (board, table, calendar, timeline), the item window (item and document, read and edit), every Settings section, Share, the Inbox, templates, labels, archived boards, the three import pages, the public board, the homepage, pricing, help and compare. Besides the screenshots, a script measured every visible button, heading, input, menu and dialog (height, size, weight, width), so the numbers below are measured, not guessed. The design system itself is sound (Button sizes sm 32, md 36, lg 44; Modal; Switch; MoreMenu; EmptyState); most findings are places that go around it.
>
> Each finding names its screenshot, attached to this document. The same files are in `C:\Users\jordi\Documents\GitHub\listspace-design-check\`.
>
> **Count:** 5 confusing, 14 inconsistent, 5 polish.
>
> # Confusing
>
> These can make someone misread the screen or miss a result.
>
> 1. **Primary and secondary buttons look the same in light mode.** In light mode both are ink-filled, so the Share window shows three equal black buttons (Invite, Copy link, Save username) and nothing says which one matters. In dark mode the same three split into yellow and light grey, so the hierarchy only exists in dark. The same happens wherever primary and secondary sit together (item window footer, settings). Screenshot: `01-primary-and-secondary-look-the-same.png` (Share, light left, dark right). **Rule:** At most one filled button per screen or window, the main action. Every other action is outline or ghost. If secondary stays as a variant, it must look different from primary in both themes.
>
> 2. **On and off switches are hard to tell apart in dark mode.** In dark, on is a light track and off is a mid-grey track, both with a dark square knob; only the knob's side differs (Preferences, Notifications, Agents > Feedback). Screenshot: `02-switch-on-off-in-dark.png` (Decisions on, Delete archived items off). **Rule:** A switch that is on is filled with the accent (ink in light, yellow in dark); off is an outlined empty track. On and off must differ by more than the knob's position, at 3:1 contrast or more.
>
> 3. **A required-looking field saves empty with no error.** Clearing First name in Settings > Profile and pressing Save profile shows "Profile updated." and the avatar turns into "R". The field is not marked optional and shows no error. Elsewhere optional fields say "(optional)" (Away note, Create board description). Screenshot: `03-empty-first-name-saves-without-error.png`. **Rule:** A required field shows an inline error under itself on save and nothing is saved; an optional field says "(optional)" in its label. A form never saves silently past an empty required field.
>
> 4. **Red is used for advice.** Import from Trello shows a red "Privacy" box (danger colours) for a tip, under a grey info box and a sand warning box. Red elsewhere means an error or something destructive, so the import looks broken before it starts. Screenshot: `04-red-used-for-advice.png`. **Rule:** Red (the danger token) only for errors and destructive actions. Advice and caution use the warning notice; one notice per page where possible.
>
> 5. **Delete looks three different ways.** Archived boards: red outline button with trash icon. Templates: grey ghost "Delete", same weight as Edit. Labels: grey trash icon always visible. Board menu: "Archive board..." in plain text, while the item More menu and the comment menu put Delete in red after a divider. Screenshot: `05-delete-styled-three-ways.png`, and the menus in `13-menus-widths-icons-and-delete.png` [cut short; open the board for the rest]

### Draft: tester campaign texts (for Jordi to edit)

- Due 2026-10-22. Done

> ## Soft launch texts (updated 22 Oct): use these
>
> Since 15 Oct: a personal round with a handful of testers before sign-up opens. Sign-up is closed, so every tester joins through a personal invite (Admin > Invites) with the tester campaign attached. Jordi sends everything himself, one person at a time, in the channel where the conversation started (WhatsApp, LinkedIn message or email).
>
> **The offer (Jordi, 16 Oct):** testers get 30 days of Pro. Pro can be bought now (payments are live since 17 Oct); sign-up is invite-only and opens to everyone in November. When the 30 days end, testers choose: pay for Pro, or go on with Free and keep their boards. The 30 days do not add up with the 14-day Pro trial.
>
> The order: a short ask (1), the qualifying questions with the email address (2), the invite (3), the feedback questions (4). For friends who said yes right away, skip 2 and ask only for the email address. The questions can come after they've tried it.
>
> ### 1. Short ask
>
> **EN, for someone new to Listspace** (22 Oct: explains it with a picture and one example)
>
> ```text
> Hey [name], how's it going?
>
> You know how you keep re-explaining your project to ChatGPT or Claude? I've built something for that, and I'd love your honest opinion before I open it up next month.
>
> It's called Listspace: a to-do board for your projects, like Trello, that your AI can read and update. You tell Claude "the client approved the design, next up is the homepage", and it updates the board. The next day, in a new chat or even in ChatGPT, your AI already knows where things stand.
>
> I'm looking for a handful of people who use AI every day on real projects. Testers get 30 days of Pro for free. Would you be up for five short questions to see if it fits? No pressure if it's not your thing.
> ```
>
> **NL, voor iemand die Listspace nog niet kent**
>
> ```text
> Hoi [naam], hoe gaat het?
>
> Herken je dat je je project steeds opnieuw moet uitleggen aan ChatGPT of Claude? Daar heb ik iets voor gebouwd, en ik hoor graag je eerlijke mening voordat ik het volgende maand openstel.
>
> Het heet Listspace: een takenbord voor je projecten, zoals Trello, dat je AI kan lezen en bijwerken. Je zegt tegen Claude "de klant heeft het ontwerp goedgekeurd, nu de homepage", en het werkt het bord bij. De volgende dag, in een nieuw gesprek of zelfs in ChatGPT, weet je AI al hoe het ervoor staat.
>
> Ik zoek een paar mensen die elke dag AI gebruiken voor echte projecten. Testers krijgen 30 dagen Pro gratis. Zou je vijf korte vragen willen beantwoorden om te kijken of het bij je past? Geen probleem als het niks voor je is.
> ```
>
> **EN, for someone who knows Listspace from last year**
>
> ```text
> Hey [name], how's it going?
>
> You might remember Listspace, my project from last year. I've rebuilt it from scratch, and now your AI keeps the project boards up to date, so every new chat picks up where the last one left off.
>
> I'm opening it up next month and would love your honest opinion first. I'm looking for a handful of people who use ChatGPT or Claude every day on real projects. Testers get 30 days of Pro for free.
>
> Would you be up for five short questions to see if it fits?
> ```
>
> **NL, voor iemand die Listspace van vorig jaar kent:** use the NL text above, with the first two paragraphs replaced by "Je weet misschien nog dat ik vorig jaar aan Listspace werkte. Ik heb het helemaal opnieuw gebouwd: je AI houdt nu je projectboards bij, zodat elk nieuw gesprek verder gaat waar het vorige ophield. Ik stel het volgende maand open en hoor graag eerst je eerlijke mening."
>
> No link in the first message: it turns a personal note into a promotion. The link comes with the invite.
>
> **Test for the new-to-Listspace text:** when someone replies, ask them to say in their own words what it does. If they can, the text works.
>
> ### 2. The qualifying questions (reply to a yes)
>
> **EN**
>
> ```text
> Great, thanks! Five quick questions before I send you an invite. A few words each is plenty.
>
> 1. Which AI do you use in your work today (ChatGPT, Clau [cut short; open the board for the rest]

### Change my LinkedIn profile completely to Listspace

> Jordi, 20 Oct: rebuild his own LinkedIn profile around Listspace, so everyone who comes from a post lands on a profile that tells the same story.
>
> What to change:
>
> 1. **Headline:** founder of Listspace, plus the one promise, for example "Building Listspace. Your AI forgets. Listspace remembers."
> 2. **Banner:** a Listspace banner in the brand colors with the headline and listspace.app.
> 3. **About:** the core message from the Content Bible (one paragraph), how Jordi uses it himself (on the go, at the desk, second opinion), and one call to action. During the tester round that is "Become a tester": email hello@listspace.app with the subject "Tester". Once sign-up opens, it becomes "Try it for free".
> 4. **Custom button and website link:** listspace.app.
> 5. **Featured:** the live Build in Public board, the homepage, and later the tour video or animation and the launch post.
> 6. **Experience:** Listspace as the current role, linked to the Listspace company Page once that exists.
> 7. **Skills and topics:** AI agents, MCP, product building, Build in Public.
>
> Rules: the facts match the site and the Content Bible. No banned claims, no em dashes, US English. Jordi's own profile stays first person; the Listspace company Page carries the product voice.
>
> To decide: the profile also carries the YHD posts and other client work. Should those move to a short line under Experience, or disappear completely?

### Hero: add Grok and Gemini to the "Works with" line

> Jordi, 21 Oct: add Grok and Gemini to the "Works with" line in the homepage hero.
>
> **Conflict with the Content Bible:** section 6 keeps Gemini and Grok under "Also works with" until Jordi has tested them; posts name them only after that. Moving them into the hero means both are tested, and the Content Bible gets a new version (section 6, "Works with").
>
> **What their docs say (checked 21 Oct):**
>
> - **Grok:** grok.com/connectors, then New Connector, then Custom, with the server URL. xAI says connectors are available to all Grok users. On Business and Enterprise an admin must add the connector first. The docs don't say whether custom servers sign in by OAuth, or anything about writing. docs.x.ai/grok/connectors
> - **Gemini (the app at gemini.google.com):** Settings, then Connected Apps, then Other, then "Add a custom app" with the URL, with OAuth sign-in. According to a third-party setup guide (harvv.com/install/gemini, not Google's own docs), this option only appears on Google AI Ultra, for personal accounts. On Free and Pro it isn't there. Check this against Google's own help page.
>
> **Suggestion:**
>
> - **Grok:** in the hero once a test passes.
> - **Gemini:** if custom apps really are Ultra-only, a plain "Gemini" in the hero promises something most Gemini users can't do. Either write "Gemini (AI Ultra)" on /connect and keep it under "Also works with", or put it in the hero only once Google opens it to more plans.
>
> **Test each one:** add mcp.listspace.app, sign in, read a board, then add an item and move one. If it can't write, it can't keep the board up to date.
>
> **Then:** update the hero and /connect (with setup steps per app), and the Content Bible.

### Show Mermaid diagrams in the file viewer and in descriptions

> Jordi, 15 Oct: show Mermaid diagrams as pictures in Listspace instead of as code.
>
> 1. **File viewer:** an attached `.mmd` or `.mermaid` file opens as the drawn diagram, with a switch to see the source.
> 2. **Descriptions and documents:** a ```mermaid code block shows as the diagram. This is probably the bigger win, because assistants write markdown and can put a flowchart or a timeline straight into an item.
>
> **How:** draw it in the browser with the open source mermaid library, loaded only when a diagram is on screen (it is a large library). There is no server work and no AI cost.
>
> **Safety:** diagrams come from users and agents, so draw them in strict security mode (no scripts, no raw HTML, no click handlers), ideally inside a sandboxed frame. The library has had cross-site scripting bugs in the past, so pin the version and keep it updated.
>
> **Extras for later:** download as SVG or PNG, zoom and pan for large diagrams, and dark mode colors.
>
> Related: the after-v1 architecture, database and UX maps (Ops board), which would be written in Mermaid.

### Recurring items, installable mobile web app

> - Recurring items for routines and reviews (also for the bookkeeping and CRM templates: monthly and quarterly deadlines).
> - An installable mobile web app to check what your agents did from your phone. The same app can be a share target ("Share to Listspace").
>
> The command palette and keyboard shortcuts are done (PR #128, 7 Oct).

### Constance lessons for Listspace: claims audit, credential guard, guardrail tests, "Still true?" for old decisions, decision outcomes

> Jordi, 20 Oct: yes to all five lessons from the Constance and Continuity SDK review (no changes to those repos or the papers).
>
> 1. Public claims vs code audit before Thursday (read-only report, then a copy PR).
> 2. Credential guard: agents can't store passwords or keys; people get a warning.
> 3. Guardrail tests: every MCP tool and REST route against the core guarantees.
> 4. Decisions: a "Still true?" check after 180 days in the board gardener (migration 20261054000000).
> 5. Decisions: record how a decision turned out (migration 20261054200000).
>
> Agents building each in its own worktree. Also: PR #501, Remind me compact in the item window (Jordi's screenshot).

### Settings: group "Your AI" and "Capture and connections" (do Wed 22 Oct, when Jordi is up)

- Due 2026-10-22. Done

> Jordi, 21 Oct 2026: agreed. Slack and Telegram are hidden on the Your AI page. Split into two groups, one place per thing:
>
> - **Your AI:** connecting AI apps, agent access, guidance for agents.
> - **Capture and connections:** Slack, Telegram, email to a board, the calendar link (and the phone share where it fits).
>
> Show what is connected at a glance (the current value in the row, e.g. "Telegram: connected as J. B."). Update help paths and guides that name the old places. Start when Jordi wakes up on Wednesday, not before.

### Optional welcome after sign-up: connect your AI, import, sample board, and decisions (do Wed 22 Oct)

- Due 2026-10-22. Done

> Jordi, 21 Oct 2026: agreed. One optional welcome screen after sign-up, skippable, at most three steps, everything still reachable later:
>
> 1. Three one-click choices: "Connect your AI", "Import from Trello, Notion or CSV", "Explore a sample board" (the Northwind Coffee demo board, as a copy in the user's account).
> 2. One yes or no with the benefit: "Keep decisions your AI can't overrule?" (turns decisions on or off for new boards).
>
> It steers users to the features that matter without forcing anyone; it may replace or shorten the First steps checklist (check overlap, one place per thing). Start when Jordi wakes up on Wednesday, not before.

### Repeating due dates: monthly, yearly (subscriptions, renewals)

> Jordi, 16 Oct: make a due date repeat, for example monthly or yearly, as on his Subscriptions board (Claude, renewals). When a repeating item is ticked done, the next due date is set and the item stays (or a new one is made, to decide). Related to the captured idea "Recurring items, installable mobile web app". Things to decide: every N days, weeks, months or years; a fixed day of the month; what happens to checklists and comments on the next round; and how the AI reads and sets it.

### Plan: a homepage with more variety and fewer blocks

> Jordi, 16 Oct: make the public homepage more varied, with fewer blocks. Plan by Claude, for Jordi to approve.
>
> ## What's wrong now
>
> The page has about ten sections in a row: hero, pain, three steps, Agent access, one board for all agents, three ways to connect, feature tiles, use cases, pricing, FAQ. Most of them are grids of cards, so every section looks the same, the eye has nowhere to rest, and the main point (one board your AI reads and keeps up to date) gets lost between the tiles. Three sections tell the same story: three steps, one board for all agents, and three ways to connect.
>
> _Note: Claude could not open the live page from its session. This list comes from the homepage items on this board, so check it against the real page first._
>
> ## Rules for the new page
>
> - **One card grid on the whole page, at most.** Every other section uses a different form: a picture, a diagram, a table, an interactive control, a quote or plain text.
> - **Show, don't tile.** Real screenshots and the board itself instead of icons with three lines of text.
> - **Fewer sections:** from about ten to seven.
> - **Alternate the rhythm:** full width, then text beside a picture, then a dark band, then narrow text. Vary the backgrounds.
> - **One call to action**, repeated, never competing. During the tester round: "Become a tester". Once sign-up opens: "Try it for free".
> - **Facts follow the Content Bible:** the four true points, Act as the default, and no "every new chat starts from zero".
>
> ## The new order
>
> 1. **Hero:** "Your AI forgets. Listspace remembers." with the subline, one button, and on the right a moving picture of a board filling up while an AI works (the What's Still True animation or a short screen recording). The "Works with" logos go in one quiet row underneath. _Form: text beside an animation._
> 2. **The problem:** the four true points as a short text, next to one picture. Claude, ChatGPT and a coding agent each have their own memory bubble, then they all point at one board. _Form: diagram plus plain text, no cards._ This replaces the pain cards.
> 3. **How it works:** one horizontal loop. You ask, it reads the board, it works, it updates the board, bigger changes wait in your Inbox, you approve. "Three ways to connect" shrinks to one line under it: "Connect Claude, ChatGPT, Claude Code, Codex or Cursor by signing in. Set up in 2 minutes" with a link to /connect. _Form: diagram._ This merges three current sections into one.
> 4. **Agent access:** an interactive slider from 1 to 5 that starts on 4 (Act). Moving it shows what the AI does on its own and what waits in the Inbox at that level. _Form: an interactive control on a dark band._ It is the most distinctive feature, and this makes it something to play with instead of a block.
> 5. **Proof, from our own work:** "This board is kept up to date by the AI that builds Listspace", with a large screenshot of the Build in Public board and a link to the live board. Under it, the founder story as a short timeline: On the go, At the desk, Second opinion. _Form: a large picture and a timeline._
> 6. **What you get:** three features, alternating left and right, each with a real screenshot: decisions that only a person confirms, the Inbox, and guests with live updates. All other features go in a compact two-column checklist without boxes. Use cases move to /use-cases with one link, or become a small tab switcher (builder, freelancer, student). _Form: zigzag plus a list._ This is the only place where a grid could stay, if anything.
> 7. **Pricing and FAQ:** Free and Pro as one comparison table, not two cards, with the founder offer in one line under it and Team as "in beta". Then the FAQ as an accordion with 6 to 8 questions, including the default level (Act). The page closes with one call-to-action band and the line "Listspace also works fine on its own".
>
> ## Order of work
>
> 1. **Now, before the tester call:** the fact fixes (see "Fix: the site still says level 3 is the default").
> 2. **During the tester round:* [cut short; open the board for the rest]

### "Shared with you" invite card: show the board's background

> Found by Jordi, 16 Oct: the dashboard card for a board invite ("Jordi Buskermolen invited you to a board", Join / Decline) shows an envelope on a plain grey area instead of the board's background (or the Listspace default), and no board name. Show the board's background and its name, like the other board cards.

### Board export includes an older file version it should leave out

> Found 16 Oct by the files test suite on a fresh test stack: the check "export_board leaves the older version out" fails on main, not caused by the PR that ran it. Look at how export_board picks file versions, fix it, and make the check pass in CI.

### Rank above listspace.io for "listspace" on Google and Bing

- Due 2026-10-16. Done

> Jordi, 13 Oct 2026: listspace.io (an unrelated, very simple list app called "ListSpace") ranks first for "listspace" on Google and Bing. Listspace must end up above it.
>
> **Done already:** clean titles and descriptions, WebSite and Organization structured data named "Listspace", canonical URLs, a sitemap with 59 pages, IndexNow on every deploy, the MCP Registry and Smithery listings.
>
> **Next, roughly by effect:**
>
> 1. **Links to listspace.app from strong, related sites:**
>    - the MCP directories (Glama, PulseMCP, mcp.so, the Claude and ChatGPT directories)
>    - Product Hunt and Show HN at launch
>    - the GitHub repo README
>    - a Listspace page and link on yellowhousedigital.com
>    - an updated Devpost page (Jordi)
>    - AlternativeTo and SaaS directories
> 2. **Brand profiles that point to the site:** a LinkedIn company page, an X account, GitHub. Add them as `sameAs` in the Organization structured data once they exist.
> 3. **Search Console and Bing Webmaster Tools:** sitemap submitted, URL inspection, then watch "listspace" impressions and position weekly.
> 4. **Content:** notes, use cases and comparison pages keep adding indexed pages around the brand; listspace.io has one thin page.
> 5. **Consistent naming everywhere:** "Listspace", always linking listspace.app.

### Sign-up with a campaign invite: one message, not a campaign code and an invite code

> Jordi, 16 Oct: a sign-up page from an invite that carries a campaign shows both "Code TESTERS: 30 days of Pro..." and "Invite code XXXX" with its own line, which is confusing (also on a canceled invite). Show one block: "Your invite works. It includes 30 days of Listspace Pro (TESTERS)." and the address hint; on a canceled or expired invite, only the error, without the campaign line.

### Sign-up from a board invite: say "You were invited to a board", not an invite code

> Jordi, 16 Oct: someone invited as a guest who signs up from the board invite sees an invite code on the sign-up page. It's needed (the board invite lets them in while sign-up is closed), but the page should say "Jordi Buskermolen invited you to Content calendar" and hide the code, which means nothing to a guest.

### First steps: "0 of 2 done" while the card shows 5 steps

> Found by Jordi, 16 Oct: the First steps card says "0 of 2 done" but lists five steps (one marked Optional). The count only covers the required steps. Make it match what's shown: "0 of 4 done" (Optional not counted), or mark which steps count.

### An empty board: "Start from a template" in the board menu

> Jordi, 16 Oct: a board without lists offers "Start from a template" (in the board's "..." menu and in the empty-board message next to "Add the first list"). It adds the template's lists, starter items, labels and AI instructions. Only for boards with no lists; once a board has lists, the option is gone.

### Every template gets a "How to use this board" starter item

> Jordi, 16 Oct: some templates start with a "How to use this board" (or similar) item, others don't. Give every template one, in the same place (the first list) and the same shape: what each list is for, how to work with your AI on it, and what to delete once you know your way.

### bulk_move_items into a doing list doesn't claim the items (move_item does)

> Found 17 Oct: Claude moved 13 items into BIP Doing with bulk_move_items and none was claimed; moving one item with move_item claims it automatically. Make bulk_move_items claim the same way (and release when moving out of a doing list), and say so in its tool description and result (auto_claim per item).

### Search: a term in quotes finds the exact phrase

> Jordi, 16 Oct: searching "Jordi Buskermolen" (with quotes) should find that exact phrase, not every item with Jordi or Buskermolen, as search engines do. Today the quotes are ignored (and shown doubled in "Filter this board for ""..."""). Support quoted phrases in the search modal, the board filter, search_items (MCP) and the API.

### "Filter this board for ..." from search has no way back

> Found by Jordi, 16 Oct: choosing "Filter this board for x" in the search modal filters the board, but there's no visible way to clear it again without refreshing the page. Show the active filter in the board's Filter control with a clear "x" / "Clear filter", the same as any other filter.

### Copy an item's content as text or as markdown (tables get lost)

> Jordi, 16 Oct: copying an item's description loses the table structure. Add "Copy as text" and "Copy as markdown" to the item's "..." menu (markdown keeps tables, lists and headings), and make a normal copy of a selection keep tables as HTML so pasting into Word or Google Docs works.

### Dialogs: the same close pattern everywhere (X at the top and Close in the footer)

> Jordi, 16 Oct: keep both the X and the Close button, but be consistent across every dialog (some have both, check which don't). Esc closes every dialog too. For next week (small).

### Fix: the site still says level 3 is the default (now level 4, Act)

> Jordi, 16 Oct: the public homepage still says the default Agent access is level 3. Since the plans of 16 Oct, Free goes up to level 4 (Act) and new accounts start there.
>
> Fix this before the tester call sends people to the site:
>
> 1. **Homepage FAQ:** the question about the default level says level 3 (Capture). Change it to level 4 (Act). At Act, completing, archiving and moving to Done wait in the Inbox.
> 2. **Homepage Agent access section:** if it marks a default level, move the marker to 4.
> 3. **Free card (homepage and pricing page):** Agent access up to Act, 1 guest per board (view or comment), 1 GB, 30 days of History. Pro: Full, 5 guests per board, 50 GB, all History. Every account gets 14 days of Pro once, no card.
> 4. **Search the whole site and the app** for "level 3", "Capture" used as the default, and "levels 4 and 5" shown as Pro only. Check help, /connect, /compare, the Trust page, onboarding, the settings screen, emails and the MCP tool descriptions.
> 5. **While you're there:** remove "Every new chat starts from zero" from the homepage and /use-cases. The Content Bible bans it, and it is still an open point there.
>
> Done when a search for those phrases finds nothing outdated, and the Content Bible's open point 1 can be closed.
>
> Source: Plans c2663f3f, guest decision 65772851, Content Bible v1.1 (sections 7 and 13).

### Founders: offer "Share that you're Founder #N" right after paying and in an email

> Jordi, 16 Oct (block 8): the share button only sits on Plan and billing, and it is worth sharing. Proposal: (1) on the return from checkout, a one-time "You're Founder #N" moment with the Share button; (2) the founder welcome or receipt email carries the same share link. One share place in the app stays Plan and billing; these are the two moments it matters. Check what the founder email sends today before adding a new one.

### Admin: take a given founder spot back

> Jordi, 16 Oct: next to "Make founder" and "Move", an admin action to take a given founder number back (with a confirm and a reason in the log), so a mistake doesn't need a manual database change. The number becomes free again. For next week (small).

### Admin daily email: subject starts with [Admin]

> Jordi, 16 Oct: as admin he gets two daily emails: his own daily summary (his due and overdue items, like every user) and the admin digest with sign-ups and active users. Prefix the admin digest's subject with "[Admin]" (e.g. "[Admin] Listspace daily ...") so the two are easy to tell apart and filter.

### Admin > Waitlist: center the row's text with the Invite button

> Jordi, 16 Oct: in the Waitlist table, the text in a row sits higher than the Invite button. Center all cells of a row vertically on the same line as the button (check the other admin tables with a button in the row too).

### Admin > Invites: remove canceled invites from the list

> Jordi, 16 Oct: canceled invites (and test invites) fill up the Invites list. Add "Remove" in a canceled or expired invite's "..." menu, plus a "Hide canceled and expired" filter that's on by default. Used invites stay, because they tie an account to its invite and gift.

### Admin > Invites: show "Used, account deleted" when the account is gone

> Jordi, 16 Oct: an invite whose account was deleted still shows as plain "Used". Show "Used, account deleted" (with the date). Deleted accounts stay out of Admin > Accounts: deleting means the personal data is gone (GDPR), which is common practice; the invite row keeps only that fact.

### Tour video on the homepage (self-hosted), YouTube later

> 16 to 17 Oct: an 88-second tour made with Remotion in the separate folder listspace-tour (not in the app repo). It uses the demo account jordi@sjenkie.com ("Sam Rivera", the Northwind Coffee boards) and 11 screenshots, in the site's style: a written logo, camera moves onto each highlight, and music cut to the beat (89.5 BPM).
>
> PR #394 puts it on the homepage, served from our own site: a 12 MB MP4 with a poster and preload none, so there are no YouTube cookies.
>
> Decided: YouTube waits until the music is final. Jordi isn't fully sure about the song, and a YouTube upload can't swap its audio. When it goes up, I write the title, a description with chapters, and the thumbnail.

### Two-step sign-in: a used recovery code should not switch off two-step

> Jordi, 16 Oct: signing in with a recovery code removed the authenticator and made the other 9 codes useless. Common practice: each recovery code works once, two-step stays on, and the email says how many codes are left (with a link to make new ones). Check what GoTrue allows and change our recovery flow to that.

### Password reset link: only set a new password, no full sign-in

> Jordi, 16 Oct: the reset link signs you in straight away and offers the password change after "Continue". Safer: the link opens only the "Choose a new password" page; the app can't be used until a new password is set, and the link works once and for a short time. With two-step on, the reset also asks for the authenticator code (scenario D-09).

### Signing in as another account opens the previous account's last page

> Found by Jordi, 16 Oct: after signing out and signing in with a different account, the app opens the page the previous account was on, so he saw "You don't have access to this board" or "This page is for Listspace admins". Fix: signing out forgets the "return to" page; after sign-in, return only to a page from a link the user just followed, otherwise the dashboard.

### Deleting an account: send a confirmation email, and stop the welcome email

> Found by Jordi, 16 Oct: after deleting a fresh account, no "Your account was deleted" email arrived, and the welcome email still went out afterwards (the hourly getting-started job didn't check that the account still exists). Fix both: a short confirmation email after deletion (what was deleted, that it can't be undone, contact for questions), and every scheduled email skips deleted accounts.

### Sign-up page shows a campaign code left over from an earlier visit

> Found by Jordi, 16 Oct: an invite from the Waitlist (no campaign) opened the sign-up page with "Code TESTERS: 30 days of Pro with 5 GB of storage", because the browser still remembered ?c=TESTERS from an earlier test visit. The code was not applied (the account got its 30 days from the invite), but it's confusing. Fix: an invite link without ?c= clears a remembered campaign code; a remembered code only shows when it came with this sign-up, with a "Remove" link.

### "For you" count doesn't update live when a request arrives

> Found by Jordi, 16 Oct: as a guest, a new request only showed in For you (and the count in the top bar) after refreshing the page. Update the count and the list live, like the rest of the app does.

### "Answered lately": show the answer for every kind of request

> Jordi, 16 Oct: in For you > Answered lately, an approval shows its outcome ("It's great"), but a "Look at this" or comment request doesn't show what the person wrote back. Show the reply (the first lines, with a link to the item) for every kind of request.

### "Last session" bar: hide until a newer summary, and a setting to switch it off

> Jordi, 16 Oct (agreed): the bar already shows one line with "more" to expand, and stays that way. Two additions: the X hides it until a newer session summary arrives (not only for this visit), and a switch in Settings > App > Preferences, "Show the last session on boards", on by default. Not a dialog: that would interrupt every time a board opens.

### Founder share text, Founder badge line and homepage hero (PR 3 for 17 Oct)

> One small PR:
>
> - **Founder share text:** "I'm Founder #N of Listspace, the memory my AI was missing: every decision, task and next step, kept up to date by the AI itself. X founder spots left at half price, for as long as you stay. listspace.app/@handle". The spot count comes from the live number.
> - **Welcome email:** "and your Founder badge shows on your profile."
> - **Homepage H1:** "Project memory for you and your AI.", with "Your AI forgets. Listspace remembers." directly under it.
> - **Tour video:** controlsList="nodownload", so the player menu doesn't offer Download.

### Profile: an emptied last name says "saved" but comes back after a refresh

> Jordi, 16 Oct: in Settings, Profile, he emptied the last name and clicked save. A green success message appeared, but at the bottom of the page, out of view. After a refresh the old last name was back. Changing it to another value works.
>
> Fix two things:
>
> 1. An empty field should save as empty (or the form should say plainly that the field is required).
> 2. Never show success when nothing was saved. Show the message where the user looks, next to the button or as a toast.

### Feedback where you look: success messages as toasts, field errors next to the field

> Jordi, 17 Oct: saving a long item shows the green success bar at the top of the form, out of view, so you only see it after scrolling up. The profile has the same problem (see "Profile: an emptied last name...").
>
> Rule for the whole app:
>
> - Success and general errors become a **toast**, in view wherever you scrolled.
> - An error about one field stays **next to that field**, and the page scrolls it into view.
> - Blocking problems stay in the dialog.
>
> Go through every inline success or error bar (settings pages, item window, admin) and switch them over.

### Typing feels slow in the guest email field of Share this board

> Found by Jordi, 16 Oct: typing in the "name@example.com" field in Share this board lags, unlike other fields. Likely a check or lookup on every keystroke (e.g. account lookup or re-rendering the whole dialog). Measure it, then debounce or move the work off the keystroke. Check the other fields in that dialog too.

### Comment field in the file viewer feels slow to type in

> Found in hand test block 4 (16 Oct). Probably the same cause as the slow guest field (block 3): look at both together, likely a re-render of the whole window on every keystroke.

### iPad: date fields in the item window are squashed (Start, Due date, Time)

> Found in hand test block 6 (16 Oct) on the iPad: Start, Due date and Time show as narrow boxes with only the calendar icon and a cut-off value. Give the iOS date and time inputs a fixed minimum width (or the touch faces used on phones), and check portrait and landscape.

### iPad: a list's ... needs two taps (first tap shows the hover icons)

> Found in hand test block 6 (16 Oct) on the iPad: the first tap on a list's ... shows the four header action icons (the hover state), only the second tap opens the list menu. On a touch screen one tap should open the menu.

### iPhone: the page stays zoomed in after sign-in, saving settings and sign-out

> Found in hand test block 6 (16 Oct) on the iPhone: after signing in, after saving the profile and after signing out, the page shows a bit larger than 100% and has to be pinched back.
>
> Likely cause: iOS Safari zooms in when you tap a field whose text is smaller than 16px, and does not zoom back out. Fix: form fields at 16px on touch screens (text-base below the sm breakpoint or on hover: none), not a viewport lock (that blocks pinch zoom, an accessibility problem). Check sign-in, the 6-digit code, settings and the waitlist form.

### Document comments: realtime, room to grow, a tidier delete confirm

> Jordi, 16 Oct (tour screenshots), on the document view's comment column:
>
> 1. **Not realtime.** A new comment (from Claude or another person) only shows after a refresh.
> 2. **No room to grow.** The window is as tall as the document, so with a short document the comments scroll inside a small column while there is empty space below the window. Let the window grow to the comments' height, up to the screen.
> 3. **The delete confirm is cramped.** "Delete this comment? This cannot be undone" wraps over 5 lines next to the buttons. Put the question on its own line, with Cancel and Delete below it, or use the normal confirm dialog.

### New document is hard to find: Add under a list only makes an item

> Found in hand test block 4 (16 Oct): Jordi could not find how to create a document. It is only in the list's "..." menu (New document), or via More, Make it a document, on an existing item. Look at offering it where people look first, for example a small "Item / Document" choice in the Add form, without adding a second entry point elsewhere.

### Done in the item window: one control that behaves the same everywhere

> Found in hand test block 4 (16 Oct).
>
> - In edit mode, the Done checkbox next to the dates only ticks the due date. It does not move the item to the Done list. The footer's Mark done (read mode, the eye icon) does. Two controls with different results is confusing.
> - When an item sits in a done list, the checkbox is greyed out ("In a done list"), so the only way to undo it is to move the item yourself. Mark not done only remembers where the item came from in the same tab.
> - Layout: with the "In a done list" line under it, Done no longer lines up with Clear.
>
> Proposal: the checkbox does what Mark done does (tick plus move to Done when the board has one), unticking moves the item back to where it was, or to the board's first list when that is not known. Align Done and Clear on one baseline.

### Decisions: on by default for new project boards, and tell people when it's off

> Jordi, 16 Oct (tour video): on a new board from "Project (for agents)", Decisions was off. Claude's decision became a plain item with "Because: ..." in the description, and nobody would find the switch in the board menu. Decisions is one of the strongest features, so it should be on in plain sight.
>
> Proposal:
>
> 1. Decisions on by default for new boards, at least for the project templates.
> 2. When an agent records a decision on a board with Decisions off, the item shows a one-line hint: "This was meant as a decision. Turn Decisions on for this board?" with the switch right there.
> 3. Mention it in the first-steps card and in the agent's reply (the tool result already carries decisions_on false; the agent should pass it on).

### Decisions: edit the reason without replacing the decision, and no stale error on a replaced one

> Jordi, 17 Oct (tour screenshot). He wanted to change only the reason of a confirmed decision. The Decision ... menu has no option for that, so he used Replace. The text he typed became a new decision, the old one turned Replaced, and a red error showed on it: "Another decision is already Confirmed for the same question... Replace that one instead, or flag a conflict with it", which made no sense at that point.
>
> Fix:
>
> 1. Add "Edit reason" (and, while it is only Proposed, edit the text) to the Decision ... menu. A confirmed decision's reason can change without starting a new decision, and the change is logged in its history.
> 2. Make Replace ask for the new decision **and** its reason as two fields.
> 3. Don't show that error on a decision that is already Replaced.

### Daily summary email: item titles don't look like links

> Found in block 7 (16 Oct): clicking an item in the summary opens it, but nothing shows it is a link. Underline the titles (or the brand link colour) in the HTML version, as the "Open For you" link already is.

### Unsubscribe page ("Stop the daily summary?"): show the Listspace logo

> Found in block 7 (16 Oct): the one-click unsubscribe page shows the word "Listspace" in plain text. Use the logo, as in the emails, on all unsubscribe and remove-me pages served by email-unsubscribe.

### Connect page and Help: Claude asks per tool, choose "Always allow"

> Jordi, 16 Oct: with level 5 set, Claude still asks "Claude wants to use Move an item from Listspace" several times. That is Claude's own permission prompt, once per tool, separate from Listspace's agent access. Add one line to /connect (the Claude steps) and to Help: "Claude asks for permission the first time it uses each Listspace tool. Choose Always allow; how far Claude may go is decided by your agent access level in Listspace."

### Plan and billing: "Switch to monthly" success message vanishes within a second

> Found in block 8 (16 Oct): after Switch to monthly a green message flashes and is gone within a second; after switching to yearly it stays ("Thank you. Pro is now billed yearly..."). Probably the page reloads its status and the section re-renders without the message. Make both stay until the next action.

### Plan and billing: confirm buttons follow one rule (Switch vs Pause)

> Found in block 8 (16 Oct): in the Switch to monthly confirm the dark button is the action (Switch to monthly, then Keep yearly), in the Pause confirm the dark button is the safe choice (Keep Pro, then Pause Pro). Pick one rule for every confirm on the page (and Stop free Pro, Cancel): the same side and the same weight for "keep as it is" everywhere. Proposal: the action you came for is the dark button on the left, "Keep ..." the outline button next to it; the founder warning text carries the caution, not a swapped button.

### "Your founder price has ended" email: stale when Pro is back, and the signature image breaks

> Found in block 8 (16 Oct). After an immediate cancel the email arrived, which is right, but:
>
> - It went out after Jordi had already subscribed again, so it said "Your Pro plan ended" and "stay on Free" while he was on Pro. Before sending, check the account is still without Pro and skip (or soften) when it has Pro again.
> - The signature image did not load: its alt text "Jordi Buske..." shows cut off in a narrow box. Check the image URL and size in the founder emails (and the other emails with the signature), and give the alt text room or make it just "Jordi".

### Cancel within 14 days: refund the first payment in one click (Pro and Team)

> Jordi, 16 Oct. The terms promise a full refund of the first payment within 14 days (write to hello@). Proposal: automate it.
>
> - Within 14 days of the **first** payment, Cancel offers "Cancel and refund €X".
> - Stripe refunds that payment, and Pro or Team ends at once.
> - Only once per account and only for the first payment, so nobody gets endless free fortnights.
> - Renewals keep the normal "stops at the end of the period".
> - Founder: the founder price ends with it, so say that in the dialog.
> - Log it in the admin billing log, and update the terms text from "write to hello@" to the button.

### Team: the team maximum can't be set to 5 (Full), and members' Agents menu stops at 4

> Bug found in block 9 (16 Oct). Under Team, Agents, Team maximum, Jordi chose 5 Full. After he came back, and again after a refresh, it was 4 Act. The member row's "Agents: up to ..." menu also only offers up to 4.
>
> A team gives every member Pro, so 5 should be allowed. Check the save (a cap from paymentsLive or the Free plan's maximum?) and the member menu's limit. The save also gives no error when the value is dropped.

### Team closed: the member's plan says Free while the dialog says Pro until Oct 24

> Found in block 9 (16 Oct) on the test account jordibuskermolen@hotmail.com after the team was closed:
>
> - the dialog says "You keep Pro until October 24, 2026" and then "continues on Free"
> - the button is "Continue on Free"
> - Plan and billing already shows "Current plan: Free", with 50 GB of storage
>
> Check:
>
> 1. Do the 7 grace days apply, and does Plan and billing show "Pro until Oct 24" during them?
> 2. Did this account have Pro from an invite or TESTERS before it joined the team, and does that come back when the team ends? For jordi@sjenkie.com it did come back (Pro until Nov 15).
> 3. While Pro can't be bought, should the dialog say "Continue on Free" at all, or only show the date Pro ends?

### Team page: seats and costs in plain sight, new members show without a refresh

> From block 9 (16 Oct).
>
> **Seats are hard to find.** They hide in the Overview "..." menu, and inviting with no free seat silently adds one and charges for it when the person joins. Proposal: one Seats line on the page, for example "4 seats · 3 in use · 3 from Nov 17", with a Change button. The invite form says plainly "No free seat: inviting adds one, €9.99 for the rest of this month when they join".
>
> **The seat messages contradict each other.** "2 seats are free now ... Lower to 2 seats at renewal" sits next to "From November 17: 3 seats. Keep 4 seats". Show one seat summary and one place to change it.
>
> **Members don't update.** After someone accepts an invite, the owner's member list only shows them after a refresh. Use realtime or a refetch.
>
> The rest of the page (Overview, Members, Agents, Close team) is fine.

### Team texts: what happens to your own Pro, and the Start a team page inside Settings

> From block 9 (16 Oct).
>
> **Texts to change:**
>
> - **Start a team:** if you pay for Pro yourself, say so: "You pay for Pro yourself. Once the team starts we offer to pause it, so you don't pay twice."
> - **Team invite email:** "Already paying for Pro? You can pause it once you join; the team pays for your Pro."
> - **"You are no longer in [team]" email:** say what happens to the person's own plan, for example "Your own Pro (paused) or your free Pro until Nov 15 continues."
> - **"Your own Pro is paused..." dialog:** clearer, for example "Your own Pro won't renew. You keep it until [date], and your seat gives you Pro meanwhile. Resume it any time."
>
> **Page layout:**
>
> - Start a team (/settings/new-team) opens without the settings sidebar. Put it inside the Settings layout.
> - Plan and billing should show the paths in plain sight: on Free, Pro and Team; on Pro, Team.

### Team: start with default guidance for agents on team boards

> Jordi, 16 Oct (block 9): "Guidance for agents on team boards" starts empty. Give a new team a sensible default the owner can edit, in the spirit of the account's default guidance. For example: "Keep the team's boards up to date: move items as work starts and ends, comment on what you did, never close an item someone else claimed, and send anything you're unsure about to the Inbox."

### Stripe: Pro product text still says "freedom levels 4 and 5"

> Found in block 8 (16 Oct): Checkout shows "Listspace Pro: freedom levels 4 and 5 for your agents, and more." We no longer say freedom level, and Pro adds level 5 (Free has 4). New text, e.g. "Listspace Pro: level 5 (Full) for your agents, 50 GB, 5 guests per board and all history." Change the product description in Stripe, sandbox and live (live with Jordi's OK, before Saturday's switch), and check the repo for a product setup script that carries the same text.

### iPad: holding an item selected it instead of dragging it

> Found in hand test block 6 (16 Oct) on the iPad. Fixed straight away at Jordi's request.
>
> - Holding an item to drag it selected it, and it could not be dragged.
> - After that every tap selected an item instead of opening it.
>
> Cause: a 500 ms long press started selection mode, which cancelled the drag the library lifts after 120 ms. Fix: on touch a long press is only the drag; selecting is the board's ... menu, Select items. PR #392 (merged).

### Create board: the template you're looking at is the one that gets used

> Found by Jordi, 16 Oct: in Create board he picked "Content calendar" in the template list (the preview showed it) and clicked "Create board", but the board came out empty, because only "Use this template" really selects it. Two buttons for one choice is confusing. Fix: picking a template in the list selects it (the top row and the preview follow), "Create board" uses it, and the separate "Use this template" button goes. "No template" stays as the explicit choice for an empty board.

### Reserved usernames and a filter for offensive names

> Jordi, 16 Oct: some names are held for his family; more system, brand and AI-company names are reserved; offensive names in English, Dutch, Spanish and German are blocked, using the open LDNOOBW list, also with tricks like n4z1 or n.a.z.i. Ordinary religious words and first names (Jesús, Mohammed, Christian, Maria) are not blocked.

### App preview: Settings > Export fails on the sample data

> Found 15 Oct while testing campaigns: in the app preview (not production), Settings > Export fails because the preview's sample attachments have no scan_status. The export itself works; only the preview's sample data is out of date. Fix the sample data so agents can test the export in a browser.

### Final pre-launch check on launch day: copy, links and devices

- Due 2026-10-18. Done
- Labels: Priority

> Jordi on 10 Oct: the pre-launch check runs twice, once on Saturday 10 Oct as a dry run (report on the Ops board: "Pre-launch check, 10 Oct: copy and devices") and again on launch day, Monday 12 Oct, after the last changes.
>
> **On Monday:**
>
> - Run the same check against the live site and app: all the copy, dead links, consistent facts (prices, founders, refunds, Agent access, directories), alt text, US English, no em or en dashes, "items" not "cards".
> - iPad (portrait and landscape) and phone views: no horizontal scroll, nothing cut off or overlapping, tap targets.
> - Compare with Saturday's report: are all "Must fix" items fixed?
> - Payments: the founder count and prices on /pricing match Stripe live.
>
> Only after this check: switch on payments_live and announce.

### Boards that stay current without relying on the agent's memory

> Jordi, 15 Oct: "Listspace will lose its credibility if boards are not kept up to date. This is the most important feature." Agents forget to update the board in long sessions, and especially after their context is summarized, because the board rules were only read at the start.
>
> Not everyone uses Claude Code or GitHub, so the main fix lives in the MCP server and works in every app.
>
> 1. **Reminders from the server (main fix, being built):** the server tracks which items an agent claimed, read or changed. While it keeps working, tool results carry a short reminder for items it left without a status update. The rule comes back with every reminder and in get_account, so it survives a summarized context.
> 2. **The next session closes the loop:** start_session lists items earlier sessions worked on without an update. The agent checks whether the work was done and updates the board first, asking the user only when unsure. The user never sees an item flagged "stale" for work that was already done.
> 3. **Claude Code plugin hooks (being built):** read the board at session start, bring the rules back after the context is summarized, and a reminder after a PR, merge or deploy.
> 4. **GitHub link (later):** a PR that names an item moves it to Doing when opened and to Done when merged.

### Payments: Stripe Managed Payments, test mode (PR #167)

> The full list for paid plans. Start with Pro (one person); Team and Business follow once working together on shared boards exists. The waitlist and invite-only stay until this is live.
>
> **1. Decisions first (Jordi)**
>
> - Stripe on Listspace's own account, or a merchant of record (Paddle, Lemon Squeezy) that handles VAT and sales tax for you. Merchant of record: less tax work, higher fee, less control.
> - Prices per currency (EUR and USD), monthly and yearly.
> - Founding member offer: how much off, for whom, until when.
> - What each plan includes. Decided 7 Oct: Free agents work at level 3 (the default), levels 4 and 5 shown but grayed out with "Pro". Pro: levels 4 and 5, and more to decide.
>
> **2. Billing**
>
> - Checkout for Pro (monthly and yearly), with the founding price as a coupon or its own price.
> - Customer portal: change card, switch monthly and yearly, cancel in one click, invoices.
> - Webhooks: payment succeeded, failed, canceled, refunded. They set the plan in account_entitlements, idempotent and verified.
> - Failed payments: retries, an email, a grace period, then back to Free. Never delete data.
> - Pause instead of cancel (Generous by default).
> - Taxes: VAT on invoices with the right details, reverse charge for EU business customers with a VAT ID (Stripe Tax, or handled by the merchant of record).
>
> **3. Plan limits in the app and for agents**
>
> - One function decides the plan (admin always full access); the app, the API and MCP all use it.
> - Grayed-out features with a clear "Pro" label and an upgrade link, never a broken button.
> - Agents get a plain message when a Pro feature is needed, which they can pass on.
> - Invite Pro months and paid Pro work together (paid time starts after the free months).
>
> **4. Legal at checkout**
>
> - Price, interval and renewal next to the subscribe button; a button text that says it costs money.
> - EU right of withdrawal (14 days) and how it applies to a subscription that starts at once.
> - Terms: a paid plans section (billing, renewal, refunds, cancelling, price changes with notice).
> - Privacy and sub-processors: the payment provider.
>
> **5. Admin**
>
> - Accounts with plan, paid since, next renewal, and Pro months from invites.
> - Give or extend Pro by hand (for partners, students, nonprofits).
> - Revenue numbers for the weekly review.
>
> **6. Before launch**
>
> - A full test in test mode: buy, renew, fail, cancel, refund, yearly, coupon, VAT ID.
> - One real purchase with a real card, then refund it.
> - Pricing page and FAQ updated, waitlist and invite-only switched off, the launch post.

### 14 days of Pro for everyone, and a more generous Free plan

> Jordi, 16 Oct. Every account gets 14 days of Pro, no card, once; existing accounts get one too, once. Reminders 3 days and 1 day before it ends. Free becomes more generous: your AI up to level 4 (Act), so it keeps the board current on Free too, and 1 guest per board (view or comment). Free keeps 1 GB and 30 days of history. Pro: level 5, 5 guests with any role, 50 GB, all history, private GitHub repos.

### Links on items, with live PR status when GitHub is connected

> Jordi, 15 Oct: yes. Items get links shown as chips on the tile ("PR #370", "Figma"). GitHub PR links show their state (open, merged, checks) for public repos without any setup. Connecting GitHub (a one-click install of the Listspace GitHub App, per user) adds private repos and moves items by itself: Doing when the PR opens, Done with a comment when it merges. Part 4 of "Boards that stay current".

### Invites with a campaign, and sign-up links that fill themselves in

> Jordi, 15 Oct, testing the TESTERS campaign:
>
> - Admin > Invites: attach a campaign to an invite link. Uses, Pro and end date then come from the campaign, and the link is /signup?invite=XXXX&c=TESTERS.
> - "Copy link" in Campaigns gives /signup?c=CODE (it gave /?c=CODE).
> - /signup with ?invite= fills in the invite code and drops the "It is in your invite email" hint; ?c= shows what the code gives.
> - For Pro periods under 30 days, the first ending reminder comes 3 days before the end (not 7).
> - Admin > Analytics: "of which via a campaign" in the sign-up numbers.

### A retried change after a network error must not create a duplicate

> Found 15 Oct: during a deploy, create_item answered 502 although the item was saved. The agent retried and the board got two identical items. Fix: create tools accept an idempotency key (the same key within 24 hours returns the first result), and the server instructions tell agents to reuse it on a retry. As a safety net, an identical item (same title and list, same agent, within a minute) returns the existing one.

### Board reminders pause while an item waits on someone

> Jordi, 15 Oct: in live use, items waiting on a review or a merge kept being flagged every 30 minutes. An agent can now say what an item waits for (waiting_for on a comment). The item shows "Waiting for: ...", and reminders skip it until anything changes on the item, with a 7-day safety limit.

### A "..." menu closes right after opening when the page was just scrolled

> Found 15 Oct while testing Admin > Campaigns on a phone. PR #376: the shared menu closed on any scroll event, and a scroll from just before the tap arrived just after the menu opened. Now it closes only when its button actually moves. Affects the "..." menus in Admin > Campaigns, Admin > Teams, Settings > Team and the guest menu in Share. App only.

### Admin menu in groups, like Settings; check the New campaign form

> Jordi, 15 Oct: group the Admin menu like Settings (proposal: Overview, Growth, Customers, Support and safety, Email, Admin settings), with the same phone picker. Also check whether a dialog is the right way to create a campaign, compared with how the app creates other things.

### Archived items: changing the sort does nothing and reopens the last item

> Found by Jordi, 15 Oct: in Archived items, switching "Sort by" between "Recently archived" and "Size" doesn't re-sort, and the window jumps back to the archived item opened before. Also "Size" is unclear: it means the size of the item's files. Renaming it to "Largest files first", with each item's file total.

### Decisions follow-up: guest proposals in the Inbox, full "Confirmed by" line on phones

> After #370: a Comment guest's "Propose a change" becomes a real Inbox suggestion the owner accepts in one click, and the "Confirmed by" / "Withdrawn by" line no longer gets cut off on a phone.

### Files uploaded in ChatGPT can't reach Listspace

> Found by Jordi, 15 Oct: in ChatGPT, attaching uploaded documents to an item fails. Our upload works through a link and a curl command, which needs a computer with internet access; ChatGPT's code sandbox has none. Looking into the way ChatGPT apps can receive files the user uploaded in the chat, so files go straight to the item.

### Campaign codes: free Pro periods and discounts

> Started 15 Oct. Admin > Campaigns: a code and a link per campaign (?c=CODE). Two kinds: free Pro for a number of days (no card, back to Free when it ends, reminders 7 days and 1 day before), and discounts such as 20% off for the first month through Stripe. One or two optional questions after sign-up, a small report per campaign, and a storage cap per campaign. For Black Friday and similar campaigns.

### Replace or withdraw a decision (never erase)

> Started 15 Oct. In the "Decision ..." menu: replace with a new decision, or withdraw with a reason. Both stay in the history of the decision. Comment guests and agents can only propose a change.

### Settings on a phone: group headings no longer cut off

> 15 Oct: on a phone, the "AI and agents" heading in Settings was partly cut off at the left. Reworking the phone layout of the Settings menu; desktop stays as it is.

### Only people who can edit tick checklist items

> Jordi, 15 Oct: guests with Comment access and team Commenters can no longer tick or untick checklist items; only the owner, members who can edit and Edit guests can. Changed in the database, the AI tools, the app and the help pages together.

### Item keeps its highlight after a search, even after a refresh

> Found by Jordi, 15 Oct: after opening an item from search, its tile on the board keeps the dark highlight border, also after reloading the page. The highlight should point to the item briefly and then go away.

### Faster sign-up and home pages (Lighthouse 66 and 70)

> Started 15 Oct. The weekly Lighthouse run scored /signup 66 (largest paint 8.7 s) and the home page 70; other pages score 77 to 88. Finding what makes them slow, plus whether a CDN in front of the site helps.

### Speed after launch: load the sign-in library only when needed, critical CSS inline, weekly Lighthouse

> From the Lighthouse audit (PR #339, 14 Oct 2026), the riskier items kept for after launch:
>
> - Create the sign-in/database client (supabase-js, 57 KB gzipped) only when a page needs it; public pages don't. Half a day, touches AuthProvider.
> - Inline the critical CSS in the prerender (32 KB stylesheet, about 22 KB unused on first paint). 2 to 4 h plus a visual check.
> - Run Lighthouse on a schedule (weekly CI job) so a regression is noticed. 2 to 3 h.
>
> Items 1, 2, 5, 6 and 8 of that list are being done before launch.

### Remind me X days before the due date (per item, opt-in)

> Jordi, 14 Oct: "it would be great if I can get a reminder x days before due date", for example domain renewal dates on a board, 7 days before. Off by default; you switch it on per item.
>
> What exists: the daily email at 08:00 (your timezone) with items due today and overdue (Settings, on by default, `send-due-reminders`).
>
> Proposal:
>
> - In the item's dates: **Remind me** with None / On the day / 1 day / 3 days / 1 week / 2 weeks before.
> - The reminder is per person: on a shared board each person sets their own.
> - It arrives in the same 08:00 email ("Coming up: yellowhousedigital.com renewal, due in 7 days") and in For you. No extra email.
> - Agents can set it too (a field on the due date tools), so "add my domain renewals with a reminder a week before" works in one sentence.
> - A recurring due date (renewals are yearly) is a separate follow-up.

### Lighthouse (or similar) test before launch: performance, SEO, accessibility, best practices

> Jordi, 13 Oct 2026: run a Lighthouse audit (or PageSpeed Insights, which uses Lighthouse with real-user data) before launch.
>
> - Public pages: home, /pricing, /use-cases and one profession page, /compare, /docs, /help, /templates, /signup, /trust.
> - The signed-in app: boards overview, a busy board, an open item, Settings (needs a test account; Lighthouse can run with a session cookie).
> - Mobile and desktop profiles, both.
> - Record the four scores per page, fix what is cheap (images, fonts, layout shift, missing labels, contrast, meta), and list the rest.
> - Repeat after launch on a schedule, so a regression is noticed.

### Drop the unused templates.decisions column (left from #263)

> Jordi OK'd on 13 Oct 2026. Since PR #273, templates no longer decide whether a new board has decisions on; the account default does. The column templates.decisions is kept but nothing reads it, so a rollback stays easy. Drop it in a new migration once #273 has run for a while without problems.

### Clean up list: count comments, checklist ticks and files as a change

> Jordi, 13 Oct 2026: yes, refine it later. "Not changed for 3 or 6 months" in Clean up list (#290) uses updated_at. Comments, single label changes, checklist ticks and new files don't bump it, so an item that was only discussed recently can still be archived (with Undo). Use a "last activity" time instead: the latest of updated_at, comments, checklist changes, labels and files. Reordering also bumps other items' updated_at, which makes them look fresh; ignore position-only changes.

### Team v1: three small mismatches found in the roles review

> Found in the security review of #284 (Team roles) on 13 Oct 2026. These are not caused by roles, and none is a leak.
>
> 1. An agent's `answer_request` suggestion can never be applied by an approver, because `request_answer_by` requires the receiver to answer.
> 2. The "Visible to" window shows "remove member" to team admins, but the database only lets the board's maker or the team owner remove someone. Align the UI and the rule; decide whether admins may remove.
> 3. The team space's Unsorted shows add and delete controls to members who can't use them (only the owner and Editors can). Hide them for Viewers and Commenters.

### A decision whose confirm screen can't be shown goes to the Inbox, not "declined"

> Found 14 Oct 2026: record_decision from Claude Code (VS Code extension) came back "The user said no on the confirm screen", but Jordi never saw a confirm screen. The in-client confirm (MCP elicitation, #258-style) was apparently answered with a decline by a client that can't show it in that window.
>
> **Expected:** only an explicit "No" from the person counts as declined. When the client can't show the confirm, cancels it, times out or answers without the person, the decision goes to the board's Inbox (as with inbox: true) and the result says so.
>
> Check: what elicitation result a client sends when it has no UI (decline vs cancel vs error), and treat anything but an explicit accept/decline by the person as "route to Inbox". Add a test per case.

### Three browser check scripts fail on main: they look for old labels

> Found in the pre-launch test run of 13 Oct (main at 741c8c6b). The test scenarios name these scripts (part 2 E-01, E-03, E-04, E-06; part 4 B-04), and they are not in CI, so they drifted.
>
> **Steps to reproduce:** start the app preview (`VITE_SUPABASE_URL=http://127.0.0.1:9 VITE_SUPABASE_ANON_KEY=dummy npx vite --port 4791`), then run each with `--base http://127.0.0.1:4791 --channel msedge`:
>
> 1. `scripts/check-file-list.mjs`: times out waiting for a button named "Attachments". The tab is called "Files" now.
> 2. `scripts/check-preview-back.mjs`: every Back check passes, then it times out on the "Read mode" button: an item with a description now opens in read mode already.
> 3. `scripts/check-founder-badge.mjs`: the badge checks pass, but 8 checks fail on the account menu's item list, which now has "New space" (a85b3f54, one space only).
>
> **Expected:** each script matches today's screens and passes. The app behaves as intended in all three; only the scripts are stale. Consider adding them to CI so they stay current.

### welcome-e2e.ts fails on main: it calls the hourly job through the public gateway

> Found in the pre-launch test run of 13 Oct (dry run of main at 741c8c6b, part 1 B-15 and part 5 F-01).
>
> **Steps to reproduce**
>
> 1. `deploy/selfhost/dryrun/run.sh up`
> 2. `deploy/selfhost/dryrun/run.sh welcome`
>
> **What happens:** 23 of 32 checks fail with "the hourly job answers: status 404". welcome-e2e.ts posts to `${GW}/functions/v1/send-due-reminders`, and since PR #300 (c0f55225) the gateway's public server returns 404 for the cron-only functions.
>
> **Expected:** the script calls the hourly job on the internal port (`INTERNAL`, as team-e2e.ts does) and passes. The welcome email itself is not suspected: its Deno tests (gettingStartedMails.test.ts) are green.
>
> A test-script fix only; no app change.

### After a password reset the app lands signed in on /boards; the "Password updated" message never shows

> Found in the pre-launch test run of 13 Oct (part 1 C-08), local dry run of main at 741c8c6b, Edge.
>
> **Steps to reproduce**
>
> 1. Signed out: "Forgot your password?", type the address, send.
> 2. Open the reset link from the email, choose Continue on "You are signed in", then on "Reset your password" set a new password and save.
>
> **What happens:** the browser lands on /boards, still signed in with the session from the reset link (screenshot: scratchpad tests-a/shots/1-C-08.png). The new password works and the old one does not, so the reset itself is fine.
>
> **Expected (part 1 C-08):** /login with "Password updated. Sign in with your new password." Then the person signs in with the new password.
>
> **Why:** ResetPasswordPage navigates to /login with the message in its state, but the recovery session is still active, so /login sends the signed-in browser on to /boards and the message is lost. Either sign out after the reset (then the message shows), or keep the person signed in and show the confirmation on /boards, and update C-08 to match. Owner's choice.

### After two-step sign-in is turned on, the other browser shows "Unable to load boards" instead of the sign-in page

> Found in the pre-launch test run of 13 Oct (part 1 D-01), local dry run of main at 741c8c6b, Edge.
>
> **Steps to reproduce**
>
> 1. Sign in to one account in two browsers.
> 2. In the first: Settings > Security > "Turn on two-step sign-in", enter the code, "Turn on".
> 3. In the second browser, open /boards (or reload).
>
> **What happens:** the second browser stays on /boards with "Unable to load boards" and "Could not load your boards. Please try again." (screenshot scratchpad tests-a/shots/d1-D-01-other.png). The server is right: its session now gets 403 (`/auth/v1/user` 403, PostgREST 403 `second_step_required`), so nothing leaks. But the person is not signed out, and "Please try again" cannot work.
>
> **Expected (part 1 D-01, and the app's own message "You were signed out on your other devices."):** the other browser lands on the sign-in page (or the code step), for example when an answer says the session is gone or needs the second step.

### Dry run: run.sh welcome fails 23 checks, welcome-e2e.ts calls the closed cron path

> Found in the 13 Oct pre-launch test run, on a local dry run of main 741c8c6b. A test harness bug, not an app bug.
>
> c0f55225 (13 Oct) made send-due-reminders and send-request-mail answer 404 on the public server, and the dry-run gateway mirrors that (`deploy/selfhost/dryrun/nginx.conf` line 55). `deploy/selfhost/dryrun/welcome-e2e.ts` line 108 still calls `${GW}/functions/v1/send-due-reminders`, so every hourly-job call gets 404 and the welcome checks after it fail.
>
> **Steps to reproduce**
>
> 1. `run.sh up` on a fresh stack (any project and ports).
> 2. `run.sh welcome`.
>
> **Expected:** "welcome email: all passed". **Actual:** "welcome email: 23 failed", first "FAIL the hourly job answers: status 404".
>
> **Fix idea:** call the job the way the timers do, on the internal port (`INTERNAL`, as two-step-e2e and accounts-e2e get it from run.sh), and pass INTERNAL to the welcome command in run.sh. Test scenarios 7 E-06 names welcome-e2e.ts.

### Board JSON export drops start dates, due times, comment threads and resolved state, decisions and requests

> Found in the 14 Oct pre-launch test run (Test scenarios 9, F-16, likely fail 4). Checked by reading main 741c8c6b. "Export, always free" is the data-portability promise on /pricing.
>
> `src/services/exportService.ts`, `CARD_COLUMNS` (line 42): no `start_date`, no `due_time`. Comments go out as `id, user_id, content, created_at, updated_at`, so they have no `parent_id` (replies come out flat), no resolved state, and no file or passage anchor. The export has no decision state or ledger and no requests with their outcome.
>
> **Steps to reproduce**
>
> 1. Make an item with a start date and a due time. Add a reply to a comment, resolve a thread, add a comment on a file, make a decision item and send a request.
> 2. Board menu > Export board > Download JSON.
> 3. Look at those items in the file.
>
> **Expected:** the data is in the file. **Actual:** none of it is.

### Touch screens: a few controls are under 40 px (Add a group, board title, Back to boards, browse files)

> Found in the 14 Oct pre-launch test run (Test scenarios 8, C-02), on a local dry run of main 741c8c6b. Headless Edge at 1180 by 820 with touch on, so `(pointer: coarse)` matches. A `.tap-target` 40 px hit area (::after) counts as passing; everything else in the list below has no hit area and is smaller than the rule "at least 40 by 40, or a 40 px hit area".
>
> | Where | Control | Size |
> | --- | --- | --- |
> | Board header | Edit title (the board title button) | 81 x 23 |
> | Board, after the last list | Add a group | 296 x 36 |
> | For you and Settings, top left | Back to boards | 121 x 20 |
> | Settings > Profile | browse files (profile picture) | 92 x 24 |
>
> **Steps to reproduce**
>
> 1. Open a board on an iPad (or a desktop browser with touch emulation, pointer coarse).
> 2. Measure the board title, "Add a group", and on For you or Settings the "Back to boards" link and "browse files".
>
> **Expected:** 40 px or a 40 px hit area, like the other header buttons (Star, Add a description and the view switch already have one). **Actual:** the sizes above. Small fix: `tap-target` or the `coarse:` height on these four.

### The example suggestion counts as the first agent: "Connect your AI" never goes out, and accepting it starts the daily summary

> Found in the 14 Oct pre-launch test run (Test scenarios 9, likely fails 1 and 2; rows part 5 F-10 and A-16). Checked by reading main 741c8c6b, not in an inbox yet. The inbox check still needs to be done by hand on 15 and 16 Oct.
>
> 1. `backend/migrations/20261029000000_daily_summary.sql`, `first_agent` (line 416 on): the second half of the union reads every row in `suggestions` and does not leave out `example = true`. Every new account whose first board gets a list gets Listspace's example "Connect your AI assistant". So `connect_agent` never fires for that account, and `first_agent_change` sends "Listspace made its first suggestion" instead.
> 2. `20261034000000_digest_candidates_join.sql`, `digest_candidates`: the summary starts on any `task_events` row with `actor_kind = 'agent'`. Accepting the example writes one, so the daily summary starts with no real agent.
>
> **Steps to reproduce**
>
> 1. Make a fresh account and create the first board from a template with a To do list. Connect no agent.
> 2. Wait for the next day's getting started email.
> 3. On another fresh account, accept the example in the Inbox and turn on the daily summary.
>
> **Expected:** "Connect your AI in two minutes" on day 1, and no summary started by Listspace's own example. **Actual (from the code):** "Listspace made its first suggestion", and a summary starts.
>
> Fix idea: `and not s.example` in `first_agent`, and leave out events whose suggestion is the example in `digest_candidates`.

### For you, "current space": requests and mentions on boards shared with you disappear

> Found in the 14 Oct pre-launch test run (Test scenarios 9, H-10, likely fail 5). Checked by reading main 741c8c6b.
>
> `src/utils/forYouScope.ts`, `scopeForYou`: with the current space chosen, only entries whose board is in that space are kept. A board shared with you (not one of your own) is in no space, so its rows show only under "All spaces". `countBySpace` also leaves them out of every space's count.
>
> **Steps to reproduce**
>
> 1. Sign in as a guest (B) who has a request and a mention from the owner (A) on A's board.
> 2. For you: choose the current space, then All spaces. Compare the top bar count, the space switcher dot, the dashboard block and the page.
>
> **Expected:** rows from shared boards show in either mode, or the counts match what is shown. **Actual:** with the current space chosen, the shared board's rows are gone.

### "Add labels" in the item window opens the label picker behind the window

> Found in the pre-launch test run of 13 Oct (part 2 C-06, Must), local dry run of main at 741c8c6b, Edge at 1366 by 900.
>
> **Steps to reproduce**
>
> 1. Have at least one label (account menu > Manage labels > Create label).
> 2. Open an item on a board (edit mode, Details tab) and choose "Add labels".
>
> **What happens:** the picker "Labels of {item}" opens at the left edge of the page, behind the item window's dimmed overlay (screenshot scratchpad tests-a/shots/d2-C-06-picker.png: "Labels / Urgent" shows blurred behind the window). It cannot be clicked, so no label can be added from the item window.
>
> **Expected:** the picker opens above the item window, next to the "Add labels" button, and a click on a label adds it (the button then reads "Change labels").
>
> Probably a stacking order (z-index) or portal issue of the picker inside the item dialog.

### Deleting an item shows no "Item ... deleted." toast

> Found in the pre-launch test run of 13 Oct (part 2 C-11), local dry run of main at 741c8c6b, Edge, as the board owner.
>
> **Steps to reproduce**
>
> 1. Open an item, More > "Delete...".
> 2. The dialog "Delete item permanently" shows the right text. Choose "Delete permanently".
>
> **What happens:** the item is deleted and the window closes, but no toast appears (watched for 3 seconds; screenshot scratchpad tests-a/shots/d2-C-11-after.png). The archive toast on the same board does show.
>
> **Expected (part 2 C-11):** toast "Item "{title}" deleted."
>
> **Where to look:** EditTaskModal.tsx handleDelete calls `toast.success` right after `onClose()`; closing the window (and its route change) may drop the toast. Calling the toast before onClose, or from the board, would keep it.

### Decision receipts call a person without a name "Someone on the board"

> Found in the pre-launch test run of 13 Oct (part 3 I-01), local dry run of main at 741c8c6b.
>
> **Steps to reproduce**
>
> 1. An account with no first or last name (fresh accounts skip the name prompt with "Not now").
> 2. An agent records a decision; accept it in the Inbox.
> 3. Open the decision's item.
>
> **What happens:** the item window says "Confirmed by Someone on the board, Oct 14" (and History of this decision uses the same name). Source: `decision_person_name()` in 20261028500000_decisions.sql falls back to 'Someone on the board'.
>
> **Expected:** the same rule as everywhere else for a person without a name: the owner sees the address (or "you" for oneself), others see the letters, like "JO (no name yet)", never "Someone" (part 2 I-05, part 4 A-18).

### Labels page points to a "Labels" tab that no longer exists

> Found in the pre-launch test run of 13 Oct (part 2 C-06), main at 741c8c6b.
>
> **Steps to reproduce:** account menu > "Manage labels" (/labels), read "About labels".
>
> **What happens:** "You can also create labels directly from an item by opening it and selecting the "Labels" tab." (src/pages/app/LabelsPage.tsx line 419). The item window has no Labels tab: labels sit on the Details tab ("Add labels", later "Change labels").
>
> **Expected:** the line names the Details tab, for example: open an item and choose "Add labels" on its Details tab.

### Decision refusals still show the old words: "already settled", "in dispute", "on record" and the claim key

> Found in the 14 Oct pre-launch test run (Test scenarios 9, J-06, likely fail 3). Checked by reading main 741c8c6b.
>
> `src/services/decisionsService.ts` (`decisionError`) shows the database text as is for 23505, 22023, 42501 and P0001. The database still words it the old way:
>
> - `20261028500000_decisions.sql` line 802: 'Another decision is already settled for "{key}": "{title}". Replace that one instead, or dispute it.'
> - `20261031600000_decisions_confirmed_in_client.sql` line 290: 'This decision is already settled'
>
> The app's own words are Confirmed, Proposed and Needs a decision, and people never see a claim key.
>
> **Steps to reproduce**
>
> 1. Confirm "Launch on 18 Oct".
> 2. Mark a second item with the same title as a decision and press Confirm.
> 3. Try "Replace with..." from a decision that is not Confirmed.
>
> **Expected:** plain words (Confirmed, Proposed, Needs a decision), no claim key. **Actual:** 'Another decision is already settled for "launch-on-18-oct": ...'.

### Pricing, FAQ and roadmap still say team roles are "coming" after #284 shipped them

> Found in the 13 Oct pre-launch test run (Test scenarios 10, L-02), on a local dry run of main 741c8c6b.
>
> Team roles (Editor, Commenter, Viewer) merged in #284 on 13 Oct, but three public places still call them future work:
>
> - `src/pages/PricingPage.tsx` line 60, the Team column: "Roles for members: view, comment, edit (coming)"
> - `src/content/pricing.ts` line 174, the Team FAQ answer: "Roles for members (view, comment, edit) are coming."
> - `src/content/roadmap.ts` line 107: "Roles for members (view, comment, edit) are coming."
>
> **Steps to reproduce**
>
> 1. Open /pricing signed out.
> 2. Read the Team column, then the FAQ "What is Team?".
> 3. Open /roadmap, "Team, in beta".
>
> **Expected:** the roles are described as available (or the line drops "coming"). **Actual:** all three say "coming".
>
> Note: #302 kept "not open to the public yet" on purpose (Jordi, 13 Oct). That is a different sentence; this item is only about the roles. Test scenarios 10 L-02 expects the old wording too and needs the same change.

### Bug: the board forgets its sideways scroll after Calendar and back

> Jordi, 14 Oct 2026: on a board scrolled sideways so the Doing list is in view, open Calendar and then go back to the board: the board starts at the left again instead of at Doing.
>
> Expected: going back to a board (from Calendar, an item, For you, the browser's Back) restores the horizontal scroll position where it was, per board, for the session. A fresh open of the board from the overview may start at the left.

### Moving an item to a done list ends its claim

> Found 13 Oct 2026: four items in Done still showed "Claude Code is working on this", because the agent moved them to Done but never released its claims (claims run up to 24 hours). Jordi saw it and asked why work showed on Done items.
>
> Claiming already moves an item to Doing (#298). The other half: moving an item to a done list (or completing it) ends any claim on it, and the result says so. Releasing stays possible by hand. Same for archiving.

### Report this team, and a fair staff close (read-only, 14 days to export)

> Jordi, 13 Oct 2026 (decision "who-closes-teams"). Building now (branch team-report, migration 20261042500000). Members report a team from Settings > Team ("..." menu); a Listspace admin decides. A staff close needs a reason from the Terms' section 9 list plus a note; the team turns read-only and the owner gets 14 days to export, or it closes at once for clearly illegal content. Terms section 9 gets the team version. "Close now" uses the standard confirmation window with the team name typed.

### Removed files: members remove only their own uploads, a 30-day bin for owners and admins

> Jordi, 13 Oct 2026 (decision "who-removes-files"). Building now (branch file-bin, migration 20261042000000). Members remove only files they uploaded; the board owner and team admins remove any. A removed file waits 30 days in "Removed files" in the board's ... menu, where only the board owner or a team admin restores it or deletes it for good; then the hourly cleanup deletes it.

### Replacing a decision shows what the old one said that the new one drops, before you accept

> Idea from 13 Oct 2026 (Jordi said yes). An agent recorded "Team billing rules" with the same claim key as the 12 Oct decision. Jordi accepted it in the Inbox, and five confirmed rules (owner manages seats, invite consent, 7 days of Pro, founder fallback, admin discount) silently left the settled decisions. Nobody saw it, because the Inbox card only shows the new text.
>
> **What to build:**
>
> - In the Inbox (and in the confirm-from-email and Claude Code confirm flows), a decision that replaces another shows "Replaces: <old title>" with the old text next to the new one, and highlights the points that are in the old one but not in the new one.
> - One click options: "Replace", "Keep both" (record the new one under its own key), or "Merge" (the agent is asked to fold the old points in).
> - For agents: record_decision with a claim_key that already has a settled decision returns a warning naming the old decision, so the agent includes what still holds or picks another key.
>
> **Why:** remembering decisions is what Listspace sells. A replacement that drops decided rules without anyone noticing is exactly the memory loss Listspace should prevent.

### Team open for purchase at launch: seat billing and "Start a team" (behind teams_open)

> Jordi, 13 Oct 2026: "why wouldn't we want to already have teams running when we go live?" Build it now, for the hand test Wednesday to Friday.
>
> **Scope:**
>
> - Seat billing with Stripe per seat (Managed Payments), using the 12 Oct research and Sandbox setup (Ops item "Team seat billing: research and plan").
> - Adding and removing seats with proration.
> - Billing is owner only, with invoices to the owner.
> - Self-serve "Start a team" from /pricing and the app, through checkout.
> - 2 to 50 seats, with "get in touch" above that.
> - Per-team discount set by the admin.
> - Behind the `teams_open` switch: if it isn't solid by launch, Team stays closed and opens later without a deploy.
>
> Related: closing a team (in progress).

### Angle: one memory for all your agents, from every vendor

> Claude in the morning, ChatGPT on your phone, Cursor in the evening: all three see and update the same board. Claude's memory does not reach ChatGPT, and ChatGPT's does not reach Cursor. Listspace is the memory that is not locked to one AI company.
>
> **Agents working at the same time:** an agent claims an item before it starts, and `next_item` skips claimed items, so two agents never take the same task. A claim expires if the agent disappears. For code, each agent works in its own git worktree and branch, and conflicts are handled at merge time. This is exactly how Listspace itself was built on 6 Oct: five agents in parallel on one board.
>
> **Others:**
>
> - Linear and GitHub already let you assign issues to coding agents.
> - Jira has Rovo agents.
> - Trello's MCP has no claims.
>
> So "agents working together" alone is not unique. "One vendor-neutral memory for every assistant you use, with you deciding how much each may do" is.
>
> **Import and export** (merged from "Vendor-neutral memory: import and export", 8 Oct):
>
> - Import: bring your ChatGPT memory or Claude project notes into a board.
> - Export: the whole board as plain markdown, any time. Export already exists; before launch, check that it reads well and say it on the homepage.
> - Positioning line: "Your project memory isn't locked into one AI company." The sharpest answer to Trello, which has no reason to make that promise.
>
> Related: "Markdown and git sync", "Open source Listspace".

### Listspace for every kind of professional

> Anyone whose assistant can reach our MCP server or API can use Listspace. Ideas per profession: a board template, the assistant they already use, and what the agent does on the board.
>
> - **Writers, journalists, content creators:** an editorial calendar board (ideas, drafting, editing, published). Claude or ChatGPT turns notes into pitches; the calendar feed shows deadlines.
> - **Marketers:** campaign boards and a content calendar. Hooked up through n8n, Zapier or Make to social tools; the agent drafts posts as items for approval in the Inbox.
> - **Lawyers and legal teams:** a matter board per case (intake, research, drafting, review, filing, deadlines in the calendar). The assistant keeps a document per contract with versions, and Inbox approval fits "nothing changes without a lawyer's OK". Privacy matters most: EU hosting, a DPA, no AI training.
> - **Bookkeepers and accountants:** a client board with recurring monthly and quarterly deadlines (VAT returns, closings), document checklists, and email-to-board for receipts and invoices. Mostly ChatGPT or Claude plus the calendar.
> - **Consultants and agencies:** client boards that can be shared publicly or with guests, proposals as documents, and a CRM board.
> - **Researchers and students:** a literature board (link previews with title and authors already work for papers and books), a notes document per source, and a thesis plan.
> - **Event planners, real estate agents, recruiters:** pipeline boards (leads to done), checklists, due dates in the calendar, and capture from WhatsApp or email later.
> - **Teachers and trainers:** a course board (lessons, materials, feedback), with the assistant drafting lesson plans as documents.
> - **Musicians, photographers, video makers:** a project board per release or shoot (shot lists, gear checklists, deadlines), with the agent turning a brief into a checklist.
>
> **What to build for this:**
>
> - profession templates
> - a template gallery
> - per-profession landing pages ("Listspace for lawyers") for search and AI visibility
> - example prompts per profession on /setup
>
> Lead with privacy and the Inbox (human approval) for the regulated ones: lawyers, accountants, healthcare.

### Publish the Claude Code plugin and skill update (needs Jordi's npm two-factor code)

- Due 2026-10-13. Done

> The plugin changes from #256 (decision check), #263, #271, #273 and #275 (progress check) are on main but not published, so Claude Code users don't have them yet. Publish the agent repo, plugin and skill with Jordi's npm two-factor code. Moved to the next working session at Jordi's request (13 Oct, 00:46).

### Are all texts on the public site and in the app up to date?

- Due 2026-10-16. Done

> Asked by Jordi on 12 Oct. Start from the consistency report (`docs/communication-audit-2026-10.md`, 49 mismatches) and the decisions since:
>
> - Pro is €7.99 a month or €6.99 a month paid yearly, and founders get 50% off for as long as they keep Pro.
> - Team is €9.99 per seat a month, or €8.99 paid yearly, later.
> - Guests: up to 5 per board on Pro, with view, comment or edit.
> - Custom fields come before Team.
>
> Then check every public page, the help and docs, the emails, the app's empty states and tooltips, and the agent tool descriptions against what the app does today. One PR with the fixes, after the full feature check, so its simplifications are included.

### Database and functions optimization review, with a report

> Jordi, 13 Oct 2026: are database connections and calls optimized, and are all the needed indexes there?
>
> **Review and report on:**
>
> - **Indexes:** every foreign key and every column used in RLS policies, joins, filters and sorts. Unused and duplicate indexes.
> - **Slow and frequent queries:** pg_stat_statements on the server (read only, with Jordi's OK), plus EXPLAIN ANALYZE on the hot paths: board load, For you, the Inbox, start_session, get_board, search, the digests and the hourly jobs.
> - **RLS cost:** helper functions called per row (security definer and stable, inlining, auth.uid() wrapped in select).
> - **Connections:** PostgREST pool size, the functions router's database clients (pooling, reuse per process), GoTrue, and Postgres max_connections and memory settings for the server size.
> - **Functions:** extra round trips per MCP or API call, N+1 patterns, caching.
>
> **Output:** a report with findings, measured numbers and a prioritized fix list. Fixes go in separate PRs, and every production change needs Jordi's OK.

### For you opens the full edit window even for a View guest; the database allows comments on archived items

> Found in the review of #265 on 13 Oct 2026. Neither problem comes from #265.
>
> 1. **For you opens EditTaskModal for every item.** A View guest who reaches an item from For you (a request or an old mention) sees the edit window, including the comment box. The server refuses the save, so nothing leaks. But the window should work out the user's board role and open read only. Files: src/components/forYou/ForYouItemWindow.tsx, and the code comment in EditTaskModal.tsx.
> 2. **Archived items:** only the UI hides the comment box. The database insert policy doesn't refuse a comment on an archived item. Add that rule and an SQL test.

### A soft sound when something lands in the Inbox of the board you have open (switch off in Preferences)

> Jordi, 13 Oct 2026: play a simple, short sound when a new suggestion or decision lands in the Inbox of a board you have open, like the sound of an incoming email. It can be switched off in Settings > Preferences.
>
> **To work out:**
>
> - It plays only for new items from someone else or an agent, never for your own actions.
> - Several arriving at once play one sound, not one each.
> - It follows the browser's autoplay rules, so it works after the first click on the page.
> - It respects the system's reduced-motion and quiet settings where possible.
> - The sound file is tiny and has our own license.
> - The Inbox popup (toast) keeps working as today.

### "Clean up list": archive items older than X, plus "Include archived" in search

> Jordi, 13 Oct 2026: a "Clean up list" option that archives items older than a chosen age makes sense.
>
> **Clean up list:**
>
> - In the list's ⋯ menu: "Clean up list…" with a choice: done items older than 2 weeks, 1 month, 3 months, or all items not changed in X.
> - Shows "This archives 37 items" first, then one click.
> - Undo in the toast. Archived items stay restorable in the board menu under Archived items.
> - Optional later: automatic per list (fits "Done cleans itself up").
>
> **Search and archived items:** today search leaves archived items, lists and boards out, in the app and for agents (search_items). Add an "Include archived" option in search, and an include_archived parameter for agents, so old work stays findable.
>
> Related: "Delete archived items after 90 days" in Preferences (off by default).

### Listspace with Constance: a board that knows what is still true

> Combine Listspace with Constance (trustconstance.com) or only its Continuity SDK: governed memory where every claim is **settled**, **replaced**, **on record, not established** or **in dispute**. Nothing becomes settled without a person deciding it, and every change is recorded in an append-only ledger.
>
> Why it fits: Listspace already has half of this shape. Agents propose, and the Inbox is where a human decides. Documents have versions. What is missing is the status of a fact. Today a decision in Project Input and a stale note elsewhere look equally true to an agent.
>
> Possible steps, small to big:
>
> 1. **Decision items:** an item type with a status (Confirmed, Replaced by X, Conflict) and "decided by, on, because". Agents read only Confirmed decisions as guidance. This could be built natively first.
> 2. **Constance as the engine behind decisions:** "Confirm" in the Inbox writes to a Constance ledger. The board shows receipts (who, when, what it replaced).
> 3. **Agent tools:** start_session returns Confirmed decisions and open conflicts separately, and agents can propose but never confirm, the same asymmetry as the Inbox.
>
> **Board gardener** (merged from "Board gardener", 8 Oct): an agent that periodically flags stale items, duplicates and decisions that contradict each other, the upkeep nobody does on a board. Its findings go to the Inbox, or become "in dispute" in Constance terms. Could ship as a built-in rule under "Agent rules: agents that listen to lists and act".
>
> See also the "Decision log list type" idea and "Earned autonomy".

### Inbox shows a decision's title twice

> Found by Jordi on 12 Oct. In the board's Inbox, a decision waiting to be confirmed shows its title twice: in the line "Claude Code wants to record a decision: <title> in Project Input" and again in the Decision block. Fix: the top line says "Claude Code wants to record a decision in Project Input" without the title; the Decision block shows the title once, then the reason, then "Confirmed if you accept". Planned in the Inbox popup PR (the follow-up on the decision capture PR).

### Use cases for the website

> Write scenarios or use cases for the website that show what Listspace does that a plain board with an agent connector cannot.
>
> **Note:** Trello's official connector also works in both Claude and ChatGPT, so "save in one app, read in another" is not unique on its own. Each use case should lean on something only Listspace has: documents with versions, the Inbox, Agent access, claim and next_item, board guidance for agents, who-did-what history.
>
> ## Candidates
>
> **1. One document, every agent** (Jordi's idea)
> Write a PRD in ChatGPT, save it to the board, open it in Claude and keep working. Every saved change is a version, so you can see what ChatGPT wrote, what Claude changed, and roll back. _Unique part: versions and who-did-what._
>
> **2. New chat, no re-explaining**
> Open a fresh chat in any app and say "let's continue on project X". The agent reads the board, its instructions and the open work, and picks up where the last session stopped. The headline use case: "Stop being your agent's memory." _Unique part: start_session and board guidance._
>
> **3. Plan in one tool, build in another**
> Plan the work in ChatGPT, then let Claude Code or Cursor take the To Do items one by one, moving each to Doing and Done and leaving a summary. _Unique part: next_item, claim, session summaries._
>
> **4. Two agents, one board, no collisions**
> Claude Code and Codex work on the same project at the same time. Each claims an item before starting, so they never work on the same item twice. _Unique part: claim_item._
>
> **5. Your agent proposes, you decide**
> Set a board to "Suggest". The agent works overnight and puts its changes in the Inbox. In the morning you accept or reject each one. _Unique part: Inbox and Agent access._
>
> **6. Why did we decide that?**
> Three weeks later you ask any agent why you chose X. It answers from the decision and its reason on the board, in any app. _Unique part: decisions as items with reasons, readable across agents._
>
> **7. Build in public, for people and their agents**
> A public board is your roadmap and changelog. Other people can point their own agent at it to understand your project. This board is the live example. _Unique part: public boards as agent context._
>
> **8. Idea on the go, work at the desk**
> Capture an idea in a chat on your phone. The next morning your coding agent finds it in Ideas and asks whether to start. _Unique part: shared capture across apps, Inbox._
>
> ## Later (depends on features not built yet)
>
> - Client board shared privately, read-only for the client, with agent-written session summaries (needs private sharing).
> - Reading or watch list that fills in covers and links by itself (needs smart lists).
> - "What your agents did today" email (needs the daily email).
>
> ## Format
>
> Each use case: one line headline, three to four steps with screenshots or a short animation, and the one feature that makes it possible. Pick three or four for the homepage, the rest on a separate use cases page.
>
> Related: "Conversation animation with Claude", "Homepage: make clear Listspace also works without agents".

### Comparison pages and a blog

- Due 2026-10-17. Done

> For search and AI visibility: AI assistants recommend tools they find described clearly and fairly.
>
> - **Comparison pages:** Listspace vs Trello, vs Notion, vs Linear, vs Jira, vs GitHub Projects, and "Trello MCP alternatives". Each one should be honest about what the other does better, dated, with a short table and the agent angle: Inbox, Agent access, agents that work on their own.
> - **Blog ("Notes"):** tips for working with agents, big updates and build-in-public stories. Short, practical, one idea per post. Every post links to the setup page.
> - **Changelog page:** fed from the Done list, so updates are visible without extra writing.
>
> All of these are prerendered, in the sitemap and in llms.txt.

### Shipped 12 and 13 Oct: sign-in gaps, decisions switch, MCP 2026-07-28, Done lists, share window and more

> All are live on listspace.app, deployed with Jordi's OK, after a database backup each time.
>
> | PR | What |
> | --- | --- |
> | #262 | Sign-in gaps: sign-up and password reset through functions that answer the same for every address. create_account sends a 6-digit code. Unconfirmed accounts are cleaned up. Public signup, recover and resend are closed in nginx. |
> | #263 | A Decisions switch per board, and one "Accept all (N)" in the Inbox. |
> | #259 | MCP 2026-07-28 next to the older versions. Decisions can be confirmed on Claude Code's own confirm screen (OAuth apps, Capture or higher, never on a board with decisions off). |
> | #265 | Comment straight from an item's view, in one click. |
> | #266 | An item in a Done list reads as done everywhere: Table, Calendar, badges, item window, the agent's due list, the calendar feed and the public board. |
> | #267 | The brand page offers the light and dark backgrounds for download. |
> | #268 | A cleaner share window: guests' rare settings in a ⋯ menu, the public link's settings in one fold. |
> | #269 | Guests can be anyone, not only "a client or freelancer". |
>
> **Server:** GoTrue's email limit is now 250 an hour.
>
> **In progress:**
>
> - #270 item view without boxes (in review)
> - "Not a decision" in the Inbox
> - decisions Off by default
> - Team v1 (#264, review fixes)

### Comment straight from an item's view, without first clicking Edit

> Jordi, 12 Oct 2026: in an item's view state, writing a comment takes 2 clicks (Edit > Comments). Commenting is used often, so by the UX rule it belongs in plain sight and takes one click. Proposal: the view shows the comments with an "Add a comment" field under them, and the same comments thread stays the only place for comments (one place per thing).

### Is the test scenarios list up to date?

- Due 2026-10-15. Done

> Asked by Jordi on 12 Oct. Compare the test scenarios (the docs the 11 Oct test run filled, and the hand test list on Ops, "Today, Jordi: test by hand") with everything shipped since: comments v2 and mentions, file versions, agent PDF and Word files, Requests context and outcome, CSV import, view counts, the badge, previous and next, the PDF click and select comments, iPad dates, the installable app and two-step sign-in. Add missing scenarios, remove outdated ones, and mark which are covered by automated tests (unit, SQL, dry run) and which need a person.

### Decisions v1: a board that knows what is still true (Constance model, before launch)

- Due 2026-10-14. Done

> Decided by Jordi on 12 Oct: build it before launch if it fits, as a USP for the public site. It's built natively in Postgres, with the Continuity SDK's specs and acceptance tests as the blueprint. See the idea "Listspace with Constance".
>
> **v1 scope:**
>
> - Decision items with a status: Proposed, Confirmed, Replaced (by which decision) or Conflict, plus "decided by, on, because". At most one Confirmed decision per key.
> - People confirm, replace and resolve conflicts. Agents record and propose; their proposals always go to the Inbox, at every level.
> - An append-only History with a SHA-256 hash chain per board, and receipts with a "verified" check.
> - Agents get Confirmed decisions apart from those in Conflict in start_session and get_board.
> - A badge on the item, the actions and receipts in the item window, the Inbox proposals, and a help article.
>
> PR due 14 Oct, then testing. Not in v1: the board gardener, and a Postgres adapter in the SDK itself.

### Requests: load check before sending

- Due 2026-10-15. Done

> Agreed 9 Oct, after Requests v1. Before a request goes out, the sending assistant checks the receiver's load and availability:
>
> "Sara already has 6 open requests due this week and is off on Friday. Send anyway, or ask Tom?"
>
> - Load: open requests and tasks for that person, by due date.
> - Availability: an out-of-office setting per person (and later posts on the message board).
> - Only a warning, never a block.
>
> Related: "Requests and tasks between people (and agents), through their assistants", "Message board: announcements on a board".

### Trello import: bring over due and start dates

> Found on 12 Oct while researching custom fields. The Trello import (src/utils/trelloImport.ts) reads names, descriptions, lists, labels, checklists, comments and attachments, but not a card's `due`, `dueComplete` or `start`. Every imported item arrives without dates. Map them to due_date, due_time, start_date and done. Small, and it matters for anyone switching from Trello at launch.

### Board analytics (prepare the data now)

> Idea from Jordi, 7 Oct. Per board, what moved and who moved it:
>
> - Items added, finished and still open per week
> - How long items take from To do to Done
> - What agents did compared with people
> - Overdue items and items that have not moved in a while
>
> **Now, before launch:** make sure the item history records everything these numbers need (list kind at the time of a move, person or agent, timestamps), with indexes for the queries. Then the numbers are there from the first users, even if the screens come later.
>
> **Plans:** analytics on Free; the AI-written status report on Pro.

### Session summaries

> At the end of a session the agent writes a short summary on the board. The next session starts from it.

### Full feature check: does everything still make sense, and what can be simpler?

- Due 2026-10-16. Done

> Asked by Jordi on 12 Oct, before the 19 Oct launch. A thorough walk through the whole product, as a new user and as an agent.
>
> **Questions for every feature:**
>
> - Does it still make sense next to everything built since? Do two features overlap? For example For you, Important, Unsorted, the Inbox, Requests, mentions and "Waiting for you".
> - Can it be simpler without losing what it does: fewer screens, fewer settings, fewer words, one place instead of two?
> - Is the name clear and the same everywhere: the app, help, docs, emails and the agent tools?
> - Does it work for a guest, on an iPad, in dark mode and through an agent?
>
> **Scope:**
>
> - The app: dashboard, For you, boards, the item window, comments, files, the Agents window, settings and admin.
> - Public pages and docs.
> - The emails.
> - The MCP tools and their descriptions: are there too many tools, or ones that overlap?
>
> **Output:** a document with findings ranked by impact. Each finding marked keep, simplify, merge or remove, with a proposal. Jordi decides, then the changes go in one or two PRs before launch.
>
> Input: the consistency report (`docs/communication-audit-2026-10.md`, PR #218).

### Project status report: a real summary, in the app and through your agent

> Idea from Jordi, 7 Oct. Not a list of everything done, but a solid summary of where a project stands: progress, what's at risk, what's blocked, what's next and what needs a decision.
>
> - **Without AI:** a plain Status page per board, with numbers and a PDF. Counts per list, finished this week, in progress, overdue, and items that haven't moved in a while.
> - **Through your agent:** ask Claude or ChatGPT for "a status report of this board". Your own AI reads the board's data through the board_report tool and writes the report itself, so Listspace has no AI cost and there is no AI fee on any plan.
> - **Formats:** a page to share, PDF and markdown.
>
> Works best once the board analytics data is in place.

### Guests' agents can't claim items on a shared board

> Found on 12 Oct in a code check. `claim_item` only finds items on boards the caller owns (`b.user_id = v_uid`), so an Edit guest's agent can't claim work on a shared board, although the header of the board_guests migration says it can. Decide: Edit guests' agents may claim (likely yes, the same as Requests), then fix `claim_item`, `release_item_claim` and `next_item`, with SQL tests.

### Two-step sign-in: limit wrong codes per account, not only per IP

> Found on 12 Oct by the two-step sign-in test (PR #218).
>
> - Wrong TOTP codes are limited per IP address only (429 from the 30th try). There is no lockout per account, so someone with the password and many IP addresses could keep guessing codes. Add a limit per account, for example 10 wrong codes in 15 minutes, then a wait, and an email to the account owner.
> - Lower risk: after a recovery code is used, the other 9 stay valid. If 2FA is turned on again and making new codes fails, the old ones still work, so the Settings text saying they "no longer do anything" isn't quite true. Revoke the old codes when 2FA is turned off or on again.

### Agents upload files without pasting them as text

> Found 9 Oct: attaching a 68 KB PDF through the MCP tool means sending about 91,000 characters of base64 in one tool call. That is slow, expensive, and one wrong character breaks the file without anyone noticing.
>
> **Options:**
>
> 1. **A temporary upload link.** A tool returns a short-lived, single-use upload URL for one item; the agent sends the file with one command (`curl --upload-file report.pdf <url>`), then the file appears on the item. Works for agents that can reach listspace.app (Claude Code, Cursor, Codex on someone's own computer).
> 2. **Chunked upload with a checksum.** For agents in a sandbox whose network can't reach listspace.app (such as Claude in a cloud workspace): send the file in parts of a few hundred KB each, plus a SHA-256 of the whole file. The server joins the parts and checks the hash, so a broken file is refused instead of saved.
> 3. **Return the hash on every upload.** Even the current one-call upload should return the file's SHA-256, so the agent can compare it with its own copy.
>
> Related: "Agents and files: listspace attach" (Done), the attach_url tool (files from a public web address).

### Hide "Keyboard shortcuts" in the Help menu on touch devices

> Jordi, 11 Oct: on phones and tablets without a keyboard, the Help menu item "Keyboard shortcuts" is of no use. Hide it there.
>
> **How**
>
> - Hide it when the device has only touch: CSS `@media (hover: none) and (pointer: coarse)`, or the same check in code.
> - **iPad with a keyboard:** an iPad with a Magic Keyboard or another keyboard can still use shortcuts but may count as touch. Show the item again as soon as a physical key is pressed in that session (a keydown that doesn't come from the on-screen keyboard), and remember it for the device.
> - Also hide shortcut hints elsewhere on touch devices, such as "Alt+Shift+A" next to Archive in the item window and the shortcut hints in tooltips and the command palette.
>
> **Done when:** the item and the hints don't show on an iPhone or an iPad without a keyboard, and do show on a computer and on an iPad once a keyboard is used.

### iPad: date fields in the item window show as empty boxes

> Found by Jordi on 11 Oct (iPad, Safari), in the item window of a document on Listspace Ops ("Agent rules"). Under **Dates**, the Start and Due date fields are blank boxes: no placeholder, no calendar icon, nothing that says you can tap them. Time is greyed out (fine, it needs a due date first, but that isn't clear either).
>
> **Likely cause:** Safari on iPad and iPhone draws an empty `<input type="date">` as a blank box. It shows no "dd-mm-yyyy" placeholder and no picker icon, unlike desktop browsers. Tapping may still open the picker, but nothing invites you to.
>
> **Fix**
>
> - Show a visible hint in empty date fields on touch devices: placeholder text ("Add start date", "Add due date") and a calendar icon, for example by styling a button that opens the native picker.
> - Make sure tapping anywhere in the box opens the native date picker.
> - Time: explain why it's disabled ("Set a due date first") or hide it until there's a due date.
> - Check the same fields on iPhone and in the board's table and calendar views.
>
> **Done when:** on an iPad and an iPhone, an empty date field clearly shows what it's for, opens the picker on tap, and a chosen date shows in the box.

### Updates across spaces: see Personal while you're in Work

> Jordi, 11 Oct: when I'm in my Work space, I don't see updates from my Personal space.
>
> Spaces work like desktops: the dashboard and the board list show one space. That's right for boards, but updates are about **you**, not about a space, so they should follow you everywhere.
>
> **Proposal**
>
> 1. **Personal things span all spaces:** For you, Important, due and overdue items, Inbox suggestions, catch-up and notifications always show every space. Each row shows a small space label ("Personal", "Work"), with a filter to show one space.
> 2. **A count per space in the space switcher:** "Personal · 3" when something there needs you, so you can see it without switching.
> 3. **The daily or weekly email** already covers every board; check that it groups by space.
> 4. **Optional focus setting per space:** "Leave Personal out of my updates during work hours" (or switched off completely), for people who want the separation. Off by default.
>
> **Check first:** what For you, Important and the notifications show today when switching spaces, so the fix lands only where it's needed. The assistant tools (my_items, catch_up) already work across all boards.
>
> Related: "For you: one personal view across all boards", "Catch up: what happened since I was last here?", "One daily email: summary and due items together", "Spaces: groups of boards, like desktops".

### Check that all communication is consistent

> A thorough pass before the beta: everything Listspace says, in every place, should tell the same story with the same facts and words.
>
> **Where to check**
>
> - Website: homepage, pricing, /compare, Trust page, help articles, brand page.
> - In the app: onboarding, settings, empty states, error messages, the upgrade screens.
> - Emails: welcome, sign-in, tasks due and daily summary, payment and founder emails.
> - For agents: MCP tool descriptions, the server instructions, the default guidance for agents.
> - Directory listings: MCP Registry, Smithery, the Claude and ChatGPT submissions.
> - Sales documents: teams, freelancers, investor overview, "Listspace in short", and their PDFs.
>
> **What to compare**
>
> - **Prices and plans:** one Pro price everywhere (the investor overview says €7.99 a month or €83.88 a year; older items on the boards still say 12 and 10), Free at levels 1 to 3, Team and Business marked as planned.
> - **The founder offer:** first 100 paying customers, 50% off for as long as they keep Pro, a numbered badge.
> - **Only what's live:** features that aren't built yet (guests, Team, shared boards, copying public boards) are marked as planned or left out. The homepage Free card "Every live feature on this page" must match the Free plan.
> - **Numbers:** tool count (53 and 68 both appear), directory status, dates.
> - **Names and words:** "Listspace" (not ListSpace or ListSpace.app), Agent access levels and their names (Read only, Suggest, Capture, Act, Full), Inbox, two-step sign-in, and the same name for each feature everywhere.
> - **Claims:** hosted in Germany, no AI training, agents can't delete, export on every plan; "Works with Claude" in plain text only, no logo.
> - **Tone:** plain words, no em dashes, the same headline ("Stop being your agent's memory").
>
> Done when the differences are listed and fixed, with one short reference list of the facts (prices, plans, offer, numbers, names) that every page and document follows.

### Test two-step sign-in (2FA) end to end

- Due 2026-10-11. Done

> Two-step sign-in shipped on 7 Oct; test it fully before the beta opens.
>
> - **Turn it on:** scan the code with an authenticator app (for example Google Authenticator, 1Password, Authy), confirm with a code, and save the backup codes.
> - **Sign in on the web** with email and the code; a wrong or old code is refused with a clear message.
> - **Connect Claude and ChatGPT** with 2FA on: the sign-in for the connector asks for the code too, and the connection works afterwards.
> - **Backup codes:** sign in with one; it works once and can't be used again.
> - **Lost phone:** the way back in without the authenticator (backup codes, then support) is clear on screen.
> - **Turn it off** again: needs a code, and sign-in without a code works afterwards.
> - **Mobile:** the code field works on a phone (numeric keyboard, paste from the authenticator app).
>
> Done when every step works and anything that doesn't is logged as a bug.

### Requests: context travels with the request

- Due 2026-10-19. Done

> Agreed 9 Oct, after Requests v1. When Sara's assistant picks up a request, it gets everything needed to start straight away, without asking around:
>
> - the why, in the asker's words;
> - the linked item or document, and what changed recently ("section 2 changed yesterday");
> - related decisions from the board's info lists;
> - earlier comments on the item.
>
> Her assistant opens with a briefing: "Jordi wants a check on tone before Friday; section 2 changed yesterday; the decision on the tagline is in Project info."
>
> Related: "Requests and tasks between people (and agents), through their assistants".

### Requests: close the loop with a short outcome

- Due 2026-10-19. Done

> Agreed 9 Oct, after Requests v1. When a request or task is done, the person who asked gets a two-line outcome, not just "done":
>
> "Sara checked the brief: tone is fine, section 2 shortened. One open question about the tagline, in the comments."
>
> - Written by the receiver's assistant from what changed and the comments, or by the receiver.
> - Delivered the same three ways: the asker's assistant at the next session, email (or the daily email), and the app.
>
> Related: "Requests and tasks between people (and agents), through their assistants", "Catch up: what happened since I was last here?".

### "Made with Listspace" badge on public boards

> Chosen 9 Oct instead of sponsored backgrounds: every shared board advertises Listspace, and nobody has to sell sponsors. See "Sponsored backgrounds for free users, like WeTransfer" for why ads fit poorly.
>
> - A small, quiet badge in a corner of public boards: "Made with Listspace", linking to the homepage with a referral tag, so sign-ups from shared boards can be counted.
> - Free plan: always on. Pro: can switch it off.
> - Note: the shared board header used to say "Made with ListSpace.app"; it was removed in the header cleanup (see "Shared board: same header and footer as the app"). The header now has "Make your own board", which already does part of this job. The badge should not bring back clutter in the header: a corner badge or the footer.

### Simple view counts on public boards

> The owner of a shared board sees how many people viewed it this week, and where they came from (referrer domain only).
>
> - Counted on the server, without cookies and without storing IP addresses, so no consent banner is needed.
> - Useful for build-in-public boards, and a natural Pro feature.

### "What your agents did today" email

> An optional daily email listing what each agent added, moved and finished. Daily proof of value, and very sticky.

### Installable phone app: add Listspace to your home screen

> Split from the idea "Recurring items, installable mobile web app" (agreed by Jordi on 12 Oct as a To Do). A web app manifest, icons and a minimal service worker, so Listspace can be added to the home screen and opens like an app. Recurring items stay an idea.

### CSV import

> Split from the idea "More imports besides Trello: Notion first, then CSV for the rest" (agreed by Jordi on 12 Oct as a To Do). Import a CSV into a board: map the columns to list, title, description, due date and labels, with a preview before importing. The Notion import stays an idea.

### Share a board privately with someone

> Next to making a board public, you should also be able to share a board privately with a specific person, so only they can see it (and possibly edit it).
>
> Open questions: view only or also edit, invite by email or by link, and whether this is Free, Pro or part of the Team plan later.

### Rename the "supabase" folder now that we run our own backend

- Due 2026-10-10. Done

> The backend code lives in supabase/ (functions and migrations) because Listspace started on Supabase. Since the move it all runs on our own server, so the name misleads. Rename it (for example to backend/) in one PR when no other PR is open. It touches the deploy scripts, the dry-run stack, CI, the Deno config, the functions router, docs and the agent skill. The scripts and tests catch anything that's missed, and production isn't affected until the next deploy runs with the new paths.

### Comments v2: replies, edits, open counts, @mentions, a wider item window

> Agreed by Jordi on 11 Oct, live on 11 Oct (PR #213, 4 migrations from 20261026900000).
>
> - The item and document window is as wide as the file viewer.
> - Clicking a comment selects its pin or passage.
> - Edit and delete your own comment, marked "(edited)". The board owner can delete any comment. All of this is enforced in the database.
> - Replies, one level deep. Resolving a comment resolves its thread, and any thread can be resolved.
> - Counts show open comments only, with "Show resolved (N)".
> - @mentions: "Waiting for you" in For you, an email right away (a setting turns it off), a line in "Your day", an @ marker on the board item and a count on the board tile. A mention stops waiting when the thread is resolved, the person replies, or the person presses "Seen". Replies notify in the app only. Agents see mentions in start_session and my_requests.
> - "Turn into a request".
> - The actions sit in one row: Reply, Resolve, and a ⋯ menu.
>
> Left over:
>
> - Agents can't add mentions yet.
> - An @ typed while editing a comment stays plain text.
> - The public shared board shows no @ markers.
> - The built-in background colors and photographer credits need a check in a browser.

### Info and warning logs also print in production

> Found in the code health PR (#212). `logger.info` and `logger.warn` print in the browser console in production too, because Vite's env has no `NODE_ENV`. Gate them on `import.meta.env.PROD` (keep errors).

### Built-in backgrounds: descriptions don't match their photos

> Found in the code health PR (#212). Several built-in background descriptions describe a different photo than the one shown, so searching in the background picker finds the wrong ones. Rewrite each description from its real Pexels photo.

### Phones: the sticky app footer takes too much of the screen

> Found in the code health PR (#212). On phones the sticky footer in the app takes a noticeable strip of the screen. Make it scroll with the page (or drop it) under 768.

### Code health and small screens PR: tests in CI, the top 10 from the code health check, Pexels via the server, admin on a phone, sideways phones

- Due 2026-10-12. Done

> Agreed by Jordi on 10 Oct. One PR after tonight's PRs are merged; then the "supabase" folder rename on its own (Jordi wants a heads-up when it can be done).
>
> **From the code health check (the top 10):**
>
> 1. Run the 771 unit tests in CI.
> 2. Delete the dead Cypress suite.
> 3. Fix the 33 quick lint problems and turn lint on in CI.
> 4. Old hosted-Supabase and Netlify docs and settings.
> 5. Remove the live-update code production no longer runs.
> 6. The "migration not applied yet" fallbacks: after one read-only check on production, with an OK.
> 7. Load pages and libraries only when needed (about 29% less on the first load).
> 8. Delete the small dead files.
> 9. Parse database rows at the boundary in the older services.
> 10. Run the 56 SQL tests in CI (mind the Actions minutes: on PRs that touch migrations only).
>
> **Pexels via the server:**
>
> - A search function on the server, with a limit per account.
> - A shared cache of search results (popular words like "mountains" are searched over and over).
> - The built-in backgrounds as a fallback when the limit is reached.
> - Remove the key from the app build, then rotate it at Pexels.
> - Ask Pexels for a higher limit (free for apps that credit the photographers).
>
> **Small screens:**
>
> - An iPhone held sideways gets the phone version: check height as well as width.
> - Admin works on a phone, for the urgent actions: suspend an account, invite someone, give Pro. Tables become stacked rows.
>
> Not done: renaming tasks and cards to items in one go. Files get renamed when they're next touched.

### Pins on images and passages in PDFs (design and document feedback)

> Jordi on 11 Oct: "this is great, let's build this", right after Requests.
>
> - **Pins on images:** click a spot on an image in the file viewer, and a numbered pin appears there with its comment, as in Figma. The pins are stored with the comment (x and y as a share of the image, so they survive resizing), hidden or shown with one toggle, and can be resolved like passage comments.
> - **Passages in PDFs:** the PDF viewer shows a selectable text layer (pdf.js). Select a sentence and comment on it: page plus quote, marked in the PDF, in the side panel, resolvable. "The text changed since" when a new version of the file replaces it.
> - **Agents:** add_comment takes a pin (x, y) or a PDF anchor (page, quote).
> - **Guests:** Comment guests can do this, View guests read.
>
> Plus, on the home page: "No code to write" gets more attention: next to the copy line in the hero, and as the heading above the chat demo.

### Requests and tasks between people (and agents), through their assistants

- Due 2026-10-11. Done

> Decided direction (9 Oct). **USP: you never leave your assistant to give people work.** "Can Sara check this document before Friday?" is enough.
>
> ## The flow
>
> 1. **You ask** in Claude: "Can Sara check the brief before Friday?" The assistant checks that Sara is a member or guest of the board (if not: "Sara isn't on this board, invite her?"), then confirms in one line ("Send to Sara: check the brief, by Fri?") and sends.
> 2. **It lands on Sara's personal list** ("For you", below) and she hears about it in three places: her assistant at her next session, an email straight away with a button to the item, and a count in the app.
> 3. **Sara answers** however suits her: tells her assistant, comments in the app, or (later) replies to the email. Every answer becomes a comment on the item.
> 4. **You hear back** the same three ways, and the item shows the status.
>
> ## Four kinds, one feature
>
> - **Do this**: a task with a due date ("merge PR 180 so we can deploy"). Done when she marks it done.
> - **Look at this**: review and feedback, answered with a comment.
> - **Question**: answered with a reply.
> - **Approve**: Approve or Reject with a reason, straight from the email. Works for clients as free guests.
>
> The receiver can **accept, decline (with a reason) or pass it on** to someone else on the board.
>
> ## "For you": one personal list across all boards
>
> Not a separate list on a board. The work stays on its board (with its context, documents and history); what's personal is the **view**:
>
> - **"For you"** in the app and in the assistant ("what's on my plate?"): every request and task for you across all boards, sorted by due date, with who asked and from which board.
> - Also what **you're waiting on**: requests you sent that aren't answered yet.
> - On the board, the item shows who it's for ("For Sara, by Fri").
>
> ## Agents can ask too
>
> - **An agent can give a person a task**, for example Claude Code: "merge PR 180 so we can deploy". Shown as "Claude Code, for Jordi".
> - **An agent that's stuck asks a specific person** instead of guessing or stopping: "I need the API key for the payment provider". It continues when the answer comes in. This is the Inbox made personal: the Inbox approves changes, a request unblocks work.
> - Agents can only send requests to people on the board, within their Agent access level; at levels 1 to 3 the request waits in the Inbox first.
>
> ## Rules that keep it pleasant
>
> - The assistant always confirms before sending in someone's name.
> - Several requests close together become one email.
> - At most one reminder, only after the due date.
> - The status is visible on the item: "Waiting for Sara since Tue", "Done by Sara, Wed".
> - Open requests both ways sit at the top of the daily or weekly email.
>
> ## Making it stronger
>
> 1. **Your agent works your list.** "Handle my tasks" or "do what's for me today": your assistant takes the items on your For you list that it can do, and leaves the rest. Requests become work, not just notifications.
> 2. **Context travels with the request.** Sara's assistant gets the why, the linked document and the related decisions, so it can start straight away ("Jordi wants a check on tone; section 2 changed yesterday").
> 3. **A load check before sending.** "Sara already has 6 open requests due this week, and is off on Friday. Send anyway, or ask Tom?" (Availability comes from the message board or an out-of-office setting.)
> 4. **Closing the loop.** When a task is done, the asker gets a two-line outcome, not just "done".
>
> ## A note on "push into Claude"
>
> Assistants can't receive a message out of nowhere: a connector is only called when the person talks to their assistant. Requests therefore reach the assistant at the next session; real push goes through email (later mobile push and Slack or Teams).
>
> ## Version 1
>
> `send_request`, `answer_request` and `my_requests` in the MCP (with a member check); requests shown at session start; "For you" in the app; the status on the item; email for new requests and answers; the four kin [cut short; open the board for the rest]

### File viewer as an album: page through files, and comments per file (for designs)

- Due 2026-10-12. Done

> Jordi on 11 Oct: when an item has several files, page through them with left and right buttons, like an album, and give comments per file. Works well for designs.
>
> **1. Page through files**
>
> - Arrows left and right in the file viewer, plus the arrow keys and swiping on a phone or tablet. A counter shows "3 of 8".
> - Follows the order of the Files list, including its sort.
> - Files that can't be previewed show their name and a Download button, and the next one is one tap away.
>
> **2. Comments per file**
>
> - A comment panel next to the file in the viewer (below it on a phone). A comment belongs to that file.
> - In the item's Comments tab, these comments show with a small file tag ("on homepage-v2.png"), so nothing gets lost.
> - Agents: list_comments and add_comment get an optional attachment_id, so an agent can give feedback on a specific design or read it.
>
> **3. Later (with guests and Requests)**
>
> - Pins on an image: click a spot and leave a comment exactly there.
> - Versions of a file: upload homepage v2 over v1, keep both, and compare them.
> - A "Look at this" request on one file.
>
> Strong together with guests on a board (clients review designs) and Requests.

### Comments on a passage of a document (PRDs, specs), like comments on a file

> Jordi on 11 Oct: comments on PRDs could work for developers too, the same way as comments per file in the file viewer.
>
> - **In a document:** select a passage and comment on exactly that, as in Google Docs. The passage is marked; comments sit in a side panel next to the text and can be resolved.
> - **In the item's Comments tab** they show with a quote of the passage, so nothing gets lost.
> - **When the text changes:** the comment stays on the version it was made on, with "the text changed since".
> - **Agents:** read comments with the passage, and comment on a passage (for example "this requirement contradicts section 2"). With Requests: "Can you review the PRD before Friday?"
>
> Builds on the same comment model as "File viewer as an album: comments per file", so build them together, or this right after.

### Home page: "Set up in one sentence" as a selling point (copy line in the hero, a chat demo section)

- Due 2026-10-12. Done

> Agreed with Jordi on 11 Oct: how easy it is to connect your agent becomes a selling point at the top of the home page. A small PR after "dashboard-polish" (new hero) and "connect-one-sentence" (/connect) are merged.
>
> **1. In the hero, under the buttons:** "Paste this into your AI:" with `Set up Listspace for me: listspace.app/connect` and a Copy button.
>
> **2. A section right below the hero, "Set up in one sentence":**
>
> - A chat window that plays out by itself (short, no sound, respects reduced motion): you paste the sentence, the assistant says "Open this link and click Allow", then "Connected. Shall I make a board for ...?", you say "Yes", and it answers "Done. I'll keep it up to date while we work."
> - Three steps next to it: Paste, Allow, Done. "Under two minutes. No settings, no code."
> - A switch: Claude, ChatGPT, Claude Code, each with its own real steps.
>
> **Honest:** the chat text comes from a real test run of /connect (the connect PR runs one); no invented claims. Later, replace it with a real recording (item "Video and animations").

### Share window: use the wide modal (like the item window), it feels cramped

- Due 2026-10-12. Done

> Jordi on 11 Oct: since guests were added, the Share window (Share this board) feels cramped in the narrow modal. Use the same width as the item window.
>
> **With the extra room:**
>
> - **Guests:** the invite row (email, role, "Access until", Invite) on one line; each guest on one line (name and email, role, access until, send again, remove) instead of two.
> - **Public link and its settings** (password, show comments, images) in a clear second section, or two columns on wide screens: Guests on the left, Public link on the right. Pick what reads best; on a phone it stays one column.
> - The "What visitors see" note stays at the bottom.
>
> Check at 1280, on an iPad (820 and 1180) and on a phone, light and dark.

### Connect in one sentence: "Set up Listspace for me: listspace.app/connect"

> Jordi on 11 Oct: adding Listspace to your AI must be as easy as possible. You tell your agent to install it, and the agent tells you exactly what to do.
>
> **1. One sentence**
>
> - On the home page, /setup and in the getting started emails: "Paste this into your AI:" followed by `Set up Listspace for me: listspace.app/connect`.
> - /connect is a page written for agents (like agents.md). The agent works out which app it is in and acts:
>   - **Coding agents** (Claude Code, Cursor, Codex, VS Code, Gemini CLI): run the install command themselves (for example `claude mcp add --transport http listspace <url>`), then the person clicks "Allow" once in the browser (OAuth) or confirms a pairing code.
>   - **Chat apps** (Claude, ChatGPT): can't install connectors themselves, so they tell the person the exact 3 clicks for that app, with the address to copy, and then check that it works (get_account).
>   - **Afterwards:** start_session, make the first board or pick an existing one, explain Agent access in two sentences, and ask how much the agent may do on its own.
> - No account yet: the agent signs up for the person (already built: agent signup with an email claim).
>
> **2. One-click buttons where apps allow it**
>
> - "Add to Cursor" and "Add to VS Code" install links on /setup and /works-with.
> - Claude and ChatGPT: "Connect" from the directories once approved (Claude submitted, ChatGPT after the video).
>
> **3. Measure it:** how many people get from sign-up to "agent connected", and where they drop off (the getting started emails already send a nudge after a day).
>
> On the roadmap as "one-click connect" (from the /compare rewrite).

### /compare: drop "Where the others are strong", and put what they do better on the roadmap

> Jordi on 11 Oct: Listspace aims to be the go-to tool for project management and agentic project management, in the broadest sense, for businesses and consumers. So "where the others are strong" stays only for things that are not, and never will be, part of Listspace. Everything else goes on the roadmap.
>
> **What the section says today, and where it should go:**
>
> - **Atlassian, "the standard for large companies":** Team, Business and Enterprise plans (SSO, audit log, admin, SLA) go on the roadmap.
> - **Listed in the Claude and ChatGPT directories:** in progress for us (Claude submitted, ChatGPT after the video). Drop the line.
> - **Trello, "the default simple board":** we are that too. Drop it.
> - **Notion, "all-in-one workspace with agents that run on schedules and triggers":** a roadmap candidate, "Automations: rules and scheduled agent runs". To decide: on 9 Oct "no runner, no schedule" was agreed for "work my list".
> - **ChatGPT and Claude memory "needs no setup":** that's simply true. Our answer is one-click connect (roadmap: as little setup as possible).
>
> **Also change:** the positioning line "Listspace does not try to replace Jira for large engineering teams. It is for people and small teams..." no longer fits.
>
> Then a rewrite of the /compare intro, the rows marked "Coming" in Listspace's column, and the roadmap entries.

### Plan features: storage per plan, guests on a board (Pro), history per plan, "your data in the EU"

- Due 2026-10-10. Done

> Jordi on 10 Oct, after comparing with the Jira and Confluence plans: "love all 4".
>
> 1. **Storage per plan:** for example Free 1 GB, Pro 50 GB. A clear, fair difference between Free and Pro, and it keeps server costs in check (files are the only real cost). Show how much is used in Settings.
> 2. **Guests on a board (Pro):** invite a client or freelancer to one board without a full account or a paid seat. A strong reason to upgrade for freelancers and small teams. Decide: how many guests, what they may do (view, comment, edit), and whether their agents count.
> 3. **Activity history per plan:** for example 30 days on Free, unlimited on Pro. We already keep the history; this only limits what is shown.
> 4. **"Your data stays in the EU"** as a selling point on pricing, /compare and Trust. Atlassian charges extra for data residency; for us it is simply true.
>
> **Not:** limits on automations or agent work. Agents cost us nothing, and unlimited agent work is the strength. SSO, audit logs and an SLA come later with a Business plan.
>
> Then: the pricing page feature table and the investor overview (guests as a reason to upgrade).

### Files of archived items: show what they take up, and clean up without asking on every archive

> Jordi on 10 Oct: what happens to an item's files when you archive it? A setting, or a question when archiving?
>
> **Today:**
>
> - Archiving keeps the files, because archive can be undone.
> - Deleting an item permanently (from Archived items) also deletes its files from storage.
>
> **Proposal: no question on every archive.** Archive is meant to be quick and reversible. A question each time slows down every archive, and most items have no files.
>
> 1. **Storage bar** (with storage per plan): show "of which X MB in archived items", with a link "Review archived items".
> 2. **Archived items:** sort by size, and show a file count per item. "Delete permanently" says that the files go too.
> 3. **Optional:** a setting "Delete archived items after 90 days", off by default.
> 4. **A one-line note** in the archive toast when the item has files: "Archived. Its 3 files stay until you delete it."
>
> Jordi to decide: is this enough, or still a question when archiving an item with files?

### Admin: suspend an account, temporarily (with time to respond) or fully, always with a reason

> Jordi on 10 Oct: when an account has illegal content or misuses the platform, suspend it, temporarily or fully, always with a valid reason. A temporary suspension gives the owner time to respond or fix it. Could be automated.
>
> **Two levels:**
>
> - **Temporary (restricted):** the owner can still sign in, see the reason, and fix or delete the content. Public share links and agent writes stop while it lasts. The owner has a deadline (for example 7 days) to respond or fix it. If nothing changes, it becomes a full suspension. If it is fixed, the restriction is lifted.
> - **Full:** no sign-in, share links off, MCP/API tokens refused. The owner can still ask for an export of their own data and appeal by email.
>
> **Always:**
>
> - A reason from a fixed list (illegal content, spam/abuse, security risk, unpaid/fraud, other) plus a note.
> - The owner is emailed with the reason, the deadline and how to respond.
> - Every step is logged (who, when, why).
> - Pro billing is paused during a suspension.
>
> **Legal (EU Digital Services Act):** a hosting service must give a clear "statement of reasons" when it restricts content or an account, and offer a way to complain. Also add a "Report this board" link on public shared boards (notice-and-action). Update the Terms with the suspension rules.
>
> **Automate later:** start with a manual admin action. Automatic triggers could follow: reports on a public board, abuse signals such as a spike in share-link traffic, or a failed malware scan on an upload. Each would start a temporary suspension that a person reviews.
>
> Needs a migration (account status, the log, and the checks in the API and the share links).

### Export a document or item to Word, PDF or markdown, and send it by email

> Idea from Jordi, 7 Oct. Documents like a plan or a spec should leave Listspace easily.
>
> - **Export:** markdown first (simple and exact), then PDF (a clean print layout), then Word (.docx). For documents and for normal items.
> - **Send by email:** to your own address, or to someone else with a short note. To others only with a daily limit and the sender's name visible, so it can't be used to send spam.
> - **Agents:** an agent can ask for an export and gets a link back.

### Nicer links for public boards: listspace.app/<you>/<board>

> Idea from Jordi, 7 Oct. Public boards get a readable address with a username and a board name, for example listspace.app/jordi/build-in-public. The old link keeps working and redirects.
>
> - **Usernames:** accounts only have an email today. Ask for a username once, the first time someone makes a board public, prefilled from their first name ("jordi", or "jordi-2" if taken). Changeable later; the old address redirects. Reserved names (admin, help, docs, boards and every app path) can't be taken.
> - **Bonus:** the username also gives a public profile page (listspace.app/jordi) with that person's public boards, which helps people discover Listspace.
> - Only for public boards. Password-protected and private share links keep their long, unguessable code.

### Danger zone like GitHub's: red outline, one row per action, confirmation in a dialog

> Jordi on 10 Oct: GitHub's danger zone is clearer than ours.
>
> - A red-outlined box with thin lines between the rows.
> - Each row: a bold title and one line of explanation on the left, a red-text outlined button on the right.
> - Ours is a filled pink box with an inline DELETE field.
>
> In progress, in the "safety" PR: a reusable DangerZone component, with Delete account confirmed in a dialog. Also used for other destructive actions where it fits.

### "For you": one personal view across all boards

- Due 2026-10-10. Done

> Agreed 9 Oct. One place that shows what needs **you**, across all your boards. The work stays on its board; this is a view.
>
> **Can start before Team.** Even alone it's useful: items due or overdue, items you or your agent claimed, and suggestions waiting in your Inboxes. Requests from people and agents join once those exist.
>
> **In the app**
>
> - **Left panel:** "For you" right under Dashboard, with a count (only things that need action, not everything assigned).
> - **The page:** grouped by Overdue, Today, This week, Later, No date. Each row: the title, the board (its color or avatar), who it's from (a person, an agent such as "Claude Code", or "due date"), the kind (Do this, Look at this, Question, Approve, Inbox), and the due date.
> - **Act without leaving the page:** Done, Reply, Approve or Reject, Accept or Decline, and open the item in the usual item window.
> - **Second tab, "Waiting on others":** what you asked of others that isn't answered yet, with how long it's been.
> - **Dashboard:** the top 5 from For you.
> - **On the board:** an item for someone shows a small avatar and the due date ("For Sara, Fri").
>
> **In the assistant:** `my_items` (or `for_me`) returns the same list, so "what's on my plate?" and "handle my tasks for today" work from it.
>
> **In the daily or weekly email:** the For you part is the top of the email.
>
> Related: "Requests and tasks between people (and agents), through their assistants", "One daily email: summary and due items together", "Your agent works your list".

### Your agent works your list ("handle my tasks for today")

- Due 2026-10-10. Done

> Agreed 9 Oct. The person starts it, the agent does the rest: "handle my tasks for today" or "work through To do on the website board".
>
> - The agent takes the items from For you (or the named list) that it can do, claims each one, does the work, comments on what it did and moves it along.
> - It skips what needs a human (approvals, calls, decisions) and says so at the end.
> - When it needs feedback, it doesn't stop and wait in the chat: it sends a request to the person (or the Inbox) and moves on to the next item.
> - It ends with a short report: done, waiting for you, skipped and why.
>
> No setting, no runner, no schedule: Listspace stays a breeze. Agent access still applies.
>
> Builds on next_item, claim_item and For you. Related: "For you: one personal view across all boards", "Plan in ChatGPT, Claude picks up the todos on its own".

### Unsorted inbox per space, sorted by agents

- Due 2026-10-10. Done

> Approved by Jordi on 7 Oct. Groundwork for capturing from Slack, WhatsApp, Telegram and email:
>
> - **Unsorted:** each space gets an "Unsorted" inbox for captured messages that are not linked to a board.
> - **Sorting:** an agent reads the boards in that space (titles, descriptions, agent instructions) and proposes a board with a reason. The proposal goes into that board's Inbox, or moves straight in at Agent access level 4 or higher. When the agent is unsure, the message stays in Unsorted.
> - **Corrections become routing hints.** Moving a captured item to another board teaches the agent for next time, for example "messages from this person go to the CRM board".
> - **Agent tools:** list_unsorted, route_item, and routing hints in start_session.
>
> See the idea "Connect Slack, WhatsApp, Teams and email".

### Catch up: "what happened since I was last here?"

> Use cases (9 Oct):
>
> - **Remote team across time zones.** You start your morning and ask your assistant: what was done while I was asleep?
> - **Back from two weeks of holiday.** Where did I leave the project, what changed, what should I pick up first?
> - **The next morning.** A short summary of yesterday before you start.
>
> **Decided (9 Oct): build it.** The answer is a **short summary, not a long list of changes**: a few lines on what moved, then what needs you.
>
> **What works today:** get_history lists every change with who made it, newest first; start_session shows recently done items and items due soon. Fine for one night on a small board.
>
> **What's missing:** get_history has no "since" filter and pages 50 to 200 changes at a time. After two weeks on a busy board, an assistant pages through hundreds of changes and may miss things.
>
> **Build**
>
> 1. **A `since` filter** on get_history.
> 2. **A catch-up tool** (for example `catch_up(board_id, since)`) that returns the changes already grouped and condensed: done, new, decisions, waiting in the Inbox for me, assigned to or claimed by me, overdue, and per person and agent what they worked on. Counts plus the few items that matter, so the assistant writes a short briefing. Also across all boards: "catch me up on everything".
> 3. **"Last seen" per person per board**, so "since I was last here" works without a date.
> 4. **Summary emails, the same summary:** people choose daily or weekly (or off), and the time they get it. After a longer absence, a "welcome back" summary on the first visit.
>
> **Sales line (USP):** Basecamp asks people "what did you work on today?". In Listspace nobody has to answer, because the board already knows.
>
> Related: "Daily summary: let users pick the time they receive it", "Daily summary email never arrived", "Team boards: keep a busy board readable, board access, agent levels per member".

### Getting started emails and an in-app checklist

> Idea from Jordi, 7 Oct: keep new people engaged. Common practice is a short series tied to what the person has or hasn't done yet, not a fixed newsletter:
>
> - **Day 0:** a personal welcome from Jordi.
> - **No agent connected after a day:** "Connect your AI in two minutes", with a link to /setup. The same as a banner in the app until it's done.
> - **First agent change:** what just happened, and a tip about Agent access and the Inbox.
> - **Not back for 5 to 7 days:** one reminder showing what changed on your boards. One more after about 3 weeks, then stop.
> - **Weekly "what your agents did":** a short summary per board. Its own switch in settings.
> - **In the app:** a checklist (make a board, connect an agent, first item from an agent, try the Inbox) that disappears when done.
>
> **Admin can edit it (Jordi, 7 Oct):** a section in the admin panel to turn each email on or off, change its timing and conditions, and edit the subject and text with placeholders (first name, board name, setup link), with a preview and a test send to the admin's own address. Changes are versioned so an earlier text can be restored.
>
> Every email has a switch in settings and an unsubscribe link. These are emails about using your own account; anything that promotes other things needs the news opt-in.

### Code health check: what's left from the first version

> The first version of Listspace was built with Bolt in 2025. A lot has been rewritten since: the backend, sign-in, security, the editor, and now the UI foundation. A check for what's left, report first:
>
> - Unused code, files and packages
> - The 63 existing lint problems
> - Very large components (the item window is over 1,000 lines) that are hard to change safely
> - Old names in the code (tasks and cards instead of items)
> - Test coverage of the parts that matter most

### "I'm Founder #N of Listspace": share it on social

> Jordi on 9 Oct: being a founder is something people are proud of, and sharing it helps Listspace spread. **Ask founders to share, and say why it helps** (reach, attention, awareness).
>
> **The prompt** (on the welcome screen, in Settings > Plan and billing, and on the founder's own profile):
>
> > **Show you were here first.**
> > Listspace is made by one person, without ads or investors. Every share helps it reach the people it is built for, and tells your network what your AI works with.
> > [Share that you're Founder #7]
>
> Term: "Show you were here first" (alternatives: "Plant your flag", "Spread the word"). Honest about why sharing helps, and something a founder is proud to show. Calm, no pressure, shown once in the welcome; after that a quiet button.
>
> **Build:**
>
> - A **share image** per founder (1200 by 630): the Listspace logo, "Founder #N of 100", the name and photo if the profile is public, and listspace.app. It is the link preview on X, LinkedIn, Bluesky and WhatsApp.
> - **The link** goes to the founder's public profile (/@username): the badge, a short explanation of Listspace, and "Join the waitlist" or "Try Listspace".
> - **A ready-made text** the founder can edit, never posted automatically. For example: "I'm Founder #7 of Listspace. My AI keeps my project board up to date, so I never re-explain my project. Show you were here first: listspace.app/@jordi".
> - **Channels:** X, LinkedIn, Bluesky, copy link, and the phone's share sheet. Reuse the footer's existing share window (`ShareModal.tsx`) where it fits.
> - **Measure it:** count shares per channel (no third-party trackers), and visits and signups from founder profile links, to see what it brings.

### Next PR: template texts without singular "they", sort_list for agents, "Pro forever" from an invite

> Left over from 10 Oct:
>
> - **Gallery templates:** 8 places in the template texts use "they" for one person. Template texts are stored in the database, so this needs a seed migration. Jordi agreed on 10 Oct; it needs OK database at deploy.
> - **sort_list for agents:** an MCP tool and REST endpoint, following Agent access levels (the app's "Sort items by..." is live).
> - **"Pro forever" straight from an invite**, next to the Pro months.
>
> Copy rule for all new text: "you", then the role, then rephrase, and "the user" last. Never singular "they".

### Small gaps: command palette wording, Ctrl K in the editor, zip download with one file

> Found 7 Oct by the agent that fixed tonight's bugs:
>
> - The command palette says "New item on <board>" where "New item" would read better.
> - Ctrl K doesn't open search while you're typing in the editor.
> - "Download all as zip" only shows when an item has two or more files.

### Public pages: use the full content width

> Make all public pages use the full content width, so they are consistent with each other.

### Left panel: more space between the sections

> The left board panel works well, but its sections run into each other. Add some vertical space between each section:
>
> - the top actions (Dashboard, Create board) and the filter field
> - the filter field and Starred
> - Starred and Recently viewed
> - Recently viewed and All boards
>
> Keep the space within each section as it is, so the boards in a section still read as one group. About 12 to 16 px above each section heading should be enough; check it on a short screen so All boards doesn't get pushed out of view.

### Daily summary email shows the old icon

> The daily summary email still shows the old Listspace icon. The logo itself is correct.
>
> **Likely causes, in order of how often they happen:**
>
> 1. **The email points at an old image file.** Most email clients don't show SVG, so emails usually use a PNG. If the new brand only changed the SVG logo, the PNG the email template loads may still be the old one. Check which image URL the template uses and whether that file was ever replaced.
> 2. **The image is cached under the same address.** Gmail and other clients copy images through their own proxy and keep them for a while. If the new icon was uploaded under the same file name, they can keep showing the old one. Fix: give the new icon a new file name or add a version (for example `icon.png?v=2`), so every client fetches it fresh.
> 3. **It is the sender picture, not the email content.** If the old icon is the round picture next to the sender name in the inbox list, that doesn't come from the email at all. It comes from the sending address's profile (Google account or Gravatar) or from BIMI. Update it there.
>
> **Done when:** a new daily summary shows the current icon in Gmail, Outlook and Apple Mail.

### One daily email: summary and due items together (summary never arrived)

> Jordi has never received a daily summary email (9 Oct); only the "tasks due" email arrives.
>
> **Decided (9 Oct): one email, not two.** No email overload.
>
> - **One email, "Your day" (or "Your week")**: first what needs you (due today, overdue, waiting in your Inbox, requests for you), then a short summary of what moved on your boards. Same summary as the catch-up feature.
> - **Settings:** daily, weekly or off, and the time it arrives.
> - **Nothing to say, no email:** no due items and no changes means no email that day.
> - The separate "tasks due" email goes; its content moves into this one.
>
> **Why the summary never arrived, check in this order:**
>
> 1. Is it on by default? If new accounts start with it off, it never sends.
> 2. Does it skip quiet days, and do agent changes count as activity? Most changes on Jordi's boards are made by agents.
> 3. Is the scheduled job running and logging a send or skip per user?
> 4. Delivery: mail log and spam, as for the tasks due email.
>
> Related: "Catch up: what happened since I was last here?", "Daily summary: let users pick the time they receive it".

### Daily summary: let users pick the time they receive it

> Idea from Jordi, 8 Oct: as a user you should be able to set the time you receive your daily summary.
>
> - A time picker in the email settings, next to the on/off switch (for example "Send at 08:00").
> - In the user's own time zone, detected from the browser and changeable. Someone in Mexico and someone in Amsterdam both get it at their own 08:00.
> - Optional later: which days (weekdays only), and "only when something happened".
> - Default: early morning in the user's time zone, so it reads as "what your agents did while you were away".
>
> Note: "Legal checks for launch" (PR #148) mentions that the daily summary already has one-click unsubscribe, so this adds a setting to an existing email. Related idea: "What your agents did today" email.

### Works with: Claude in text only, no logo

- Labels: Priority

> Remove the Claude and Claude Code logos from the homepage "Works with" row and from /works-with. Keep "Works with Claude" in plain text, worded so it only describes the integration and never suggests sponsorship, endorsement or an affiliation.
>
> Background and the reply are on the Ops board ("Logo permission"). Same rule as Notion: text only.

### Agents ask which space a new board goes in

> Today `create_board` without a space puts the board in the first space; the agent does not ask. Better:
>
> - **Several spaces:** the skill and the tool description tell the agent to call list_spaces and ask the user which one, or use the default space once "Default space" exists. With one space, there is no question.
> - **The result** of create_board names the space it went into, so the agent can tell the user.
>
> Goes together with the "Default space" item.

### Board menu: one column, two only where one would not fit

> Jordi on 10 Oct: on a tablet the board menu ("…") is very long. It has 15 entries in 4 sections (Board, Look, Content, Archive). With 40px touch rows it is about 760px tall. The tablet PR makes it scroll, but that's a stopgap.
>
> **Proposal:**
>
> - One column by default. Two columns, sections side by side, only where one column would not fit the screen (such as an iPad). Board and Look on the left, Content and Archive on the right. The sections are already there, so the columns keep their meaning, and the menu becomes about half as tall.
> - Phones: one column, as a bottom sheet.
> - Trim: "Rename" and "Edit description" repeat what you can already do by clicking the title and description in the board header. Keep them for discovery, or drop them from the menu.
> - Archive board stays last and red.
>
> Build after the tablet PR is merged (same files).

### Boards reopen where you left them (scroll position remembered)

> Jordi on 10 Oct: "I like to have To Do, Pending and Done in one view, but when I leave the board it always starts at the beginning." Asked whether a "pin the board to a position" option would help others too.
>
> **Proposal: no setting, just remember it.** Each board reopens at the spot where you left it, on that device. You can still scroll freely. This is how most reading and email apps behave, so nobody has to find a toggle. Trello always starts at the left, so this is a small advantage.
>
> - Remember the horizontal scroll (and the scroll inside each list) per board, per device, in the browser.
> - A link to a specific item ignores it: the board scrolls to that item instead.
> - If the lists changed so the saved spot no longer exists, fall back to the start.
> - A small "Back to start" control appears when you're not at the beginning, so the start is one tap away.
> - Optional later: "Open this board at..." a chosen list, if people ask for a fixed spot instead of the last one.
>
> Small, no database change. Test with the tablet changes (sidebar collapsed at 820).

### v1 polish: menu order, Recently viewed "Show all", one star, favicon.ico, footer, search grouped by board

> 10 Oct, for v1 on Monday:
>
> 1. Menu order: Settings, Admin, Agents, Plan and billing.
> 2. "Recently viewed": a working "Show all (N)" button; one star per board in the Compact and List views.
> 3. favicon.ico (fixes the old terracotta icon in mail apps).
> 4. Footer in four columns with the new tagline.
> 5. Search: up to 50 results at once, grouped by board.
>
> In progress (agent), branch `v1-polish`.

### Boards overview: "Recently viewed (5)" shows 4, and two stars in the Compact view

- Labels: Bug

> Found by Jordi on 10 Oct, after PR #184:
>
> 1. **"Recently viewed (5)" shows only 4 boards** (one row on a wide screen), with no way to reach the 5th. Proposal: the count matches what is shown, or there is a "Show all (5)" link (the button exists in `BoardSection` but does nothing yet), or the section shows exactly as many as fit, at most one row, and the count reflects that. Decide: one row with a working "Show all", or a second row.
> 2. **Two stars per board in the Compact view** (and the list view) of "Boards in Work". A filled star bottom right inside the board row (the card's own favorite star) and the star in the actions column. One should go: keep the action star, and drop the card's own star (and the Public badge and open link it carries) in the compact/list layouts, or move them into the title line as in the list view.
>
> Check all three layouts (Grid, List, Compact) at 1280 and 768, light and dark.

### Bug: "Recently viewed" cuts off the bottom of each board

- Labels: Bug

> Found by Jordi on 10 Oct. On the boards overview, "Recently viewed" cuts off the last line of each board (date and time, star). Cause: a fixed maximum height of 230 pixels from the app's first version (`BoardSection.tsx`). The boards have since grown taller (cover image, titles over two lines, the last-viewed time). Fix: show exactly one row at its natural height.
>
> In progress (agent), branch `recently-viewed-row`. For Jordi to merge on the morning of 11 Oct.

### Footer: reorganize the columns and update the tagline

> Jordi on 10 Oct: reorganize the site footer, and put more text under the logo.
>
> **Now:** one long "Product" column (11 links) and "Contact". **Pricing is missing**, and so are Trust and the API docs. The tagline "A list for everything. A space that's yours." is from before Listspace became project memory for AI.
>
> **Proposal: four columns**
>
> - **Product:** Features, How it works, Pricing, Compare, Roadmap
> - **For your AI:** Connect Claude or ChatGPT, Works with, Docs (MCP, API, agents)
> - **Company:** About, Trust, Brand, Contact
> - **Help:** Help, FAQ, hello@listspace.app, Share Listspace
>
> **Text under the logo** (2 or 3 short lines):
>
> > Project memory for you and your AI. One board your assistants read at the start of a chat and keep up to date while you work.
> > Made in the Netherlands by Yellow House Digital. Your data stays in the EU.
>
> Check: the legal links (Terms, Privacy, Sub-processors, DPA) stay in the bottom row; on a phone the columns stack in two.

### Sort the items in a list (by due date, name, newest)

> Jordi on 10 Oct: should lists be sortable?
>
> **Proposal:** a "Sort items" action in the list menu, the way Trello does it. Options: due date (soonest first), name (A to Z), newest first, oldest first. It is a **one-time sort** that rearranges the items. It is not a view that keeps sorting. The list order stays manual and meaningful: agents use it to pick the next item (next_item takes the top one), and people decide what goes first.
>
> To decide: a one-time sort only, or also a "keep sorted by due date" option per list (handy for a to-do list, but then dragging no longer works). Undo after sorting (the undo stack already exists). Agents could get the same action as a tool.

### Files: show who uploaded a file (you, or the agent by name)

> Jordi on 10 Oct, for tomorrow. The Files list on an item now shows the date, time and type (PR #183), but not who uploaded the file. Attachments don't record it yet: `user_id` is always the account owner, and agent uploads aren't marked.
>
> **Build:** an `agent_name` column on `attachments`, filled by the database the same way as for comments, so files can show "via Claude Code". The line reads like "39 KB · Word · Oct 9, 6:25 PM · via Claude Code". Needs a migration (OK database at deploy).
>
> **Decided:** only new files get an uploader; existing files stay without one.

### Account menu off screen, Back closes the item with a PDF open, /compare in the footer

- Labels: Bug

> Jordi on 10 Oct:
>
> 1. **The account menu** opens partly above the window since it has more rows: the name, email and first links are out of view. Fix: always open below the avatar, and scroll inside when the window is too low.
> 2. **The Back button with a PDF open** closes the whole item. Expected: Back closes only the preview; Back again closes the item.
> 3. **/compare in the site footer** ("Compare", under Product, after "Works with"). Today it is only linked from the home page FAQ and the pricing page.
>
> In progress (agent), branch `menu-preview-back-footer`.

### Pricing page: monthly/yearly switch, feature table, billing FAQ, "Recommended"

> Jordi on 9 Oct, after looking at the Jira and Confluence pricing pages. Worth copying:
>
> 1. **A monthly/yearly switch with "save 12%"**: yearly (€83.88) is €6.99 a month instead of €7.99.
> 2. **A "Compare features" table** under the plans, grouped by topic (agents and Agent access, boards and items, files, sharing, support). Free and Pro at a glance.
> 3. **A billing FAQ**: how you're billed (Stripe as seller, VAT included), the 14-day refund for everyone, switching monthly and yearly, pausing, what happens to your data on Free, founders.
> 4. **A "Recommended" label on Pro.**
>
> Not now: price per user and team size. That comes with Team plans.

### Comparison page /compare: Listspace, Trello, Jira with Rovo, Notion, built-in AI memory

> Jordi on 9 Oct: put the competition table on the website. Approach:
>
> - **Check every cell first** against current sources. Comparative advertising in the EU must be objective and verifiable.
> - Reword the cost row for visitors ("What it costs you").
> - Add **Notion** as a column.
> - A "Last checked" date and linked sources.
> - Keep the honest paragraph about where the others are stronger.
> - Its own page `/compare`, linked from the home page and pricing. Names in text only, no logos.
>
> In progress (agent), branch `compare-page`.

### Founder rules and switching to monthly: decided 9 Oct (refund bug fixed too)

- Labels: Bug, Priority

> Found in the Stripe Sandbox test on 9 Oct (step 6a). A full refund of only the €37.95 plan switch freed Founder #1, while the subscription kept running at the founder price. The next buyer would then also have become "#1".
>
> **Decided by Jordi (9 Oct):**
>
> **Founders**
>
> - The first 100 paying customers get #1 to #100. Then the offer **closes for good**.
> - **Withdrawal within 14 days** (full refund of the **first** payment): Pro stops at once, and the spot goes to the next buyer, who gets the same number.
> - **Any other refund** (a switch, a renewal) does nothing to the founder spot.
> - **Leaving after 14 days** (pause, cancel): back within **1 month** (was 6) keeps the number and the price. After that the founder status ends: the badge goes, the number is retired and never given to anyone else, and the spot does not reopen.
>
> **Monthly / yearly**
>
> - Monthly to yearly: immediate; you pay the difference.
> - Yearly to monthly: **at the end of the paid year**, no credit, no refund. "Keep yearly" undoes it. Built with a Stripe subscription schedule (tested in the Sandbox: Managed Payments allows it).
>
> **Also in the same PR:** the admin payment count ignores €0 invoices, and the avatar in the top bar sits level with the buttons.
>
> In progress (agent), branch `founder-rules-and-downgrade`.

### User menu: direct links to Plan and billing, Agents and Help; "Founder #N" on the badge

> Jordi on 9 Oct: everything now sits under Settings in the user menu. That structure is fine (like Linear and Notion), but what people look for often goes straight into the user menu:
>
> - **Plan and billing**, with the plan and the Founder badge. For Free users, "Upgrade" goes here once payments are live.
> - **Agents**: which agents have access, at what level.
> - **Help**, and **Sign out** at the bottom.
>
> Security, export, calendar and the danger zone stay under Settings.
>
> **Also (Jordi, 9 Oct):** the badge under the name in the user menu says "Founder", with the number only in the tooltip. Show **"Founder #1"** on the badge itself, as on the welcome screen and in Settings. The tooltip keeps "Founder #1 of 100".

### Switch between monthly and yearly inside Listspace

> Jordi on 9 Oct: Stripe's own plan screen shows €83.88 without the founder discount, which scares founders. Now the switch happens in Settings > Plan and billing, with the real price and what is charged today, straight from Stripe ("Switch and pay €37.96"). A declined card changes nothing, a double click charges once, and the founder discount and number stay. Plan switching is then turned off in the Stripe portal.
>
> Also in this PR: the welcome email's reply address is hello@listspace.app, and the admin's pause text is right for the admin.
>
> PR #178 open (follows #177). Deploy: functions and app, no migration. The restricted key needs Invoices: Read.

### A real welcome for new Pro customers and founders

> Jordi on 9 Oct, after the first test payment: "being a founder is a big thing". The current thank-you ("Pro is on. Stripe emails your receipt") reads like a receipt.
>
> 1. **Welcome screen** after returning from Stripe, once, instead of the green bar. A personal note from Jordi with his photo. Founders: "Welcome, Founder #N", 50% off for as long as they keep Pro, the badge on their profile, and an invitation to share feedback. Other Pro customers: a warm thank-you without the founder part. Buttons: back to my boards, see my profile.
> 2. **Welcome email from Jordi** for every new Pro customer, with a founder version. From hello@listspace.app, replies go to Jordi. Separate from Stripe's receipt.
> 3. **The founder number on the public profile:** "Founder #N of 100" on hover.
> 4. **Admin:** Plan and billing also shows the admin's own Pro plan (monthly or yearly, next renewal), handy for testing.
>
> Calm, personal, no confetti or game language.
>
> In progress (agent), branch `pro-welcome`.

### Bug: test checkout fails ("Could not start the checkout")

- Labels: Bug

> Found by Jordi on 9 Oct, at the first test payment in the Stripe Sandbox. Stripe refuses a line of text we put above the pay button: "You cannot use custom_text with Managed Payments." Stripe's own list of refused settings doesn't mention it, so our tests didn't catch it.
>
> Fix in PR #176: the line goes (the renewal terms are already next to the subscribe button in Listspace). The test Stripe now refuses it too, and the log shows Stripe's own explanation from now on. Deploy: functions only.

### Bug: parallel tool calls can fail with "Internal error" right after a restart

- Labels: Bug, Priority

> Found on 9 Oct: two Listspace tool calls sent at the same moment both failed with "Internal error", and the same calls one at a time worked. The server log says "JWKS unavailable".
>
> Cause: to check a sign-in token, the MCP server fetches the sign-in service's public keys once and keeps them. While that first fetch is running, a second call doesn't wait for it: it sees that a fetch was just attempted, skips its own, finds no keys yet and fails. It only happens when the key cache is empty (after a restart or deploy), but Claude and ChatGPT often call several tools at once, the directory reviewers included.
>
> Fix: calls that arrive during a fetch wait for that same fetch. Plus a test with two calls at once.
>
> In progress (agent), branch `jwks-shared-fetch`.

### Inbox: the three suggestion buttons on one line

> Jordi on 8 Oct: the Accept, Pick another list and Reject buttons under an Inbox suggestion take two lines and look messy. New layout: Accept and Reject as icon buttons (check and cross) side by side on the left, "Pick another list" on the right, all on one line. The icon buttons keep a clear name for screen readers and a tooltip.
>
> In progress (agent), branch `inbox-buttons-one-line`.

### One tool per operation, and annotation fixes (ChatGPT review)

> OpenAI's scan flagged three tools that do several operations through one `op` field (labels, checklists, list groups). They become separate tools, each with its own annotations; bulk changes are split too, before they get flagged. Also: create_item's "open world" annotation is checked against what it really does, and withdrawing a suggestion is marked as hard to undo. The skill, plugin and docs are updated in the same PR.
>
> In progress (agent), branch `split-multi-op-tools`.

### Tool descriptions only describe, no instructions (Claude directory policy)

> The Claude directory asks us to confirm: "Tool descriptions contain no instructions about model behavior, other tools, or external instruction sources." Ours didn't meet that. Some said "Call this first", "follow it" (the user's guidance) and "Keep the board up to date without being asked", and 24 of them named another tool.
>
> Fix: every description says only what the tool does and returns. The guidance for agents moves to the server's own instructions (sent once when a client connects); the skill already covered it. A test keeps instructions out of the descriptions. In the same PR, resources/list and prompts/list return empty lists instead of an error.
>
> Blocks the Claude directory submission (draft saved). **PR #171 open**, branch `tool-descriptions-policy`. Deploy: functions, then app (docs pages).

### Sign-in pages: Yellow House Digital header back, fresh styles after a deploy

> Decision (Jordi, 8 Oct): the sign-in service is shared by several apps and runs on a Yellow House Digital address, so every sign-in page keeps the YHD header and logo, with Listspace named in the card. Also fixes browsers keeping an old stylesheet after a deploy, which made the Continue button look unstyled.
>
> PR open, branch `yhd-header-back` in the sign-in service repo.

### Payments follow-up: founder rules, pause, username once, analytics without test accounts (PR #170)

> Ready to merge (8 Oct). A founder spot is claimed at the first real payment and freed by a full refund within 14 days; "X of 100 founder spots left" once payments are live; "Pause Pro" through Stripe's API, keeping Pro until the period ends, with the founder price held 6 months; username chosen once (support can change it); founder badge on its own row and on the public profile; admin and test accounts out of all analytics. Needs 3 migrations.

### MCP server: answer resources/list and prompts/list with an empty list

> Found 8 Oct when Smithery scanned the server: it found all 53 tools, but warned "Method not found" for resources/list and prompts/list. Allowed by the protocol, but an empty list is friendlier for directories and clients that always ask. Small change in the MCP server, plus a test.

### New About page: the story behind Listspace

> In progress (agent, 8 Oct). A longer, more personal About page in Jordi's own voice: getting fed up with re-explaining his project to AI after every new session, why he built Listspace, how it works for you, building in public, and who's behind it. Facts only from his Yellow House Digital About page. The photo and text use the full page width.

### Bug: the age question opens under the item window (PR #168)

- Labels: Bug

> Found by Jordi on 8 Oct: with the "Confirm your age" question open, clicking an item opened the item window on top of it. The question must block the app until it's answered: on top of everything, and nothing behind it clickable (items, shortcuts, links to an item). In progress (agent).

### Test accounts out of analytics, clearer invites, Jordi's photo, hide Email to board (PR #166)

> In progress (agent, 7 Oct), one PR:
>
> - **Test accounts:** the admin can mark accounts as test accounts, and they don't count in the analytics. Already marked: the test account and both reviewer accounts.
> - **Invites:** "Uses" becomes clear ("1 of 1"), and the form clears after you create a link.
> - **Email to this board:** hidden until incoming email works (after the DNS move).
> - **Jordi's photo** on /about and in a small "Who you're dealing with" block on the Trust page.

### Spaces and boards: default space, agents ask for the space, reorder starred boards, usernames and readable links (PR #165)

> In progress (agent, 7 Oct), one PR:
>
> - **Default space:** new boards without a chosen space go there.
> - **Agents ask which space** a new board goes in, or say where they put it.
> - **Starred boards:** reorder them by dragging.
> - **Usernames and readable links:** public boards at [listspace.app/<you>/<board>](https://listspace.app/<you>/<board>), a simple profile page with your public boards, and old links redirect. Private and password-protected links keep their secret code.

### Agents and files: listspace attach, help article, directory listings ready to submit (PR #163)

> In progress (agent, 7 Oct), one PR:
>
> - **Files from your computer:** `listspace attach <item> <file>` in the CLI, and a help article "Add files from your computer with your agent". The agent guide and skill point agents to the CLI for local files.
> - **Directories:** everything ready to submit for the official MCP Registry, Smithery, PulseMCP, Glama, mcp.so, the Claude connector directory and the ChatGPT app directory: descriptions, example prompts, test cases, and a check of every tool's annotations. Jordi submits.

### Homepage video: placeholder until the new video exists

- Labels: Bug

> Jordi removed the YouTube video, so its preview image gives a 404. Replace the video block with a calm "Tour video coming soon" placeholder, with no outside requests, and one setting to put a video back later. In progress (agent, 7 Oct), together with the other Tonight items in one PR.

### Trust page: "How we keep your data safe" (PR #161)

> In progress (agent, 7 Oct). What Listspace does to keep you and your data safe, only claims that are true today: EU hosting, encryption, two-step sign-in, Agent access and the Inbox, no AI training, file previews in a sealed frame, the security policy, backups, how to report a problem. It ends honestly: no one can guarantee complete security, here's what we do and what you can do yourself.

### Attachments: full file name on hover, and a file-type badge (PR #162)

> In progress (agent, 7 Oct). Jordi had two similar images (.png and .webp) that couldn't be told apart in the Attachments tab. Each tile gets a tooltip with the full file name and size, a small badge with the file type (PNG, WEBP, PDF...), and long names are shortened in the middle so the extension stays visible.

### File previews: security hardening (PR #157)

> Live since 7 Oct (#157).
>
> - **Sealed frame:** Word and markdown previews run in a frame that can't reach the app, your session or your data. Only one small script of our own runs in it, unlocked by a one-time code per preview; anything hidden in a document is blocked, even if it gets past the filter (tested by injecting scripts on purpose).
> - **Warning before leaving:** a link in a file opens "Leaving Listspace" on the board, showing the site and the full address, with Cancel or "Open in new tab". Ctrl-click or middle-click goes to the /out warning page instead.
> - **No remote content:** images from other servers aren't loaded ("External image not loaded"), so no tracking pixels.
> - **Zip bombs:** Word and Excel files that unpack to more than 100 MB are refused; reading happens in the background and stops after 20 seconds.
> - **PDF:** drawn as images only; scripts and links inside a PDF do nothing.
> - **Formulas and macros** never run; cells starting with = are shown as text.
> - **Updates:** monthly grouped updates, with security fixes right away. The Excel reader (SheetJS) gets a monthly manual check.

### Web addresses in descriptions become clickable links (PR #155)

> Live since 7 Oct (#155). A web address or email address in an item's text becomes a link: while typing, when pasting, in existing text (without changing what's stored), in text agents write, on shared boards and in markdown file previews. File names, version numbers and code stay as they are. Links open in a new tab.

### Admin: analytics, default board background, invite from the waitlist, space switch (PR #156)

> Live since 7 Oct (#156).
>
> - **Analytics** (first in the admin menu, 7/30/90 days, charts with a table view): accounts and plans, activation from sign-up to an agent's first item, daily and weekly activity, retention per sign-up week, waitlist and invites, feedback, and billing (Pro from invites, founders 0 of 100; MRR and paying customers shown as "Not live yet"). The admin's own account is left out of the numbers.
> - **Default board background:** every new board without a color or background gets the light Listspace background, however it's made. Change it under Admin > Settings.
> - **Waitlist:** an Invite button per person and "Invite selected".
> - **Switching space** from any page except the boards overview opens that space's boards.

### View PDF, Word, Excel, CSV and markdown files in the app (PR #152)

> Live since 7 Oct (#152). PDF, Word, Excel, CSV, markdown and text files open in the same viewer as images, rendered in your own browser; nothing goes to an outside viewer. Download and "Open in new tab" stay available; files over 20 MB are download only. Checked live: the file storage allows the app to read files.
>
> Follow-up for security (in progress): no remote images from documents, a guard against zip bombs, stricter PDF settings, automatic dependency updates.

### Fixes: error screen after an update, item opens at the bottom, "Make cover" (PR #151)

> Live since 7 Oct (#151).
>
> - **Error screen after an update:** a tab running the previous version now reloads once into the new version instead of showing "Something went wrong". Each release also keeps the previous version's files, so open tabs keep working.
> - **Item window** always opens at the top, with the title selected.
> - **"Use as cover"** replaces "Make cover", with a tooltip saying it shows the image on the item in the list.

### Admin pages with 50 per page, feedback every 30 days (PR #150)

> Live since 7 Oct (#150). Waitlist, Invites, Feedback and Accounts show 50 rows per page, with search and filters done on the server. CSV export still exports everything that matches. Agents ask for feedback at most every 30 days instead of 60.

### New subline and "Your agent does the work", CI layout check fixed (PR #149)

> Live since 7 Oct (#149).
>
> - **Homepage:** "Let your AI do the boring project work. You focus on making it a success." under the headline, and "Your agent does the work. You keep the controls." as the heading of the Agent access section.
> - **CI:** the build hung because installing the test browser stalled on an Ubuntu mirror. CI now uses the browser already on the runner, every page has a time limit, and the job stops after 20 minutes.

### Files from your computer to Listspace through your agent: make it easy

> Found 7 Oct. An agent can attach a file it already has as text, or a file at a public web address. A file on your own computer (an image, a Word file) is the hard case: the connector would need the whole file written out as text, which is slow and unreliable for large files.
>
> What works today: create a token (Settings > API), run `npx listspace login` once, then the agent can upload files from disk through the API.
>
> To do:
>
> - A CLI command: `listspace attach <item> <file>`, so agents don't need a script.
> - A help article "Add files from your computer with your agent", with the steps above, linked from /setup and the agent guide.
> - The skill and the agent guide tell agents to use the CLI for local files instead of attach_file.

### Age check: also enforce 16+ on the server

- Labels: Bug

> Found in the legal check (7 Oct). The sign-up form requires "I am 16 or older", but only in the browser. Someone who calls the sign-up endpoint directly (with a valid invite) gets an account without that confirmation, and the terms prompt afterwards asks only for the terms. Fix: the terms prompt also asks for the age when it's missing, or the server refuses a sign-up without it. Agent sign-up through the claim page is already checked on the server.

### Reorder starred boards by dragging

> Idea from Jordi, 7 Oct. On the boards overview, drag starred boards into your own order. Small to build: a position per starred board, saved per account. Only the starred section; the rest stays sorted by recent use.

### Space switch from a board, full board titles on cards, Share, item breadcrumb (PR #146)

> Live since 7 Oct (#146).
>
> - Switching space while on a board (or from the command palette) opens that space's boards.
> - Board cards: star, Public and website sit in the bottom row next to the date, so the full title shows (two lines, then the rest on hover). Same in the compact view.
> - The board bar button always says "Share", with a clear highlight while a public link is active.
> - The item window shows Space › Board › List; clicking saves first, then goes there.

### Sign-in pages in the waitlist layout, invite-only explained, new 404 title (PR #145)

> Live since 7 Oct (#145).
>
> - Sign in, sign up and password pages follow the layout of the waitlist page, with a visible label on every field.
> - One sentence about invite-only on the homepage, pricing, FAQ, waitlist and sign-up: invite-only while in beta, then open to everyone; join the waitlist, we invite people from it regularly.
> - 404: "This page cannot be found. It may have moved, or it never existed." A wink to This Page Amsterdam.
> - Gemini out of the homepage line until it's tested.
> - Brand page: the yellow for the main button in dark mode, a reference to Yellow House Digital.

### Admin panel and feedback from agents (PR #147)

> Live since 7 Oct (#147). Follow-up in #150: 50 per page, and feedback every 30 days.
>
> - **Admin:** "Admin" in the account menu for the admin only, checked in the database. API tokens and agent connections never count as admin, and with two-step sign-in on, the code is required. Admin always has full access.
> - **Admin panel:** a left menu with Waitlist, Invites, Feedback and Accounts.
> - **Feedback from agents:** after a week of use, an agent asks at the end of a task what you like most and what you miss. You can say no, and turn it off in Settings > Agents. Quoting your answer on the site is a separate yes. The same questions sit under Help > Give feedback.

### Deleting from the item window deletes twice

- Labels: Bug

> Found on 7 Oct while fixing archiving. Delete in the item window sends the delete request twice: once from the item window and again when the board handles the deleted item. The second call should be harmless, but it can show an error or count twice in the history. Make one place responsible for the delete.

### App fixes: templates page, iPad spacing, smart Back, Search label, archive (PR #142)

> Live since 7 Oct (#142).
>
> - **Archive an item:** a labeled "Archive" button in the item window, the shortcut Alt+Shift+A, and an Undo toast. Before, the only way was the bulk bar.
> - **Templates page:** the list flows with the page; the preview stays in view.
> - **iPad:** the board page now uses a height that leaves room for Safari's toolbar. To check on a real iPad.
> - **Back link:** "Back to <board name>" when you came from a board, back to search results from a search, otherwise "Back to boards".
> - **Header:** the word "Search", with the Ctrl K hint on wide screens.
> - **Report a problem:** in the Help menu, the command palette and the public footer only.
> - **Board title bar:** a globe only on the Public pill; the website link has an external-link icon, Share a share icon.

### One full copy check of the site and the app

> When the site and the app are done: read every page, screen, email and agent text once more. Is everything current, complete and in the same voice (US English, sentence case, the new headline)? Old taglines, old names (ListSpace), and features described that changed.

### Invite-only beta with a waitlist (launch Monday 12 Oct, PR #144)

- Labels: Priority

> Live since 7 Oct (#144). Invite-only is on until paid plans exist.
>
> - **Invites:** a code or link opens sign-up and gives Pro for a set number of months. Enforced in the database, so agents can't create accounts without an invite either.
> - **Waitlist:** /waitlist asks for an email, "What would you use it for?" and "How did you hear about Listspace?". A confirmation email has a link to remove yourself. Entries are deleted after 12 months.
> - **Admin:** /admin, for Jordi only. The waitlist, invites in waves, invite links, invite status and a CSV export.
> - **Feedback after a week:** see "Feedback from agents" (in progress).

### Works-with page: keep "Verified", drop "Supported"

> On the works-with page, showing "Verified" is good. "Supported" is overkill: an app would not be on the page if it were not supported. Remove the "Supported" label and keep "Verified" only for the apps that have been verified.

### Templates: the last boxes, and the upkeep line in the summary

> Leftovers from the calm templates list (#135):
>
> - The "Your templates" tab and the selected template in the picker are still boxed. Make them match the calm list.
> - The short "What your agent does" line takes the first ~200 characters, so the upkeep sentence (which comes last) usually doesn't show. Decide whether it should.

### UI fixes 2: copy in US English, and empty, loading and error states (PR #143)

> In progress (agent, 7 Oct). From the UI audit and Jordi's feedback:
>
> - **Homepage headline:** "Stop re-explaining your project to AI." with "Works with ChatGPT, Claude and Gemini, and with coding agents like Claude Code and Cursor."
> - **Old tagline gone everywhere,** including the "embed on your website" snippet.
> - **US spelling and sentence case** for titles and buttons, plus a check that stops UK spellings coming back.
> - **One word per thing:** Sign out, Delete permanently, items not tasks.
> - **One look and wording** for empty, loading and error states, and one date and time format.
> - **Dark mode:** the main button uses the yellow accent so it stands out from the others.

### UI fixes 1: one set of colors, buttons, form fields and dialogs (PR #140)

- Labels: Priority

> Live since 7 Oct (#140). Follow-up #141 brings the pages from #139 onto the same pieces.
>
> - **Colors:** danger, success, warning and info in light and dark mode, with a test that checks the contrast. No hard-coded palette colors left.
> - **Buttons:** one button with three fixed heights everywhere. Cancel is a real button, and one shared confirm puts Cancel left and Delete right.
> - **Dialogs:** keyboard focus stays inside and returns to where you were; Escape closes only the top dialog.
> - **Forms:** fields show their own errors, switches work with screen readers, and selects and checkboxes share one look.
> - **Fix:** the stray "12" after contact form errors is gone.

### UI fixes 3: one page width for every public page, a phone menu, a proper 404 (PR #139)

> Live since 7 Oct.
>
> - **One page width:** every public page lines up with the header and footer (checked live: the title starts at the logo's edge on /about, /works-with, /roadmap, /setup and /templates). Text is left-aligned; only the home hero and the closing call to action are centered.
> - **Phones:** a menu button with every link, Sign in and Sign up. It takes over below 1024px, where the desktop header was wrapping.
> - **404:** in the site's own header and footer, "Page not found", also on phones. The server still answers with a real 404.
> - **Sign-in pages:** the site header and footer, and the line "One board your AI keeps up to date."
> - **/setup:** frames for missing screenshots are hidden.
> - **App pages:** settings, templates and labels use the dashboard's full width.
> - **Board group labels:** readable on a dark chip.
> - **Test:** a layout check runs in CI on every PR (title on the logo's edge, no sideways scroll, at desktop and phone width, light and dark).

### Markdown: a horizontal rule (---) shows as text

- Labels: Bug

> Found while dogfooding, writing a document through the agent tools: `---` on its own line is saved as a paragraph with the text "---" instead of a horizontal rule. The new editor (TipTap) supports horizontal rules, so the markdown converter (agent side and app) should map `---` to `<hr>` and back. Add a test to the markdown round-trip suite.

### Works with: big names in text above the logos; instructions for agents on the site

> In progress (agent, branch works-with-agents):
>
> - **Homepage:** "Works with Claude, ChatGPT, Gemini and Grok" in text, the logo row under it, then "and N more".
> - **Labels:** stronger wording than "Tested by us".
> - **For agents:** a section in llms.txt, a short /agents.md, and an MCP server card at /.well-known/mcp.json, so an agent that lands on the site knows how to connect and how to behave.

### UI audit: site and app (report first)

> Report done (7 Oct). 78 findings across buttons, type, spacing, forms, states, icons, colors and dark mode, copy, public pages vs the app, and accessibility. Fixes follow as three PRs, which are on the to-do list:
>
> 1. Tokens, buttons and forms (first)
> 2. Copy in US English, and empty, loading and error states
> 3. One page width for every public page, a mobile menu, and the 404 page

### Templates as a calm list instead of boxes (PR #135)

> Live since 7 Oct.
>
> - **Public /templates:** one calm list per category, like the roadmap: name, one line, and what your agent does. The instructions shown are exactly what a new board gets: the template's own text plus the upkeep rule.
> - **In the app:** the gallery is a list on the left, with a preview of the selected template's lists on the right.

### Board bar polish and List type (PR #138)

> Live since 7 Oct.
>
> - **Description:** under the title, two lines. "more" opens it in place and pushes the board down, "less" folds it back. The separate panel is gone.
> - **Tooltips:** they stay on screen and no longer cause scrollbars. Near the bottom of the screen they appear above the button.
> - **Divider:** darker lines under the app header and the board bar, in light and dark mode.
> - **List type:** "List type" in the list menu (Info, Ideas and bugs, Backlog, To do, Doing, Done, None). Agents can set it with update_list; below level 4 the change goes to the Inbox.
> - **Menus:** every menu opens on click, and the avatar menu no longer closes by itself.

### Every agent knows from the start: keep the board up to date

> In progress (agent, branch board-upkeep-rule). A brand-new account, with no skill installed and no instructions written, should still get agents that keep the board up to date. The rule goes into every place an agent reads:
>
> 1. **MCP server instructions:** sent to every app when it connects. An explicit upkeep rule: capture ideas, bugs and decisions as they come up, move work to doing and done, never wait to be asked.
> 2. **start_session and get_account results:** a short "keep this board up to date" line when the user has written no guidance of their own.
> 3. **Default guidance for new accounts:** prefilled, visible and editable in Settings.
> 4. **Board templates:** each template's agent instructions repeat it for that kind of board.
> 5. **The skill and the plugin:** already have it, aligned to the same wording.

### Archived boards page uses the full height

> PR #129, live on 7 Oct. The list sat in a 384 px box with its own scrollbar; it now grows with the page. The templates page gets the same fix in the template gallery PR.

### Works with: official logos, and your other tools through your assistant

> In progress (agents, branch works-with-logos):
>
> - **Logos:** official vendor logos instead of names on /works-with and the homepage strip, following each brand's guidelines. Names stay underneath, with a trademark line below.
> - **New section:** "Works with your other tools, through your assistant", covering Canva, Figma, Notion, Google Workspace, Microsoft 365, Miro, Adobe and ElevenLabs. Only confirmed connectors are listed, each with a source.

### Compact board bar and a Help menu

> In progress (agent, branch compact-board-bar):
>
> - **Board bar:** one compact row under the header, in the same style.
>   - Left: small avatar, title, star, Public, and the description on one line.
>   - Right: views as one switch, Filter, Agents (with an Inbox count), Share, and one ⋯ board menu.
> - **Help menu:** "More" becomes a Help menu with a question-mark icon.
> - **Workspace tools:** templates, labels, Trello import and archived boards move to the avatar menu.

### UI consistency: modals, flag for Important, list colour, footer order

> In progress (agent, branch ui-consistency):
>
> - **Modals:** every window sits at the same distance from the top, in two widths only: normal (512 px) and wide (896 px).
> - **Help:** the help panel becomes a wide modal; no side panels anywhere.
> - **Order:** title, favourite star, then the Public pill, everywhere.
> - **Important uses a flag,** so it no longer clashes with the favourite star.
> - **List colour:** the dot only shows when a colour is chosen, and "No colour" removes it again.
> - **Footer order:** Help, Docs | Report a problem, Contact | Share | legal.

### Template gallery: CRM, sales funnel and more

> Boards as a CRM or a sales funnel work well, especially with custom fields (amount, company, contact, next step, probability). Custom fields are on the list in "Pro features inspired by Trello's paid plans".
>
> **Templates to offer (each with agent instructions):**
>
> - **CRM:** Leads, Contacted, Meeting, Proposal, Won, Lost. Fields: company, contact, value, next step date (shows up in the calendar feed). An agent logs calls and emails as comments and moves deals.
> - **Sales funnel:** the same with stage probabilities, and a weekly "what moved" summary.
> - **Hiring pipeline:** Applied, Screen, Interview, Offer, Hired.
> - **Content calendar:** Ideas, Drafting, Review, Scheduled, Published.
> - **Client project (agency/freelancer):** Brief, To do, In review with the client, Done, with a public or guest link for the client.
> - **Legal matter, bookkeeping client, event plan, course, release or shoot:** see "Listspace for every kind of professional".
> - **Personal:** reading list, travel, groceries, gifts ("Lists for ChatGPT and Claude in daily life").
> - **Product:** roadmap, bug triage, feedback inbox (our own Feedback board as the example).
> - **Meetings:** agenda and decisions per meeting, with decisions as documents.
>
> **What it needs:**
>
> - a template gallery page in the app and on the site (each template also a landing page)
> - create_board from any template for agents
> - later, custom fields per template
>
> Order: CRM, content calendar, client project and hiring first.

### "Works with" page: Listspace in the apps and agents you already use

> PR #127.
>
> - **/works-with:** 22 apps in four groups: chat apps, coding agents, app builders and automation. Each app is marked "Tested by us" (5) or "Works over MCP" (17), with a vendor source for every claim.
> - **Homepage:** links to it with "and 17 more apps".
> - **Footer:** a link in the Product column.
> - **/docs/mcp:** a "More apps" section with short steps and a token fallback.
> - **Help:** an article built from the same data, so the names cannot drift.

### "Buy me a Taco" removed from the site and the app

> PR #126. The footer link and its "Why?" dialog are gone everywhere. The homepage footer is now three columns.

### Header: less crowded, same functions

> Today the header has the logo, space, search field, Important, Tools, Create, Help and the name with its avatar. Proposal:
>
> - **Search becomes an icon plus Ctrl/Cmd+K.** It opens a command palette: search boards, lists and items, plus quick actions (new board, go to a space, open Important, settings, help). The palette is faster than the field and is where power users go anyway.
> - **Space sits right next to the logo,** as a compact switcher (Notion and Slack style).
> - **Important moves into the palette and the sidebar.** In the header it becomes at most a star icon.
> - **Tools and Help merge into one menu,** or Help moves into the avatar menu.
> - **Avatar only, without the name.** The name shows in the avatar menu.
> - **Create stays** as the one primary button.
>
> Result: logo, space | search icon, Create, avatar (plus an optional star and help icon). Everything is still reachable, with fewer words in the bar.

### Default space

> Today the last space you opened is remembered per device (in the browser). On a new device, or after clearing the browser, the first space opens.
>
> Add "Set as default space" in Manage spaces (stored with the account). The default opens after sign-in and on new devices. During a session the app keeps following the space you switch to. One default per account; if you delete it, the first space takes over.

### See at a glance which boards are public; a shorter footer in the app

> PR #125.
>
> - **Public pill:** a "Public" pill with a globe appears on boards with an active public link, in every overview view, in Starred, Recently viewed and the sidebar, and next to the board title. Clicking it opens the share settings.
> - **Share button:** it reads "Shared" while the link is on.
> - **Live updates:** other tabs and devices update straight away.
> - **Footer:** inside the app it leaves out About, Roadmap and Brand. Public pages keep the full footer.

### Small gaps found while writing the help articles

> - Some texts say "Board settings > Agents", but the menu is called "Agent access". Make them match.
> - The item window has Delete but no Archive. A single item can only be archived through its checkbox and the bulk bar. Add Archive next to Delete.
> - A list's type (info, ideas and bugs, to do, doing, done) can only be set by agents or a template, not in the app. Add it to the list menu.
> - Once "Report a problem" is merged, link it from the help panel.

### Bug reports: a report button in the app, and error tracking?

> Two complementary things:
>
> - **"Report a problem" in the app:** the help panel or the user menu gets a short form (what happened, an optional screenshot, the page and browser added automatically). It lands as an item on a private feedback board in Listspace itself. That catches what users notice: confusing screens, wrong results, missing features.
> - **Error tracking:** this catches crashes and failed requests that users never report. It does not catch logic bugs or UX problems.
>
> Options:
>
> - **Sentry**, in its EU region: a free tier, quick to set up.
> - **GlitchTip**: self-hosted, Sentry-compatible, but needs memory on the shared server.
>
> Either way: scrub personal data, keep no session replay, and mention it on the privacy and sub-processors pages.

### New text editor (replaces Quill)

> The description editor moves from Quill to a maintained editor (TipTap). Reasons:
>
> - Quill has a security advisory with no fix.
> - Quill has no real tables.
> - Nested lists and quotes get lost when agents read and write markdown.
>
> Existing descriptions keep working; the old markup is read in and saved in the new form. It also fixes "Markdown round trip: nested lists flattened, quotes cut short".

### Legal checks for launch: emails, uploads, age (PR #148)

> Live since 7 Oct (#148).
>
> - **Age:** "I am 16 or older" at sign-up and in agent sign-up (server check still to add, see the Bug item).
> - **Emails:** every email names the sender (Sjenkie B.V., trading as Yellow House Digital, KvK 60310030) with a link to the company details, in the current brand colors. Account emails link to the email settings; the daily summary has one-click unsubscribe. News emails need an opt-in (Settings > Preferences, off by default).
> - **Company details** on the Terms, with the address.
> - **DSA and DMCA:** contact points on the Trust page; legal@listspace.app for authorities and legal notices, hello@ for users.
> - **Checkout rules:** on the Payments item, for when paid plans are built.

### Tool docs list every tool, generated from the server

> The MCP and API docs on the site miss tools. The server now has 48 or more. The list becomes generated from the tool registry itself, with a test that fails when it is out of date, so the docs can never fall behind again.
>
> The same PR adds two things:
>
> - **Previews right away:** links written by agents get their preview straight away.
> - **A rule for public boards:** in the skill and the template, keep internal details on a separate private board, plus an optional "Ops (private)" template.

### Calendar: due dates in your own calendar

> Items with a due date show up in Google Calendar, Apple Calendar or Outlook on their own, for example on a board used as a small CRM.
>
> - **Step 1:** a private calendar feed (iCal URL) per board or for all boards. You subscribe once and it stays up to date. This works everywhere without any login to Google or Microsoft, and you can turn it off or renew the link.
> - **Step 2 (later):** two-way sync with Google and Microsoft, so moving an appointment also moves the due date.
> - **Option:** only important items or items with a due time, to keep the calendar calm.

### Security baseline before paying users

> - **Data isolation tests:** automatic "user B cannot read or change user A's data" tests for every table and every function, run in CI.
> - **Safe fetching everywhere:** webhooks and "upload from URL" move to the new pinned fetcher from the link previews PR. It connects only to the checked public address, which closes the DNS-rebinding gap in the old guarded fetch.
> - **Content Security Policy:** move from report-only to enforced.
> - **Dependency scanning:** Dependabot or similar, for the app, the functions and the CLI.
> - **External check:** an outside penetration test once money comes in (payments go live at launch).

### Homepage: make clear Listspace also works without agents

> People who do not work with agents can still use Listspace on its own as a board app. The current positioning on the public website does not make that clear, so non-agent visitors may think it is not for them.
>
> Add a message along the lines of "Not working with agents? No problem, click here", linking to a short page or section that shows Listspace as a plain board app (boards, lists, items, views) with sign-up from there.
>
> **Decision:** keep this as a secondary link under the main pitch, not an equal second message on the homepage. Without agents Listspace competes head-on with Trello's free plan, where it has the least to set it apart, and equal weight would dilute the "agentic project memory" position.
>
> Related: "Setup page for non-technical users" and "Invite the first testers when v1 is ready" (part of that list will use it this way).

### Launch price: a founding member price?

> Question from Jordi: a "temporary" price (real price 9, now 6) to create urgency, or tiers (first 50 at 6, next 50 at 7)?
>
> Advice:
>
> - **A founding member price that is honest:** 6 euro a month, kept for as long as the subscription runs, for the first 100 paying users. After that the normal price is 9. This is common and fair, and it rewards early users without inventing a deadline.
> - **Avoid a fake "was 9, now 6":** in the EU a price cut must show the lowest price of the previous 30 days, and fake urgency counts as an unfair commercial practice.
> - **One tier is clearer than staircases of 6, 7 and 8.** Show a live counter ("63 of 100 founding spots left") only if it is real.

### Markdown round trip: nested lists flattened, quotes cut short

- Labels: Bug

> Found while dogfooding, writing items through the agent tools:
>
> - **Nested lists:** a sub-list (two spaces before `-` or `1.`) is saved as one flat list. The sub-points become top-level points, both in the view and in the markdown that comes back.
> - **Numbered list under a bullet:** it is pulled out of its bullet and ends up between the surrounding points.
> - **Quotes over several paragraphs:** the view is right, but the markdown that comes back only has `>` on the first paragraph. The rest turns into normal text, so the next save breaks the quote.
>
> Wanted: markdown in = markdown out for nested lists (bullets and numbered) and multi-paragraph quotes, with tests. Related: the numbered-list fix in PR #89.

### Help in the app: a help panel and first steps

> There is no clear help inside the app yet.
>
> **Proposal:**
>
> - **"?" button in the top bar.** It opens a side panel with:
> - a search over short help articles
> - the most common questions
> - "Connect your assistant", which links to /setup
> - keyboard shortcuts
> - "Contact us"
> - **Empty states:** they explain what to do, for example on an empty board or an empty Inbox.
> - **First run:** a short checklist for a new account. Create a board, connect your assistant, ask it to add an item.
>
> The help articles live as markdown in the repo, so they also appear as public pages for search engines and AI.

### Test the app and site on an iPad, and the site on a phone

> - App and public site on an iPad, in both portrait and landscape.
> - Public site on a phone: iPhone Safari and Android Chrome.
>
> Note what breaks and turn each problem into its own item.

### Roadmap page: cleaner items, in line with the rest of the site

> The roadmap shows every item as a separate card, which looks busy next to the rest of the site. Make it calmer: for example a simple list per section (icon, title, one line), with thin dividers instead of boxes, in the same type and spacing as the homepage and docs.

### Item window grows with a long description

> The description box has a fixed height, so a longer text needs its own scrollbar inside the window. The box should grow with the text up to the height of the screen, and only then scroll the whole window.

### Search: scroll to the result, clear the highlight with the search

> - Clicking a search result opens the board but does not scroll to the item. It should scroll the list and the board so the item sits in the centre of the screen.
> - Clearing the search box should remove the highlight from the item straight away.

### List footer: make "Document" clear and line it up with "Add an item"

> At the bottom of every list, "Add an item" is clear but "Document" is not: people do not know what it makes. The two buttons are also not centred, so the footer looks messy. Options: "Add a document" with a short tooltip ("A longer text with versions, like a spec or a decision"), or one "Add" button with a small menu (Item, Document). Both buttons should get the same width and alignment.

### Board images: keep transparency, fit or fill backgrounds, smaller files

- Labels: Bug

> Found by Jordi:
>
> - **Avatar:** a transparent logo gets a black background. The avatar is cropped to a 100x100 JPEG, and JPEG has no transparency. Fix: keep PNG/WebP (or fill with white).
> - **Background:** an uploaded image is stored at its original size and always shown as "fill" (cover). A logo used as a background is blown up and mostly falls outside the screen. Fix: a choice between Fill (photos) and Fit (logos and graphics, centred on a colour, never larger than the screen).
> - **Size:** backgrounds are never resized or compressed. Resize to at most 2560 px on the long side and store as WebP. Keep the original only if it is smaller.

### Link previews

> From "Coming next" on the roadmap: paste a link and get its title and image; for books, a summary and the ISBN too. Needs a server function that fetches other websites, built so it cannot be abused (only public addresses, size and time limits, no redirects to private networks). Next in line after the current PRs.

### Numbered lists come back as bullet lists in markdown

- Labels: Bug

> Found while dogfooding: a description written with `1.` `2.` `3.` renders correctly as a numbered list, but the markdown an agent reads back has `-` bullets. An agent that edits and saves the text turns every numbered list into bullets. The markdown output should keep `1.` for ordered lists.

### Important items and lists, tables in descriptions

> Two of the "Coming next" items from the roadmap, in one PR. Mark items or lists as important and see them across all boards in one view (agents can set it too). Simple tables in item descriptions.

### Check Atlassian: offer, pricing, agent features

> Look at what Atlassian offers (Trello, Jira, Confluence, Rovo) and at what price, how they handle AI agents and MCP, and where Listspace sits next to them.
>
> ## Findings (researched 6 Oct 2026, prices per user per month)
>
> **Trello**
>
> - Free: 10 boards per workspace, 10 collaborators, 250 automation runs/month, 10 MB files. Unlimited cards.
> - Standard: $5 annual / $6 monthly. Unlimited boards, custom fields, advanced checklists, card mirroring, saved searches, 1,000 automation runs.
> - Premium: $10 annual / $12.50 monthly. Calendar, timeline, table, dashboard and map views, unlimited automation, admin controls, Atlassian Intelligence (AI writing and summaries).
> - Enterprise: $17.50 annual only, 50-seat minimum (about $10,500/year to start). SSO, SCIM, unlimited workspaces.
> - AI only on Premium and Enterprise.
>
> **Jira**
>
> - Free: up to 10 users, 2 GB, 100 automation runs/month, no audit log.
> - Standard: about $7.91 monthly / $6.52 annual. Roles, permissions, audit log, no AI.
> - Premium: about $14.54 monthly. Rovo (AI search, chat, agents), advanced planning, unlimited automation, 99.9% SLA.
> - Enterprise: quote, annual only. Atlassian Guard, unlimited sites.
>
> **Confluence**
>
> - Free: up to 10 users, 2 GB, 10 automation runs/month, no AI.
> - Standard: $5.42. 250 GB, guest access, about 25 Rovo credits/month.
> - Premium: $10.44. Unlimited storage, about 70 Rovo credits/month.
> - Enterprise: quote, about 150 Rovo credits/month.
> - Rovo runs on credits: a chat or agent request costs about 10, deep research about 100. Heavy users burn the monthly allowance in days and need a paid add-on.
>
> **Agents and MCP**
>
> - Atlassian has an official remote MCP server for Jira, Confluence, JSM, Bitbucket and Compass. OAuth 2.1 or API tokens. Listed in both the Claude connector directory and the ChatGPT marketplace, so it is a one-click add there. Included with any Cloud subscription, free plan included, with rate limits: Free 500 calls/hour, Standard 1,000/hour, Premium and Enterprise up to 10,000/hour. An org admin has to enable it first.
> - Trello has its own separate official MCP server (mcp.trello.com/v1), OAuth 2.0, works with Claude, ChatGPT and Cursor on any plan. It can read boards, create, move and archive cards, manage checklists and search. It only works inside a live conversation: no triggers, no webhooks, no scheduled runs, no permanent delete.
> - Everything an agent does runs under the signed-in user's permissions and shows up in the audit log.
>
> ## What this means for Listspace
>
> - The "connect your agent" part is no longer a differentiator on its own. Trello and Jira both have one-click connectors in the same directories we are targeting. The directory listing item is therefore a must, not a nice-to-have.
> - What they do not have: the Inbox with agent suggestions, Agent access per board, claim and next_item for agents working on their own, webhooks on Trello, and a board that is meant to be read by the agent first. That is the position: Trello lets an agent edit your board, Listspace lets an agent run its own work from the board. Keep "agentic project memory" and sharpen the comparison against Trello MCP, not Jira.
> - Pricing: Trello Standard at $5 and Premium at $10 is the reference point people will compare against. Pro around $5 to $8 with everything agent-related included looks right. Do not gate agent features behind a higher tier; Atlassian gates AI behind Premium and that is their weak spot.
> - Atlassian's Rovo credits model is confusing and people complain about it. A flat price with no credits is a selling point worth saying out loud.
> - Enterprise has a 50-seat minimum. Nothing to learn there for now; Team plan later.
>
> Related: "Pro features inspired by Trello's paid plans", "Directory listings: Claude, then ChatGPT".

### Setup page for non-technical users: desktop app and ChatGPT, no MCP wording

> A setup page for people who use Claude or ChatGPT but have never added a connector. Two tabs or sections: Claude desktop app and ChatGPT. Screenshots per step, sign in, done. No mention of MCP, URLs to paste only where unavoidable.
>
> Separate from the builder setup pages in PR 10 (skill, CLI, Claude Code plugin). This page is what the tester invite links to.

### Change 'ListSpace.app'

> Change the name 'ListSpace.app' to 'listspace' for example in the footer. Check where else.

### Replace the email logo with the email version

- Labels: Bug

> static/mail/logo-v2.png in storage is the large 2400 px logo; emails expect the 480 x 110 email version (public/brand/mail-logo.png). Replace it so the logo is not slightly flattened in emails.

### Brand page at /brand

> A full brand page: logo and mark (light and dark), downloads (PNG and SVG), colours (crimson, ink, paper), typeface (Outfit for the logo), clear space and minimum size, do's and don'ts, how to write the name.

### Spaces: groups of boards, like desktops

> A space holds its own boards, like desktops in Windows: a personal space, a holiday space, a work space. Switch spaces from the top bar or sidebar; the dashboard, search and starred boards follow the current space. Fits the name Listspace.
>
> ## Decided 6 Oct 2026
>
> - A board is in exactly one space.
> - No Agent access per space for now (global and per board stay).
> - Replaces "Board folders and projects" from the old roadmap.
> - Every existing account gets a "Personal" space with all its boards, so nothing moves.
> - Free plan limit decided later, with the plans.
>
> ## What it takes
>
> - Database: a spaces table (name, colour or icon, order) and a space per board.
> - App: space switcher in the top bar, dashboard, search and starred boards follow the current space, move a board to another space, remember the last space.
> - Agents: list and create spaces, move a board between spaces, filter boards by space.

### Recovery codes for two-step sign-in

> 10 one-time codes shown once when two-step sign-in is turned on (download or copy), stored only as hashes. Using one at sign-in removes the authenticator so the user can set a new one, and sends an email. New codes can be generated in Settings (needs a current code). Replaces most manual recovery by email.

### New logo everywhere (crimson), no beta badge, hero on two lines

> - New logo: lowercase listspace in Outfit, three crimson bars (#D61341) with equal steps
> - Logo, mark, favicons, OG image, email logo; downloadable PNGs of logo and mark
> - Beta badge and beta window removed
> - Hero: "Stop being your" / "agent's memory."
> - The CLI is on npm: docs say `npx listspace`

### Trust page, sub-processor list, DPA template and security.txt

> listspace.app/trust, /legal/subprocessors and /legal/dpa are live, plus internal compliance documents (records of processing, breach procedure, DPIA screening, SOC 2 gap list, accessibility list).

### Sign-in: two-step (authenticator app), email code, new "Desktop required" screen

> - Optional two-step sign-in with an authenticator app: QR code to set it up, a 6-digit code at sign-in, also for connecting Claude or ChatGPT
> - "Email me a sign-in code" as an alternative to the password (a code, not a link)
> - The "Desktop required" screen on phones gets new copy
> - Later: passkeys

### One History tab per item (versions inside it), roadmap tweaks, AI training promise

> - Item window: merge History and Versions into one History tab; document saves show as versions with View, Compare and Restore; filter "All changes" / "Versions only"
> - Roadmap: no dates, short "Later" section, link to the live build board
> - Say plainly where it counts: your data is never used to train AI models and never sold; it is only processed by the providers that run the service (listed in the privacy policy). Connected agents read what you allow, under their own provider's terms.

### Fixes: lists grow to the bottom, "Claude Code" vs "Claude"

- Labels: Bug

> - A long list gets its scrollbar before it reaches the bottom of the screen; it should grow until just above the footer first
> - Settings > Agents shows Claude Code and Claude.ai both as "Claude"; tell them apart by their registration address

### Documents: follow-ups

> - A "Docs" list in the "Project (for agents)" template
> - Copying a document keeps it a document (and its versions?)
> - Board export includes document versions
> - Older versions keep working when an image is removed from the document

### Emails use the logo from its new storage location

> All emails now load the logo from the new static/ folder; the old copy stays for emails already sent.

### The Inbox should have a different color so it stands out

### Publishing the skill, CLI and Claude Code plugin

> Done: public repo github.com/listspace/agent (MIT, Sjenkie B.V.); `npx skills add listspace/agent` works; the repo is also the Claude Code plugin marketplace.
> Open: publish the CLI to npm as `listspace` (from the npm user account; the org is not needed for an unscoped package); submit the plugin to Anthropic's plugin directory; update /docs/mcp from "coming soon" to the real install steps; keep listspace/agent in sync with the app repo's agent/ folder.

### Document items with versions (step 1 of docs on a board)

> For "Project documentation on a board, with versions": an item type "Document" with a long markdown body (PRDs, schemas, decisions). Versions tab built on the history snapshots we already keep: view and restore older versions. Agents write and update documents through the MCP. Step 2 later: show markdown files from a GitHub repo folder (git does the versioning), together with "Markdown and git sync".

### Agents work on their own: claim items, next_item, webhooks

> For "Agents use Listspace autonomously":
>
> - An item can be claimed by an agent ("Claude is working on this") so two agents never pick the same item
> - A `next_item` tool hands out the next open item and claims it in one step
> - Webhooks so an agent can be woken when something lands on a board (a scheduled agent or a GitHub Action can also poll)
> - The skill's work loop already describes pick, Doing, do, log, Done

### Setup guides for Claude Code, Codex and Cursor; tour video back

> /docs/mcp has a guide per agent, and the homepage badges link to them. ChatGPT note corrected: Developer mode only applies in Business, Enterprise and Edu workspaces.

### Test sign-in from Codex and Cursor

> Tested 6 Oct: our sign-in server accepts self-registration with the return addresses Codex and Cursor use (127.0.0.1 and localhost), and the sign-in request leads to the Listspace login. Test registrations deleted afterwards. Still open: one real end-to-end sign-in from Codex or Cursor by someone who has them.

### Agents use Listspace autonomously

> Agents use Listspace on their own: they pick up open work from a board, move items through doing and done, log what they did, and park ideas and questions without a human prompting each step.
>
> Built: claim_item and release_item, next_item, start_session, webhooks, and Agent access with the Inbox. This board itself is run that way.

### Project documentation on a board, with versions

> Possibility to add project documentation to a board: PRDs, schemas and similar documents. Documents can be updated with new versions, so the board keeps the current version and the history.
>
> **Overlap to decide on:** this touches the "Markdown and git sync" idea. If docs live as markdown files in a repo, git already gives the versioning for free and the board only needs to show the current file (plus a link to the history). Decide whether these are one feature or two before building either.

### Private board: photo credit sits on the sideways scrollbar

- Labels: Bug

> At some widths the "Photo by ..." credit overlaps the board's horizontal scrollbar, because its offset is measured before the lists load. The shared board already places it above the scrollbar; use the same logic.

## Not in Use

No items.

> Currently inactive or out-of-scope items

Next page: https://listspace.app/@jordi/listspace-build-in-public.md?page=2
