Why Lagniappe?

Lagniappe is a private web app for individuals and small organizations that supports collaborative documents, files, structured records, contextual tasks, permissions, and search. It runs on App Engine in a Google Cloud project and connects to a Redis Cloud database, both controlled by the owner. Optional, user-invoked AI is limited to the invoking user’s existing permissions. I built Lagniappe for a few reasons:

So that’s what I built. Lagniappe is suitable for individuals and small groups who want to own their stuff and are comfortable with being responsible for the infrastructure it is built on. It is installed into cloud resources that you own and that is it — you are the only one who can upgrade it, there’s no Lagniappe control plane. It is well-tested and reliable — Google Cloud itself is very solid, and the software is built with vanilla JS and a Python backend, very old-fashioned and very boring. The browser communicates directly to the server, there are no externally hosted dependencies that can change and break things or introduce new security holes. Once it’s installed it should continue to function exactly as installed unless you change it on purpose, barring breaking API changes (unlikely) or zombie apocalypse.

The default installation scales to zero (meaning you’re only charged for the server when it is running and you’re using it), the only other service required besides GCP is Redis Cloud (which has a free tier), and every use of AI has to be explicitly invoked by a user, whose AI access can be controlled by the site owner. This means a basic installation, even if you invite a lot of people, can be surprisingly inexpensive — there’s no per-seat licensing or additional cost attached to adding a user beyond the ordinary usage-based cost of running the app.

The name comes from “lagniappe,” a Creole word meaning a little something extra. One odd fact of modern life is that a single Google account has access to the kind of computing infrastructure that was barely even a fantasy 20 years ago. Lagniappe is the extra bit that turns that infrastructure into something usable: a small private system you control, invite people into, search across, export, restrict, and adapt to your own pattern.

I built a bunch of examples to show off a small part of what Lagniappe is capable of, described below. The website you’re reading this on is an instance of Lagniappe, so you’ll have to login to view them, but I won’t email you unless you explicitly ask me to — if you do give permission, I may build a mailing list to notify people of updates at some point. Everything is read-only (except for your personal page, so you can create tasks and try out the editor). You can read more about Lagniappe’s capabilities here, and if you really want to give Lagniappe a spin the only way to do so is to install it, it generally takes about ten to thirty minutes depending on your experience, and it doesn’t create anything that can’t be deleted in a couple of clicks.

Each example below is a link that will redirect you to the demo after you’ve logged in.

Examples

You have a contact list, and you’d like to keep track of things like gifts and networking chat history. These examples show how task history works — when a completed task is reset for the next cycle, Lagniappe snapshots the completed fields, files, linked pages, and who completed it into task history.

You want to keep track of books you’ve read or want to read. While most of these are books I love in real life, a few of them are also AI-generated recommendations — you can generate pages rather than create them yourself, and the AI will be given access to information about the category itself and the pages in it, enabling it to create suggestions tied to your taste. So I can save a filter of my favorite thrillers, and generate some ideas for books I might like to read based on those.

You run a music website, as I do in real life. Mine is called Shfl. You need to manage writers, newsletters, pitches, compliance, taxes, etc. This demo data closely mirrors how I actually run Shfl, and the need to keep all these ducks in a row was part of the inspiration for Lagniappe. The ability to set arbitrary filters on both tasks and other aspects of the site and return to them is super helpful. This example also shows how tasks are automatically linked to pages they concern — this means that the task for this article, just by adding the writer and the relevant pitch to its form, will also show up on those pages — and Jon, if he has a user account and access to the newsletter page, can track the progress of the article in a read-only view. If I’d assigned the task to Jon, on the other hand, he’d be able to edit the task and complete it from his page, regardless of whether he could see the newsletter page it lives on.

You’re a sophomore in college, and you’re researching internship opportunities. Here’s a page that shows what that might look like for a particular company, including stages of the project, files attached to tasks, notes, etc.

You run a nonprofit that places pets with new owners. You need to collect forms with signatures, and have multi-step tasks that use forms with required fields and status messages. Potential adopters can be added as users and given permission to view the adoptable pets category, and they can be assigned tasks like signing an adoption agreement, while employees of the agency can be assigned tasks like reviewing the adopter application which, while they still live on the adopter page, are restricted and only able to be viewed by members of an employee user group. Since internal links on forms make tasks visible on those pages as well, the pet pages also contain the tasks that concern them. Form restrictions make it easy to have one page that contains tasks that are only viewable by the relevant group, so records of follow-up visits are restricted to employees but meet & greet records can be viewed by both adopters and employees.

You have a software project (like this one) and you want to keep track of bugs and improvements you’d like to make. Most of the demo data is synthetic, but this one is real — I use this demo instance of Lagniappe to track its development. This doesn’t replace Jira but it works for me.

You have a recipe list. I personally like my recipes organized in a certain way, I often transcribe them from where I found them into my format and then I’ve got all my little additions and modifications too you know, so I made a form out of that. Now I can drop a recipe I found on the internet, or a photo of a recipe from a book or a handwritten note, into the app and I get a nice transcription all formatted properly. These particular recipes are genuinely personal favorites of mine, I have to thank Kenji López-Alt particularly here because two of them are his, and those potatoes I make every Thanksgiving. Worth noting that you can sort by anything you put in a form, like in this one I can sort by ‘soup’ and there’s the fish soup I make for Sunday dinner once a month or so.

You’re the DM for a tabletop RPG. You have a central category for your game, and your players have read access. You also have a campaign planning project and related pages in there that you can restrict the visibility of — in this example you are able to see this planning page, but on your own instance you could restrict that page to you alone, which would also restrict every task attached to it, enabling you to share the campaign archive with players while keeping future planning private. And once the campaign was over, one click of the ‘restrict to site owner’ checkbox would make that page part of the permanent archive for everyone’s future reference.

You have a couple of cars, and you’d like to keep track of maintenance and repairs. You also have appliances, and you’d like to keep track of your warranty, user manuals, repairs, etc. When you attach a file to a page, you can also optionally have the text recognized in PDFs or images and add that text to the search index; you can also have AI summarize the file and add that summary to the index, which is generally more useful for long PDFs you might want to find later via keyword.

Your whole family goes to the doctor once in a while, and it’s nice to have those events summarized and saved. This example highlights a unique feature of forms on Lagniappe — you can have a status message automatically appear if certain conditions are met. This one has a status message triggered by noting that Caleb needs a refill. And again, these examples are a good example of the AI autofill — you can drop the after-visit summary onto the autofill area in the task, and whatever was important enough to you to put in the form automatically gets entered and becomes sortable and searchable.

Other Features

This demo is a shared public Lagniappe instance, so a few owner-level tools are locked down. CSV import, analytics, site settings, user/group permissions, site export, and saved global form changes are available when you install your own instance, but they are intentionally disabled here so one visitor cannot reshape the demo for everyone else. Here’s an overview of some of the other stuff the software can do.

CSV Import: if you have existing spreadsheets that correspond to either pages or tasks (books, logs, records), the CSV import wizard can generate schemas from column headers, map columns to form fields (including fuzzy matching), create task history, and match tasks and form fields to pages already in your Lagniappe instance.

Analytics: A lightweight owner-facing dashboard that ties page views with users you’ve allowed site access to.

Form Builder: You can click on any attached form in the demo and use the builder as a sandbox. Add fields, configure choices, test visibility rules, and preview the result. Saving is disabled in the public demo because saved forms affect shared example data, but the builder gives you a good feel for how customizable an installed Lagniappe instance can be. Forms can include tables, signatures, visibility rules, location fields with autocomplete, and more.

AI Integration: While AI features are disabled on this demo, AI is both integrated and ignorable on a live instance — AI can create or edit documents, pulling in task and page data from the page it lives on (for example, if you have a vacation page with travel tasks entered, the AI can use that data if you ask it questions about your destination), create forms, categories and whole multi-step projects, and a number of other convenience tasks like summarization and autofill where appropriate. Or you can entirely ignore it, and the app won’t bombard you with notifications about how AI-enabled it is.

AI can also handle files, analyzing them and turning them into a proposed set of workspace-native changes, such as pages, tasks, files, forms, or projects. You can do this in-app or, if email is configured, send files as attachments in an email. AI proposals always need to be reviewed and executed by a user, it will never modify your workspace on its own.

Export: On a live instance, Lagniappe’s data is backed up on a schedule and can both create point-in-time backups and be exported as an offline html archive, with links and files intact. It won’t look as nice and it won’t be interactive but it will be readable.

Permissions: The permissions structure is deep and powerful. You can create user groups with broad or narrow restrictions, as well as restrict pages and tasks based upon what form they use, and restrict specific pages within categories that might have broad viewership to a narrower group.

Collaboration & Sync: Documents support live collaborative editing, retain history, and show remote changes as they arrive. Structured forms use explicit saves instead: saved changes refresh other open views, while unsaved typing remains local and is protected for review if the record changes elsewhere. You can mention other users in documents as well as send direct messages, and the app can be configured to send email notifications based on this activity, as well as for AI job completions and task assignments.

Offline Usage: Previously viewed pages remain readable while the server is waking or the network is unavailable. Document edits and supported form submissions will be queued and replayed after reconnection, so you can continue using the app while offline; other actions are marked as unavailable and must wait until the server is reachable.

Public Document Sharing: Any page’s document can be made public to the web, that’s what you’re reading now. If you’ve logged in, you can see the page that hosts it here. Only document content and any images that may be present in that document become public, not the entire page, so they’re suitable for blog posts or anything you might want to share more widely while keeping the page itself governed by its own permission structure.

Search: Search is global and permissions-aware, encompassing form values, documents, descriptions, and names, and internal links are enabled in documents (that is why you see the links here color-coded) and forms, which enables quick linking to another page in a form and the auto-linking of tasks with any page that is linked to in that task’s form.