Zotter is a note-taking app that syncs with Zotero. It is designed to run on a homebrew e-paper typewriter, or a cyberdeck, or any device that you can take into a library and take notes on without getting distracted by a web browser.
.zzzz.__ / c ^ _`; | .--' \ ( / -.\ / . \ / \ | ; `-. `. | /`'.`. | | \ \ | __| `' ; / \ ,' | zotter v1 (_`'---._ /--, `'---._`'---..__ by sid `''''--, ) _.-'`,` ````
Zotter is written in Python. It uses Zotero Web API's POST
and PATCH
function to upload notes directly to Zotero as JSON objects. It also retains local copies of the notes.
Here is the project structure:
/
├── config.json # Your Zotero credentials (API key & user ID)
├── otter.txt # Otter ASCII splash art logo
zotter/
├── __init__.py # Marks the directory as a Python package
├── __main__.py # Entry point: python3 -m zotter
├── controller.py # App flow controller: manages screen transitions and note state
├── config.py # Loads Zotero API key, user ID from config.json
├── state.py # Global state: current_note, cursor position, sync status
├── sync.py # Handles syncing current_note to Zotero via Web API
├── log.py # Simple logging to zotter.log
├── ui.py # Renders splash screen and shared UI logic
├── editor.py # Handles the note editing interface
├── browser.py # Displays and manages local/synced notes
├── config.json # User-specific config (not committed to repo)
├── zotter.log # Log file (created at runtime)
└── otter.txt # Optional ASCII splash art (fallbacks to simple message)
DEPENDENCIES
The only dependency is python3
as the project's UI is built using curses
and it uses standard keyboard input sys.stdin
If you are using a custom keyboard, run QMK firmware and it should work.
SUGGESTED HARDWARE
Raspberry Pi Zero 2W
Waveshare 3.5" IPS Touch Screen for Raspberry Pi GPIO/SPI
Waveshare 4.2" e-Paper Display (in-progress)*
*The problem with curses
is that a text-based UI cannot draw on most of e-paper displays as they use framebuffer
and raw pixel data. A translation layer would need to be built that could efficiently render a command line application such as Zotter on e-paper displays. Drawing a low-level bytemap is impractical as we need partial refresh support to avoid artifacting on e-Paper displays.
Below are mock ups for a prototype product. It is a mechanical keyboard in which Zotter is built into a 'lift over and up' style transparent cover. A wireframe hinge is used for threading wires into the keyboard where there is space for the battery. Friction from the rubber gasket makes the device stay up without need for expensive hinges. A USB-C port is exposed at the back of the keyboard and when plugged the keyboard can be used with any device as a standard USB keyboard. Total cost of device can be as less as $75.

