Turn long-form content into a book plan.

Longformer is a web app for planning a book from a podcast or other long-form content. You add audio, video or text, or pick episodes from an RSS feed, and it lays out a chapter plan that you can edit. The app calls itself Podbook.

How it works View on GitHub

Early stage. Everything you see on this page runs on a mock backend in the repository: no real transcription, no real AI and no real export yet. See the status table.

How it works

The repository's own landing copy describes four steps. This is how far each one goes in the code today.

  1. Upload or import prototype

    Drop audio, video, text or document files, or paste a podcast RSS feed and pick episodes. The screens and the upload widget exist; the server side is simulated.

    Source: components/marketing/HowItWorks.vue, pages/projects/new.vue

  2. Plan chapters prototype

    The planner takes the chosen sources and returns a list of chapters, each with a title, a summary and the sources it draws on. The mock returns the same three chapters every time: Introduction, Main content and Conclusion. No AI is called.

    Source: stores/planner.ts, lib/api/MockService.ts (createPlan)

  3. Draft and edit prototype

    The planner store can rename a chapter, add one, remove one and reorder the list. There is no screen for it in the repository yet: the route that the project page links to, /projects/:id/plan, has no page file.

    Source: stores/planner.ts; pages/ (no projects/[id] pages)

  4. Export and publish planned

    The data model and the mock API know about previews and exports in DOCX, EPUB, PDF and Markdown. No screen calls them, and the mock only hands back a made-up download link. The marketing copy lists DOCX, EPUB and PDF.

    Source: types/index.ts, lib/api/MockService.ts (createPreview, createExport)

What the app offers

The six cards on the repository's marketing page, each with what the code behind it does. The badge tells you how far it goes.

  • Audio processing prototype

    Upload audio files. The marketing copy says they are transcribed; no transcription code exists in the repository.

    Source: components/uploads/FileUploaderUppy.vue

  • Video support unverified

    Video files are accepted by the uploader. Extracting audio or a transcript is not in the code.

    Source: components/uploads/FileUploaderUppy.vue

  • RSS import prototype

    Paste a feed address, load a list of episodes and tick the ones you want (the first ten are ticked by default). The list is five made-up episodes from the mock.

    Source: components/rss/*, lib/api/MockService.ts

  • AI planning planned

    The planner request and response are defined and the HTTP client calls /planner/plan. Only the mock exists, and it is not AI.

    Source: lib/api/ApiClient.ts, MockService.ts

  • Easy editing prototype

    Chapter edit, add, remove and reorder are in the planner store. No editing screen yet.

    Source: stores/planner.ts

  • Multiple formats planned

    The export request accepts docx, epub, pdf and md. Nothing builds a file yet.

    Source: types/index.ts (ExportRequestSchema)

The screens

Drawn in HTML and CSS from the app's own structure. Illustrative: the names and numbers are invented, and these are not screenshots.

The data model

The shapes are written once as Zod schemas, and the types come from them. A project holds sources and chapters, and each chapter lists the sources it comes from.

Three Pinia stores hold the state: projects (list, current project, create), planner (chapters, selected sources, edit and reorder) and auth (current user).

Source: types/index.ts, stores/*.ts

Inputs

  • File upload prototype

    An Uppy dashboard takes up to 10 files of up to 100 MB each. Accepted: audio, video, plain text, Markdown, PDF, DOC and DOCX. It is written for multipart upload to S3 with signed part addresses; in mock mode the signed addresses are fake and nothing is stored.

    Source: components/uploads/FileUploaderUppy.vue, lib/api/*

  • RSS feed prototype

    Enter a feed address and the app asks the API for the episode list (/rss/episodes); you choose episodes and carry them into the project. In mock mode the answer is five sample episodes whatever address you type.

    Source: components/rss/RssImportForm.vue, EpisodePicker.vue

As a Canvas app view

The repository includes a small extension for OpenHands Canvas. Its manifest is named longformer, shows as “Podbook”, is version 0.1.0 and describes itself as the Podbook book planner hosted as a Canvas app backend view.

  • One page prototype

    It contributes a single page, studio, at the path /studio, with the navigation label “Podbook”.

  • A static build behind the server prototype

    The page mounts the app's static build through Canvas's app-backend view. If the Agent Server does not have the app backend bridge enabled, it shows a message saying so instead.

  • Serving the build

    npm run build:canvas makes a static build with a relative base path, and npm run serve:canvas serves it with a small Node script (port 3000 unless PORT is set). The files do not describe how to register the extension in Canvas, so that step is not covered here.

Source: canvas-extension/canvas-extension.json, canvas-extension/index.js, scripts/serve-static.mjs, package.json, nuxt.config.ts

Stack

  • Nuxt 4
  • Vue 3.5
  • Pinia
  • Tailwind CSS
  • Zod 4
  • Uppy 4
  • TypeScript

Version ranges are from package.json. The package list also names TanStack Vue Query and Vue Draggable, but nothing in the source imports them yet. The sign-in design is Amazon Cognito hosted login (see the environment names below), and uploads are designed for S3 behind CloudFront.

Source: package.json, nuxt.config.ts, components/uploads, components/auth/HostedLoginButton.vue

What is real and what is mock

An inventory taken from the repository on 2026-10-25. The repository has no README and two commits (both by the same author, on 2026-10-21).

  • available works in the code as shipped
  • prototype built, but on mock data or without a screen
  • planned defined in types or the client, not working
  • unverified not checked against a running build
PartStatusWhat the code does
Mock modeavailableThe Nuxt setting is mockMode = (env === 'true') || true, which is always true, so the mock is always used. Setting the environment variable to false does not turn it off.
Mock serviceavailableFake user, two sample projects, five sample episodes, a fixed three-chapter plan, and preview and export jobs that move from queued to processing to succeeded as they are polled.
HTTP API clientprototypeA typed client for /auth, /me, /projects, /uploads, /rss, /planner, /previews and /exports. No server for it is in this repository.
Sign-inprototypeIn mock mode a demo user is signed in automatically and kept in browser storage. The real flow (Cognito hosted login, code exchange) is wired to the client but not to a server.
File uploadprototypeReal Uppy widget and limits; fake signed addresses in mock mode, so no file is stored.
RSS importprototypeReal form and picker; the episode list is fixed sample data.
TranscriptionplannedPromised by the marketing copy; no code.
Chapter planningplannedStore and API call exist; the plan is a fixed list, not generated.
Plan editor screenplannedLinked from the project page and the create flow, but the route has no page.
ExportplannedSchemas and mock jobs only; no document is built.
Canvas extensionunverifiedManifest and entry point are present and small. Not run in Canvas for this page.

Source: nuxt.config.ts, lib/api/index.ts, ApiClient.ts, MockService.ts, stores/auth.ts, components/*, pages/*

Get started

Run it locally

You need Node.js and npm. Clone the public repository, then:

npm install
npm run dev

Other scripts in package.json: build, generate, preview, build:canvas, serve:canvas.

Environment

An env.example lists the settings the app reads. Because mock mode is always on, none is needed to try the app.

  • NUXT_PUBLIC_API_BASE_URL
  • NUXT_PUBLIC_COGNITO_DOMAIN
  • NUXT_PUBLIC_COGNITO_CLIENT_ID
  • NUXT_PUBLIC_COGNITO_REDIRECT_URI
  • NUXT_PUBLIC_AWS_REGION
  • NUXT_PUBLIC_UPLOAD_BUCKET
  • NUXT_PUBLIC_CLOUDFRONT_PUBLIC_URL
  • NUXT_PUBLIC_MOCK_MODE

View on GitHub