jay pscot library jpl

jpl · jay pscot library

Publish your writing
as a living library.

A self-hosted, tag-driven library for authors — books, novellas, short stories, and articles organized by ideas rather than shelves. One catalog, prepared views, reader-controlled refinement by tag, author, and series — and a Librarian's desk behind it. Framework-free PHP + SQLite; no Composer, no Node, no build step.

$ curl -O https://smisco.biz/jpl/jpl.zip
PHP 8.2+ SQLite zero frameworks self-hosted MIT
The library at pscot.com — the public face of the app, with prepared views and tag filters over a catalog of works

the proof

It runs its author's own catalog.

pscot.com is not a demo rig — it is this library, live, serving Jay Pscot's books, stories, and articles to readers. Every screenshot on this page is that instance, doing its day job.

pscot.com

the reader's side

Start with a view. Refine the results.

Prepared views are starting points, not silos. Tags, authors, and series stack: every selection narrows the shelf, every removal widens it, and text search runs across titles, subtitles, summaries, author names, and series names. Refinements survive a change of view, update without a page reload, and live in the URL — so any shelf a reader builds is a link they can send, one click away beside the results heading.

The filter panel with the New Releases prepared view active and tag, author, and series controls
Prepared views — one click sets the shelf.
An author and a series selected together, shown as removable chips under Selected filters
Authors and series — cumulative, removable, and one Copy URL from shared.
A selected tag narrowing results, with the grouped tag directory open
Tags — grouped by format, genre, and subject; the reader is the cataloger.
A work's own page with cover, byline, series line, and a formatted description summary
A work's page — cover, byline, series, formatted summary.

behind the desk

Every library needs a Librarian.

The admin side lives at /desk and speaks library. The Circulation Desk is the dashboard: catalog totals, authors, series, tags, views, visitors, Reads, Previews, Downloads, and Amazon hits — all first-party, no third-party analytics. Authors and series are records, not free text: each has its own page, and selecting a row lists every catalog entry filed under it. The catalog itself filters by author, series, and status, or searches across all of them. Entries carry covers, grouped tags with quick-add, a formatted summary, and two files: the public document — the exact, complete file visitors receive (PDF, EPUB, Markdown, HTML, Word, and more, up to 50 MB) — and an optional Librarian-only file of any type that never gets a public route. Per work, the Librarian decides what visitors may do: open the public document (labeled Preview or Read), download it, or follow an Amazon link — each independent.

The Circulation Desk dashboard with catalog, author, series, tag, visitor, and activity totals
The Circulation Desk — the library's day at a glance.
The catalog list, with public and Librarian-only View and Download links in each entry's file-access column
The catalog — filterable, with both files a click away.
The Series manager with a series row selected, listing the catalog entries assigned to it
Series — select a row to see everything filed under it.
A catalog entry's description summary with its allowed-formatting rules, above the author and series assignments
A catalog entry — summary markup, authors, series.
The public document upload, the open and download permissions with the Preview-or-Read choice, and the Librarian-only private attachment
Files and permissions — the public document, how it opens, and a private attachment.
The prepared views manager composing the public starting points
Prepared views — compose the public starting points.

what you get

The whole library, in one zip.

Prepared views

Named starting points — New Releases, Short Stories, whatever fits the catalog — composed in the Librarian, one click for the reader.

Tag refinement

Grouped tags (format, genre, subject) with quick-add; every tag narrows, every removal widens.

Authors & series

First-class records, not free text. A work can belong to several of either; both filter the public library and both get their own Librarian page.

Shareable search

Tags, authors, series, and text search across titles, summaries, and names all live in the URL; a link icon and Copy URL beside the results hand over the exact shelf.

Librarian-only files

Each entry can carry a private attachment — a full manuscript, a review draft, any file type — stored outside the public site and opened only at the Desk.

Work pages

Covers front and back, subtitles, series, bylines, summaries — each work with its own page and slug.

Formatted summaries

A small, enforced subset of HTML — emphasis, quotes, rules, code. Attributes stripped, unknown tags removed, sanitized on save and on display.

Whole documents, own origin

Visitors get the exact file the author prepared, never trimmed, served from a separate reader host — so an HTML reader's scripts and saved settings work, and the Librarian's session stays out of reach.

Amazon linking

Commercial works link out to Amazon — independent of read and download permissions.

First-party analytics

Reads, previews, downloads, visitors — hashed visitor tokens, no IPs stored, nothing sent to third parties.

Private data, private

SQLite database, Librarian-only files, covers, and backups live outside the webroot; public documents sit behind a reader route that never exposes their storage paths.

Type scale & PWA

One setting sizes the whole library and desk, 80–140%. Installable as an app, with the library's own mark and colors.

requirements & install

PHP 8.2, SQLite, and three folders.

Requirements

  • PHP 8.2+ with pdo_sqlite, fileinfo, json
  • Apache with .htaccess support, or equivalent server rules
  • HTTPS on three hosts, each with its own site folder: the main site, a docs. subdomain for the isolated document reader, and a desk. subdomain that simply redirects to /desk/
  • Explicitly no Composer, PHP framework, JS framework, Node, build system, or database server

Private data (the SQLite database, Librarian-only files, covers, backups) lives beside — not inside — the webroot; public documents live in the reader host's own tree. The README covers the production layout, a fresh install, and the upgrade path; upgrades copy over the existing tree and leave the catalog, tags, authors, series, files, and analytics intact.

Install

# three site folders, HTTPS on each:
#   main  → the library + /desk/
#   docs. → the isolated document reader
#   desk. → a redirect to /desk/
# extracts to pscot-site/ — place it as the site tree:
$ php bin/install.php   # also sets up the reader host
$ php bin/check.php
# sign in at /desk/ and start cataloging

why it's free

It costs nothing. Tips are appreciated.

The Jay Pscot Library is free — the whole of it, MIT-licensed. There is no subscription, no paid tier holding features back, and no advertising. Download it and it is simply yours to run.

If it gives your writing a home, you can leave a tip. It is a thank-you for the tool, never an obligation — and it is always appreciated.

rendered live · from README.md

Straight from the zip.

The document below is the current distribution's own README — requirements, the upgrade path, and what changed in this release — fetched and rendered in your browser by md-mini.js — a sibling smisco tool. The zip also ships RELEASE.md and DESIGN.md alongside it.

Loading the documentation…