Skip to content

Keep the free Render instance awake - #18

Closed
byrishi wants to merge 41 commits into
mainfrom
ci/keep-awake
Closed

byrishi wants to merge 41 commits into
mainfrom
ci/keep-awake

Conversation

@byrishi

@byrishi byrishi commented Oct 28, 2026

Copy link
Copy Markdown
Owner

Render's free plan sleeps after 15 minutes without traffic and takes about a minute to wake up. Search crawlers fetching the sitemap often give up before that, which can make Google Search Console report Sitemap could not be read.

This scheduled workflow pings /healthz every 10 minutes:

  • Running all month uses about 744 of the 750 free instance hours.
  • Each ping is a tiny request, so it uses almost no bandwidth.
  • GitHub may run the schedule a few minutes late. A gap of up to 15 minutes is still fine.

Generated by Claude Code

byrishi and others added 30 commits May 24, 2026 22:47
Updated logo and added screenshots section to README.
Added a badge for DeepWiki to the README.
Speed and progress were wrong on both sides and concurrent sends could
corrupt files. The engine is rewritten around receiver acknowledgements.

- Send files one at a time per peer so chunks never interleave
- Report sender progress and speed from receiver acks, not local buffer
- Use a 2 s rolling window for speed; update the UI at 4 Hz
- Prefetch disk reads in 8 MB blocks; batch receiver writes to 4 MB
- Add an ack window so slow disks cannot exhaust receiver memory
- Give every transfer a unique ID so same-name files do not collide
- Buffer ICE candidates until the remote description is set
- Retry transient disconnects with ICE restart instead of tearing down
- Add receiver-side cancel, size verification and OPFS cleanup
- Show the connection route (local network, direct, TURN relay)
- Accept 6-character room codes in the join field
- Point-cloud scene with bloom and haze, drawn behind the app
- The scene changes with the session: landing, waiting room, and a
  stream between the two devices whose flow follows live speed
- Show live throughput on the connected screen
- Respect reduced motion, cap particles on mobile, fall back without
  WebGL
- Fix the waiting-room card alignment and the VITE_BACKEND_URL docs
Security (full review in SECURITY.md):
- Require approval before a new device can send anything, and an
  explicit accept for every incoming file
- Show a safety number derived from both DTLS fingerprints so users can
  rule out a man-in-the-middle signaling server
- Limit wrong room-code guesses per IP; add optional room passwords
  (scrypt)
- Scope signaling messages to members of the same room and cap their
  size
- Make rate limits proxy-aware and stop rate limiting static assets
- Issue short-lived TURN credentials from /api/turn; enable Helmet/CSP
- Enforce the announced file size on the receiver
- Remove inaccurate encryption claims from the docs

Features:
- Resume an interrupted transfer from the exact byte
- Save straight to disk or into a folder (File System Access API)
- Send folders with their structure; save as a streaming ZIP (ZIP64)
- Keep a stable client ID so reconnects never duplicate peers or sends
- Readable room codes, nearby-device discovery and invites
- Paste to send, clipboard sync (beta), speed graph, local history
- Installable PWA with share target
- Move session logic into a useRelay hook and split the UI into
  components; add React type definitions
- Keep every guide and page as Markdown in content/, one source for the
  app, search engines and AI assistants
- Prerender each route to static HTML with title, description,
  canonical URL, Open Graph and JSON-LD
- Publish a .md copy of every page (with Accept: text/markdown
  negotiation), llms.txt, llms-full.txt and a sitemap
- Serve 301s for merged URLs and real 404s
- 33 guides: correct 18, merge 4 duplicates, add 15
- Fail the build on broken internal links, duplicate titles and
  over-long descriptions
- Add a Dockerfile and a Render blueprint; rewrite the README
- Explain where a file goes, how to verify the other device, and what
  the server can see, next to the actions they relate to
- Clearer waiting room, approval and incoming-file copy; persistent
  Verified state after comparing safety numbers
- Accessible dialog with focus trap, Escape and focus return; fix
  dialogs stealing focus on re-render
- Skip link, visible focus, labelled controls, correct heading order
  and contrast
- Announce incoming files, approvals and completions to screen readers
- Add a footer switch to stop the background animation
- Rebuild the favicon, app icons and an SVG mark from the original
  scan-line R; use them in the header, footer and Open Graph image
- Draw the R from particles in the background; split it into two marks
  joined by a stream while devices are connected
- Add links that open ChatGPT, Claude, Google AI and Perplexity with a
  question about Relay (logos from @lobehub/icons, MIT)
- Refresh the README screenshots
- Keep only the four packages the server needs at runtime in
  dependencies; move the client and build tooling to devDependencies
  so the production image installs less
- Remove unused packages (dotenv, jszip, autoprefixer)
- Add package metadata (license, repository, homepage, engines) and a
  typecheck script in place of lint
- Remove the Google AI Studio metadata file and its HMR settings
- Add .editorconfig and .nvmrc
The home page now opens on the product itself: a Send and Receive
window that works straight away, instead of a marketing hero.

- New dark interface (Geist, night palette, one indigo accent) applied
  to the home page, waiting room, connected view, guides, articles,
  Verify page, dialogs and 404
- Pick or drop files before anyone joins; they are staged and sent as
  soon as the other device is approved
- Branded QR codes: dots in the Relay gradient, rounded finder patterns
  and the R in the centre, at error-correction level H so they still
  scan
- Logo: the original line-drawn R in the brand gradient, no tile
- Connected view: live speed between the two devices' marks, with
  transfers, sending and messages in one window
- Home page sections: how files travel, a comparison with WeTransfer,
  Google Drive and AirDrop, and a short FAQ
- Split vendor code into cacheable chunks
- Accessibility: axe reports no violations on any screen; keyboard
  flow unchanged
- favicon.svg: the line-drawn R in the brand gradient, with deeper
  colours on light browser tabs
- PNG and ICO fallbacks and app icons: the R on a night background so
  it stays legible at 16 px
- New Open Graph image to match the dark site
- README uses the new logo and the current screenshots (WebP, about a
  tenth of the previous size)
- Guides refer to the renamed Start sending button
- Add CONTRIBUTING.md with setup, checks and commit conventions
Also enable Dependabot for npm (weekly, minor and patch grouped) and
GitHub Actions (monthly).
Relay 2.0: dark redesign, send-first flow and branded QR codes
Light design
- A second, Apple-style light design: white and light-grey surfaces,
  system fonts, blue pill buttons, a laptop-and-phone hero, stat tiles,
  a black privacy section and the working app under "Try it right here"
- Every screen (waiting room, connected view, guides, articles, Verify,
  dialogs) follows the active design through shared colour tokens
- The particle band in the connected view renders on light or dark

Design switch
- Dark/Light switch in the header; the choice is remembered and can be
  linked with ?design=light or ?design=dark
- Applied before first paint by a small same-origin script, so there is
  no flash and the CSP stays strict

Phones
- Home page split into components shared by both designs
- Touch-sized controls (44 px), 16 px inputs so iOS doesn't zoom,
  phone-first copy where dragging isn't possible
- Waiting room shows the code and share buttons first, QR code below
- Connected view: device rows instead of wrapping chips, two-column
  offer buttons, and the marks centred on the speed readout
- Comparison becomes cards on phones; the "how it works" diagram
  switches to a vertical layout
- Scrollable markdown tables are keyboard-focusable

axe reports no violations in either design on desktop or phone.
Light design, design switch and phone layout
Room codes now pair a quality or idea with something from nature, both
Sanskrit words found across the Vedas, Upanishads and the Gita, plus a
number (satya-ganga-108). About 11 million combinations; wrong guesses
are still rate limited per IP.

Device names follow the same idea (Shanti Hamsa, Karuna Megha).
The mark is an R on a 5x7 pixel grid with one pale pixel leaving its
shoulder: the file on its way. Icons are the white R on ultramarine; the
favicon follows the browser's light or dark tab colour.
The working app is now the home page's hero: one ultramarine sheet with
Send and Receive side by side, under a headline that says what Relay
does. The waiting room and the connected screen are the same sheet, so
the app looks like one object from start to finish.

- Palette: cool paper and a single ultramarine, no other accent.
- Type: Aujournuit (display, on a variable width axis that reacts to the
  pointer), Apfel Grotezk (text) and Departure Mono only for room codes
  and safety numbers. All SIL OFL and self-hosted.
- The link between devices is a stream whose speed follows the real
  transfer speed.
- QR codes redrawn in the same pixel language as the mark; error
  correction stays at level H.
- Guides and content pages share the grid, with a metadata column.
- A viewfinder cursor on mouse and trackpad, one transition between
  pages and smooth scrolling (Lenis), all off for reduced motion and on
  touch screens.

Removes the Dark and Light designs, the design switch, the WebGL
background and the unused Inter and Geist packages.
Plays "Relay — Straight" and then "Relay — Across" by Thepla Theorist and
Rishi Shah, on a loop. Off by default; nothing downloads until the key
is pressed, and the volume fades in and out.

The files stream from jsDelivr (served from this repository), so music
never counts against the host's bandwidth, with this server as the
fallback. The recordings are not MIT licensed; see
public/audio/LICENSE.txt.
Ultramarine redesign, Sanskrit room codes and a soundtrack
byrishi and others added 11 commits October 28, 2026 17:17
…fer"

New guides for what people search when a file won't send: the best free
file transfer sites with their real limits, file size limits for email,
chat and cloud apps, emailing a large file, large WhatsApp videos,
SHAREit and Xender alternatives (both still blocked in India), Quick
Share alternatives, Mac and Windows, two computers, sending without an
account, whether WeTransfer is safe, and a glossary.

Each opens with a direct answer, compares options in a table, ends with
an FAQ and cites its sources with dates, so search and AI answers can
quote it. Existing guides link to the new ones.
- Entry screen on the home page: the mark assembles pixel by pixel and
  the packet pixel leaves; visitors enter with sound on (default) or off.
  Pressing Enter is the gesture browsers need before music can play.
  Skipped for room links (?code=), guides, crawlers and repeat visits in
  the same session.
- One shared soundtrack player behind every sound control, with a fade,
  lock-screen metadata and a one-time invitation on guide pages.
- Cursor: a dot plus a spring-driven ring that wraps buttons and links in
  their own corner radius, turns white on the blue sheet, steps aside
  over text fields, squeezes on press and sleeps when the pointer is
  still.
- Motion: headline lines rise after the entry closes, section headings
  reveal word by word, lists stagger in, FAQ answers open smoothly, the
  footer wordmark rises with the scroll, new room codes resolve out of
  noise and the live speed eases between values.
- Kinetic type only animates while on screen and while something moves.
- Phones: compact header with a visible Sound key, no empty drop area on
  touch screens.
- Fonts move to public/fonts so they can be preloaded.
…rand kit

- A 1200x630 link preview for every page (public/og), set per page in
  og:image and twitter:image.
- Favicon set (ICO 16/32/48, 96 px PNG, SVG) drawn so the mark survives
  the round crop search results apply.
- Structured data: a Person for the author with sameAs links, logo as an
  ImageObject, per-article images, language and word count.
- Home page targets "free file transfer" in its title, description and
  H1; the animated headline is decorative and hidden from assistive
  tech and snippets.
- Long guides get an "On this page" list; tables get unique labels.
- IndexNow: key file, scripts/indexnow.mjs and a workflow that submits
  the sitemap after each deploy to main.
- Optional GOOGLE_SITE_VERIFICATION and BING_SITE_VERIFICATION tags.
- Brand kit at /brand (also as /brand.md and in llms.txt) with logo,
  mark and app icon downloads, colours, type, usage and an approved
  description.
- scripts/brand-assets.mjs regenerates all icons, previews and brand
  files; fonts, previews and brand files are cached for a week.
SEO, AEO and experience: new guides, link previews, entry screen and brand kit
It was a link to the home page, so on the home page it did nothing. It
now opens the file picker on any screen: on the landing page the chosen
files are staged and a room opens, in a room they are sent, and from a
guide it brings you home first.
Fix: header Send key opens the file picker
The prerendered home page painted for a moment while the app loaded,
then the entry screen covered it. A tiny blocking script in <head> now
applies the same rules as the entry screen and, when it will show,
paints the page ultramarine before anything else. The entry screen
removes the cover once it is on screen; if the app never starts, the
cover fades by itself after six seconds.
A "Scan QR code" key under Receive on touch screens opens Relay's own
scanner: the camera fills the screen, the ultramarine sheet frames a
square viewfinder with a sweeping line, and a light key appears where
the camera has a torch. A Relay link or bare room code joins the room
straight away; any other QR says so instead of opening it.

Uses the browser's BarcodeDetector where available and jsQR elsewhere
(including iPhone Safari). Both load only when the scanner opens, so the
page itself does not get heavier. Tested end to end with a fake camera
feed of the branded QR code.
Branded QR scanner for phones and tablets
Render's free plan sleeps after 15 minutes idle and takes about a minute
to wake, long enough for search crawlers fetching the sitemap to give up.
Ping /healthz every 10 minutes; running all month stays within the 750
free instance hours.
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 28, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-10-28T18:19:07.630362Z c5e56f2 PR opened
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@chatgpt-codex-connector chatgpt-codex-connector 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: c5e56f23e3

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +8 to +9
schedule:
- cron: '*/10 * * * *'

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Account for GitHub's 60-day schedule shutdown

If this public repository has no activity for 60 days, GitHub automatically disables scheduled workflows (GitHub documentation). The pings will then stop and the free Render service will sleep again, so this workflow won't keep it awake through long inactive periods. Please account for that shutdown behavior, for example by using a scheduler not subject to it.

Useful? React with 👍 / 👎.

@byrishi byrishi closed this Oct 29, 2026
@byrishi
byrishi deleted the ci/keep-awake branch October 29, 2026 06:54
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.

1 participant