tocry
is a simple, self-hosted Kanban-style TODO application. It's designed
to be a straightforward tool for managing tasks across different stages or
categories. The name comes from the eternal question every developer faces
when looking at their task list: "Are you going ToDo or ToCry?"
- Kanban Board: Organize notes into customizable lanes.
- Drag & Drop: Easily move notes between lanes and reorder lanes themselves
- Mobile-Optimized: Full touch support with mobile-specific drag-and-drop
- Rich Text Notes: Write notes in Markdown, with a comfortable WYSIWYG editor
- Priority Labels: Set High, Medium, or Low priority on tasks with visual indicators
- Date Support: Add start and end dates to tasks, only shown when expanded
- File Attachments: Upload and attach files to notes with drag & drop support
- Inline Editing: Quickly rename lanes by clicking on their titles
- Live Search: Instantly filter all notes by title, content, or tags
- Collapsible Notes: Collapse notes with content to keep your board tidy
- Light & Dark Modes: Switch between themes for your viewing comfort
- Mobile-First Design: Responsive interface with dedicated mobile menu and controls
- Per-Board Color Schemes: Choose between 20 color schemes, saved per board
- Auto-Scroll on Mobile: Automatically scroll when dragging notes to screen edges
- Image Uploading: Just paste an image and it's uploaded and linked
- Easy Installation: One-line install script with system-wide and user options
The easiest way to install ToCry is using the automated installation script:
curl -sSL https://tocry.ralsina.me/install.sh | sudo bash
This will:
- Automatically detect your system architecture (AMD64/ARM64)
- Download the latest binary
- Install system-wide or in your user directory
- Set up data directories and systemd service (if run as root)
For more options, see the Installation Script Documentation.
This project is built with the Crystal programming language.
-
Clone the repository:
git clone https://github.com/ralsina/tocry.git cd tocry
-
Install Crystal dependencies:
shards install
-
Build the application for production:
shards build --release
-
Run the server:
./bin/tocry
-
Open your browser and navigate to
http://localhost:3000
.
tocry
supports three authentication modes, determined by environment variables set when the application starts. The modes are prioritized in the following order: Google OAuth, Basic Authentication, and then No Authentication.
-
Google OAuth (if you want multiple users)
-
Description: Users authenticate using their Google account. This mode provides a secure and user-friendly login experience.
-
How to Enable: Set the
GOOGLE_CLIENT_ID
andGOOGLE_CLIENT_SECRET
environment variables.- You'll need to create an OAuth 2.0 Client ID in the Google Cloud Console.
- Ensure your "Authorized redirect URI" is set to
http://localhost:3000/auth/google/callback
(adjust host/port if running on a different address).
-
Example:
export GOOGLE_CLIENT_ID="your_client_id" export GOOGLE_CLIENT_SECRET="your_client_secret" crystal run src/main.cr
-
-
Basic Authentication (If you just want a password)
-
Description: A simple username/password prompt is presented by the browser. All users share the same credentials. This mode is suitable for private deployments where Google OAuth is not desired.
-
How to Enable: Set the
TOCRY_AUTH_USER
andTOCRY_AUTH_PASS
environment variables. This mode will be used if Google OAuth variables are not set. -
Example:
export TOCRY_AUTH_USER="admin" export TOCRY_AUTH_PASS="your_secure_password" crystal run src/main.cr
-
-
No Authentication (Default, if it's just for you and it's not exposed)
-
Description: No login is required. Anyone can access the application. This is the default mode if neither Google OAuth nor Basic Authentication environment variables are set.
-
How to Enable: Do not set any of the authentication-related environment variables (
GOOGLE_CLIENT_ID
,GOOGLE_CLIENT_SECRET
,TOCRY_AUTH_USER
,TOCRY_AUTH_PASS
). -
Example:
crystal run src/main.cr
-
As an alternative to building from source, you can run tocry
using a Docker container.
Remember to set environment variables for authentication as needed, using the -e
flag
in the docker run
command.
-
Create a data directory: Create a directory on your host machine to store
tocry
's data. This is essential to ensure your data persists if the container is removed or updated.mkdir -p /path/to/your/data
-
Run the container: Run the container, making sure to replace
/path/to/your/data
with the absolute path to the directory you just created.docker run -d --restart unless-stopped --name tocry -p 3000:3000 \ -v /path/to/your/data:/data ghcr.io/ralsina/tocry:latest
-d
: Runs the container in the background.--restart unless-stopped
: Ensures the container restarts automatically.--name tocry
: Gives the container a memorable name.-p 3000:3000
: Maps port 3000 on your machine to port 3000 in the container.-v /path/to/your/data:/data
: Mounts your local data directory into the container. This is crucial for data persistence.
Note: The image
ghcr.io/ralsina/tocry:latest
is foramd64
architectures. Anarm64
image is also available atghcr.io/ralsina/tocry-arm64:latest
.
- Open your browser and navigate to
http://localhost:3000
.
For an even simpler setup, you can use Docker Compose. Remember to set environment variables for authentication as needed, using the environment
section in the docker-compose.yml
file.
-
Create a
docker-compose.yml
file in your project directory with the following content (or use the one included in this repository):version: '3.8' services: tocry: image: ghcr.io/ralsina/tocry:latest # For arm64 architectures, use the following image instead: # image: ghcr.io/ralsina/tocry-arm64:latest container_name: tocry restart: unless-stopped ports: - "3000:3000" volumes: - ./data:/data
-
Run the application from the same directory as your compose file:
docker compose up -d
This will automatically create a
data
directory in the current folder to store persistent data.
Once the application is running, you can manage your tasks through the web interface:
- Add a Lane: Click the
+
button in the header to create a new column - Rename a Lane: Click directly on a lane's title, type the new name,
and press
Enter
or click away to save - Add a Note: Click the
+
button in a lane's header - Edit a Note: Double-click on a note card to open the full editor
- Move Items: Click and drag lanes or notes to reorder them
- Search: Use the search bar in the header to filter all visible notes
- Switch Theme: Use the 🌙/☀️ button to toggle between light and dark modes
- Change Color Scheme: Use the color scheme selector to customize the board's appearance
- Mobile Menu: Tap the menu button to access all controls in a mobile-optimized overlay
- Touch Drag & Drop: Long-press and drag notes between lanes with touch gestures
- Auto-Scroll: When dragging notes to screen edges, the board automatically scrolls to reveal adjacent lanes
- Color Schemes: Choose per-board color schemes that persist across sessions
- Responsive Controls: All desktop features are available in a touch-friendly interface
To run the application in development mode:
-
Follow steps 1 and 2 from the Installation section.
-
Run the development server:
crystal run src/tocry.cr
The server will start on http://localhost:3000
.
- Fork it
- Create your feature branch (
git checkout -b my-new-feature
) - Commit your changes (
git commit -am 'Add some feature'
) - Push to the branch (
git push origin my-new-feature
) - Create a new Pull Request
The installation script provides several options for customizing your installation:
# Install with default settings (system-wide)
curl -sSL https://tocry.ralsina.me/install.sh | sudo bash
# Install for current user only (no sudo needed)
curl -sSL https://tocry.ralsina.me/install.sh | bash
# Show help
curl -sSL https://tocry.ralsina.me/install.sh | bash -s -- --help
# Install to custom location
INSTALL_DIR=$HOME/.local/bin curl -sSL https://tocry.ralsina.me/install.sh | bash
# Use custom data directory
DATA_DIR=$HOME/.local/share/tocry curl -sSL https://tocry.ralsina.me/install.sh | bash
# Combine both
INSTALL_DIR=$HOME/.local/bin DATA_DIR=$HOME/.local/share/tocry curl -sSL https://tocry.ralsina.me/install.sh | bash
# Uninstall ToCry
curl -sSL https://tocry.ralsina.me/install.sh | bash -s -- --uninstall
INSTALL_DIR
: Installation directory (default:/usr/local/bin
)DATA_DIR
: Data directory (default:/opt/tocry
)SERVICE_USER
: System service user (default:tocry
)
- Roberto Alsina - creator and maintainer