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.
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.
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.
The repository's own landing copy describes four steps. This is how far each one goes in the code today.
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
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)
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)
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)
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.
Upload audio files. The marketing copy says they are transcribed; no transcription code exists in the repository.
Source: components/uploads/FileUploaderUppy.vue
Video files are accepted by the uploader. Extracting audio or a transcript is not in the code.
Source: components/uploads/FileUploaderUppy.vue
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
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
Chapter edit, add, remove and reorder are in the planner store. No editing screen yet.
Source: stores/planner.ts
The export request accepts docx, epub, pdf and md. Nothing builds a file yet.
Source: types/index.ts (ExportRequestSchema)
Drawn in HTML and CSS from the app's own structure. Illustrative: the names and numbers are invented, and these are not screenshots.
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
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/*
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
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.
It contributes a single page, studio, at the path /studio, with the navigation label “Podbook”.
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.
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
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
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).
| Part | Status | What the code does |
|---|---|---|
| Mock mode | available | The 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 service | available | Fake 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 client | prototype | A typed client for /auth, /me, /projects, /uploads, /rss, /planner, /previews and /exports. No server for it is in this repository. |
| Sign-in | prototype | In 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 upload | prototype | Real Uppy widget and limits; fake signed addresses in mock mode, so no file is stored. |
| RSS import | prototype | Real form and picker; the episode list is fixed sample data. |
| Transcription | planned | Promised by the marketing copy; no code. |
| Chapter planning | planned | Store and API call exist; the plan is a fixed list, not generated. |
| Plan editor screen | planned | Linked from the project page and the create flow, but the route has no page. |
| Export | planned | Schemas and mock jobs only; no document is built. |
| Canvas extension | unverified | Manifest 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/*
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.
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_URLNUXT_PUBLIC_COGNITO_DOMAINNUXT_PUBLIC_COGNITO_CLIENT_IDNUXT_PUBLIC_COGNITO_REDIRECT_URINUXT_PUBLIC_AWS_REGIONNUXT_PUBLIC_UPLOAD_BUCKETNUXT_PUBLIC_CLOUDFRONT_PUBLIC_URLNUXT_PUBLIC_MOCK_MODE