Skip to content

Add /cursor ASCII dither route#34

Closed
nwthomas wants to merge 3 commits into
mainfrom
cursor/-bc-54d6f674-985c-4b0f-8f66-da80c0542fd3-98e2
Closed

Add /cursor ASCII dither route#34
nwthomas wants to merge 3 commits into
mainfrom
cursor/-bc-54d6f674-985c-4b0f-8f66-da80c0542fd3-98e2

Conversation

@nwthomas

@nwthomas nwthomas commented Apr 4, 2026

Copy link
Copy Markdown
Owner

Ticket

Problem

We need a dedicated /cursor route that renders a black-background ASCII composition with centered white logo glyphs and a char-grid flicker effect.

Solution

  • Added a new App Router route at app/cursor/page.tsx.
  • Implemented CursorAsciiCanvas as a client component that:
    • Builds a full-screen monospaced character grid around the logo.
    • Stores each character as an object with metadata (value, displayValue, isBackground, row/col/id, lit state).
    • Centers the ASCII logo in the matrix.
    • Runs a 200ms probabilistic flicker pass for a dither-like character animation.
    • Keeps logo/foreground characters white while still allowing flicker via glyph substitution.

Testing

  • bun run lint
  • bun run build
  • Manual verification at http://localhost:3000/cursor:
    • black full-viewport background
    • centered logo in a larger monospace grid
    • white logo characters
    • black-on-black background characters
    • visible ~200ms flicker/churn effect

Walkthrough artifacts

cursor_ascii_dither_route_demo_final.mp4
Final centered ASCII logo state

To show artifacts inline, enable in settings.

Open in Web Open in Cursor 

nwthomas and others added 2 commits April 3, 2026 22:41
Co-authored-by: Nathan Thomas <nwthomas@users.noreply.github.com>
@vercel

vercel Bot commented Apr 4, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
personal-portfolio Ready Ready Preview, Comment Apr 4, 2026 8:52pm

Co-authored-by: Nathan Thomas <nwthomas@users.noreply.github.com>
@nwthomas nwthomas closed this Apr 4, 2026
@nwthomas nwthomas marked this pull request as ready for review April 4, 2026 20:57
@nwthomas nwthomas deleted the cursor/-bc-54d6f674-985c-4b0f-8f66-da80c0542fd3-98e2 branch April 4, 2026 20:57

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 2 potential issues.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 9fe2756. Configure here.

.###########, *#### .#### &#### &###################, *###################, ####################, (####
`;

const LOGO_LINES = ASCII_LOGO.split("\n").filter((line) => line.length > 0);

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Filter removes intentional blank line from ASCII logo

Medium Severity

The .filter((line) => line.length > 0) on LOGO_LINES removes all empty lines, including the intentional blank line between the cursor icon graphic and the "CURSOR" logotype text (the empty line between /(* and the .#######, row). This collapses the vertical gap between the two visual sections of the logo, making it appear compressed. The filter is needed to strip leading/trailing empty strings from the template literal, but it also strips internal blank lines that are part of the art.

Additional Locations (1)
Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit 9fe2756. Configure here.

value,
displayValue: value,
isBackground: !isForeground,
isLit: isForeground,

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

isLit field is redundant dead state

Low Severity

The isLit field on AsciiCell never changes from its initial value. Background cells always get isLit: false and foreground cells always get isLit: true in every flicker code path, making it permanently equal to !isBackground. The render expression cell.isBackground || !cell.isLit simplifies to just cell.isBackground. The field, its assignments, and its conditional checks add unnecessary complexity and could mislead developers into thinking it controls a meaningful visual toggle.

Additional Locations (2)
Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit 9fe2756. Configure here.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants