varo6/xtcjs

Convert manga cbz to xtc locally on your browser! XTEink X4 optimized!

TypeScript

213

88 commits

updated Sep 19, 2026

See the code

README

XTC.js

Read manga and comics on your reader.

Live Demo Users TypeScript Bun License

Made with ❤️ by varo6 & sodaFMR

A free, privacy-first web app that converts your CBZ comics, PDFs, images, and videos into XTC format for your reader. XTC.js is growing beyond a single device: choose your reader to size the pages for its screen, then preview and download your files.

New: Sticky support. Convert for reTerminal Sticky running CrossPoint Reader, alongside XTEink X4, X4 Pro, and X3. Read the introduction.

Open XTC.js · Read the blog

No installation or account required.

Supported readers

ReaderPage canvasNotes
XTEink X4 / X4 Pro480×800Select X4 / Pro
XTEink X3528×792Select X3
Seeed Studio reTerminal Sticky480×800Requires CrossPoint Reader firmware

Sticky's preset uses the page canvas expected by CrossPoint Reader. Generated XTC files are not compatible with the original Seeed firmware.

Features

Convert for your reader

InputWhat it's for
CBZ / CBRManga and comic archives
PDFDocuments, scanned manga, and books
ImagesJPG, PNG, and WEBP wallpapers and covers
VideoConvert video frames to XTC pages
  • Choose Floyd-Steinberg, Atkinson, Sierra-Lite, Ordered, or no dithering.
  • Adjust contrast and preview the result before downloading.
  • Split spreads to fit your reader, or keep them whole.
  • Select your device to use the matching page size.

Merge, split, and edit metadata

  • Combine CBZ, PDF, or XTC files.
  • Split files by page ranges or into equal chunks, then convert the parts.
  • Add title, author, and chapter information to XTC files.
  • Create a table of contents for navigation on your reader.

Blog

The XTC.js blog covers new readers and app updates. Start with Introducing Sticky for setup instructions and the move toward supporting more devices.

The blog has its own reading layout, article cards, and responsive banners. A small Blog link beside the theme toggle keeps it accessible from the app.

Why XTC.js?

🔒 100% PrivateEverything runs in your browser. Your files never leave your device.
📴 Works OfflineOnce loaded, use it anywhere without internet.
🎫 No AccountJust drop your files and convert. Zero friction.
👁️ Live PreviewSee exactly how pages will look before downloading.

Quick start

  1. Open xtcjs.app in your browser
  2. Drop your CBZ, PDF, or image files
  3. Select your reader and adjust settings
  4. Convert and watch the live preview
  5. Download your XTC file
  6. Transfer to your reader

For reTerminal Sticky, install CrossPoint Reader first. The generated XTC files are not compatible with the original Seeed firmware.


Suggested settings

Manga and comics

SettingValue
DitheringFloyd-Steinberg
ContrastMedium
SplitOverlapping thirds
OrientationLandscape

With Split wide pages (right to left) enabled, wide CBZ/CBR images are treated as double-page spreads. Each half uses the selected thirds/halves split, starting with the right page. The first image stays whole for the cover. Uncheck this option to keep panoramic artwork together, or choose No split to keep every source page whole. This is geometric splitting, not panel detection.

PDFs and documents

SettingValue
DitheringAtkinson
ContrastStrong / Maximum
OrientationLandscape

Wallpapers and covers

SettingValue
Image ScalingCover
OrientationPortrait
DitheringFloyd-Steinberg

FAQ

Which dithering algorithm should I use?
  • Floyd-Steinberg: Best all-rounder for manga with detailed art
  • Atkinson: Sharper results, great for text-heavy content
  • Sierra-Lite: Lighter dithering, good for high-contrast art
  • Ordered: Patterned dithering, retro look
  • None: Pure black and white, no gradients
Why are my pages split in half?

When you convert landscape images, such as two-page manga spreads, XTC.js can split them to fit your reader. Use "No split" if you prefer full spreads. PDFs also support a "Split by columns (4-way)" option for two-column layouts.

Can I use this on my phone?

Yes! XTC.js works on any modern browser. Large files may convert slower on mobile due to limited processing power.

What's the XTC format?

XTC is a page image format for compatible e-ink readers. It contains optimized 1-bit black and white images at the device's resolution, designed for fast page turns and excellent readability.

Is there an XTCH format?

XTCH is the 2-bit variant with 4 grayscale levels instead of pure black and white. Some content may look better in XTCH.


Credits

XTC.js started as a TypeScript port of cbz2xtc. It is maintained by varo6 and sodafmr.

Thank you to the Seeed Studio team behind reTerminal Sticky. We're happy to bring Sticky to XTC.js, and we hope to keep working with them to make reading on it even better.


Development

bun install      # Install dependencies
bun run dev      # Dev server → localhost:5173
bun run build    # Production build
bun run serve    # Production server → localhost:3000

Adding a blog post

  1. Add a route in src/routes/, following blog.introducing-sticky.tsx.
  2. Add its title, route, excerpt, category, author, and reading time to src/lib/blog.ts.
  3. Use BlogArticle from src/components/blog/ for the shared article layout. Pass the post's banner through its banner prop.
  4. Add any new cover artwork to the card rendering in src/routes/blog.index.tsx.
  5. Run bun run build to regenerate the route tree and check the production build.

Blog styles live in src/styles/blog.css. Keep banners proportional and contained within the article width.

Contributors

varo6

54 commits

SodaFMR

34 commits

Languages

TypeScript

84.8%

CSS

14.4%

varo6/xtcjs

Convert manga cbz to xtc locally on your browser! XTEink X4 optimized!

TypeScript

213

88 commits

updated Sep 19, 2026

See the code

README

XTC.js

Read manga and comics on your reader.

Live Demo Users TypeScript Bun License

Made with ❤️ by varo6 & sodaFMR

A free, privacy-first web app that converts your CBZ comics, PDFs, images, and videos into XTC format for your reader. XTC.js is growing beyond a single device: choose your reader to size the pages for its screen, then preview and download your files.

New: Sticky support. Convert for reTerminal Sticky running CrossPoint Reader, alongside XTEink X4, X4 Pro, and X3. Read the introduction.

Open XTC.js · Read the blog

No installation or account required.

Supported readers

ReaderPage canvasNotes
XTEink X4 / X4 Pro480×800Select X4 / Pro
XTEink X3528×792Select X3
Seeed Studio reTerminal Sticky480×800Requires CrossPoint Reader firmware

Sticky's preset uses the page canvas expected by CrossPoint Reader. Generated XTC files are not compatible with the original Seeed firmware.

Features

Convert for your reader

InputWhat it's for
CBZ / CBRManga and comic archives
PDFDocuments, scanned manga, and books
ImagesJPG, PNG, and WEBP wallpapers and covers
VideoConvert video frames to XTC pages
  • Choose Floyd-Steinberg, Atkinson, Sierra-Lite, Ordered, or no dithering.
  • Adjust contrast and preview the result before downloading.
  • Split spreads to fit your reader, or keep them whole.
  • Select your device to use the matching page size.

Merge, split, and edit metadata

  • Combine CBZ, PDF, or XTC files.
  • Split files by page ranges or into equal chunks, then convert the parts.
  • Add title, author, and chapter information to XTC files.
  • Create a table of contents for navigation on your reader.

Blog

The XTC.js blog covers new readers and app updates. Start with Introducing Sticky for setup instructions and the move toward supporting more devices.

The blog has its own reading layout, article cards, and responsive banners. A small Blog link beside the theme toggle keeps it accessible from the app.

Why XTC.js?

🔒 100% PrivateEverything runs in your browser. Your files never leave your device.
📴 Works OfflineOnce loaded, use it anywhere without internet.
🎫 No AccountJust drop your files and convert. Zero friction.
👁️ Live PreviewSee exactly how pages will look before downloading.

Quick start

  1. Open xtcjs.app in your browser
  2. Drop your CBZ, PDF, or image files
  3. Select your reader and adjust settings
  4. Convert and watch the live preview
  5. Download your XTC file
  6. Transfer to your reader

For reTerminal Sticky, install CrossPoint Reader first. The generated XTC files are not compatible with the original Seeed firmware.


Suggested settings

Manga and comics

SettingValue
DitheringFloyd-Steinberg
ContrastMedium
SplitOverlapping thirds
OrientationLandscape

With Split wide pages (right to left) enabled, wide CBZ/CBR images are treated as double-page spreads. Each half uses the selected thirds/halves split, starting with the right page. The first image stays whole for the cover. Uncheck this option to keep panoramic artwork together, or choose No split to keep every source page whole. This is geometric splitting, not panel detection.

PDFs and documents

SettingValue
DitheringAtkinson
ContrastStrong / Maximum
OrientationLandscape

Wallpapers and covers

SettingValue
Image ScalingCover
OrientationPortrait
DitheringFloyd-Steinberg

FAQ

Which dithering algorithm should I use?
  • Floyd-Steinberg: Best all-rounder for manga with detailed art
  • Atkinson: Sharper results, great for text-heavy content
  • Sierra-Lite: Lighter dithering, good for high-contrast art
  • Ordered: Patterned dithering, retro look
  • None: Pure black and white, no gradients
Why are my pages split in half?

When you convert landscape images, such as two-page manga spreads, XTC.js can split them to fit your reader. Use "No split" if you prefer full spreads. PDFs also support a "Split by columns (4-way)" option for two-column layouts.

Can I use this on my phone?

Yes! XTC.js works on any modern browser. Large files may convert slower on mobile due to limited processing power.

What's the XTC format?

XTC is a page image format for compatible e-ink readers. It contains optimized 1-bit black and white images at the device's resolution, designed for fast page turns and excellent readability.

Is there an XTCH format?

XTCH is the 2-bit variant with 4 grayscale levels instead of pure black and white. Some content may look better in XTCH.


Credits

XTC.js started as a TypeScript port of cbz2xtc. It is maintained by varo6 and sodafmr.

Thank you to the Seeed Studio team behind reTerminal Sticky. We're happy to bring Sticky to XTC.js, and we hope to keep working with them to make reading on it even better.


Development

bun install      # Install dependencies
bun run dev      # Dev server → localhost:5173
bun run build    # Production build
bun run serve    # Production server → localhost:3000

Adding a blog post

  1. Add a route in src/routes/, following blog.introducing-sticky.tsx.
  2. Add its title, route, excerpt, category, author, and reading time to src/lib/blog.ts.
  3. Use BlogArticle from src/components/blog/ for the shared article layout. Pass the post's banner through its banner prop.
  4. Add any new cover artwork to the card rendering in src/routes/blog.index.tsx.
  5. Run bun run build to regenerate the route tree and check the production build.

Blog styles live in src/styles/blog.css. Keep banners proportional and contained within the article width.

Contributors

varo6

54 commits

SodaFMR

34 commits

Languages

TypeScript

84.8%

CSS

14.4%