Skip to content

Latest commit

 

History

417 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

LifelogBB

Dotnet Workflow CodeQL Workflow

Lifelog - All your life related things in one place. Journal, weight, Strength training, endurance training tracker, Bucket list, Vision board, ....

This service is build for a single user. Password authentication is included for the sites and API endpoints.

All data is stored in a single SQLite database for full control and portability over the data.

Features

  • 🦄 Free open source software
  • ⚖️ Weight tracking
  • 📔 Journal
  • 🏋️ Strength training tracker
  • 🏃 Endurance training tracker
  • ✅ Todos
  • 🎯 Goals
  • 🚀 Habits
  • 🌄 Bucket list and Vision board
  • 📜 Quotes
  • 🛠️ RESTful API for all routes, Swagger UI
  • 📅 iCal feeds: Todo for Todos and Goals, Event for Habits (Time boxing/blocking), with configurable DISPLAY reminders
  • ⚙️ Settings
  • 🖼 Tabler UI
  • 🤖 MCP Server and optional OpenAI compatible Chat (supports local LLMs)

TODO

Technical

  • 📦 Self hosting
  • 🔐 Authentication
  • 📂 SQLite database

Screenshots

Start Dashboard Weight Bucket List Vision Board

More screenshots

Run from docker

Clone the repository and run docker.

git clone https://github.com/spech66/lifelogbb.git
cd lifelogbb

Set database path to "/database" in the appsettings.

cd LifelogBb
docker build . -t lifelogbb
docker run -v lifelogbbdatabase:/database -p 80:80 -p 443:443 lifelogbb

Build and run from source

  • Install dotnet SDK
  • Install dotnet-ef for migrations dotnet tool install --global dotnet-ef
  • Checkout code (see below) or download the latest release
  • Adjust appsettings.Production.json to your needs
  • Create empty database file lifelogbb.db in the LifelogBb folder (or adjust appsettings.Production.json)
  • Create an empty file or use sqlite cli sqlite3 lifelogbb.db "VACUUM;"
  • Run migrations (see below)
  • Run dotnet watch in the LifelogBb folder
git clone https://github.com/spech66/lifelogbb.git
cd lifelogbb
cd LifelogBb
dotnet watch

Migrate database

All migrations are bundled in the efbundle file. Run it with the --connection argument. For Windows the efbundle is called efbundle.exe.

# Install dotnet-ef
dotnet tool install --global dotnet-ef | echo "already installed"

# Run efbundle
./efbundle --connection "Data Source=lifelogbb.db"

Dependencies

  • .NET - .NET is a free, cross-platform, open source developer platform for building many different types of applications.
  • SQLite - SQLite is a C-language library that implements a small, fast, self-contained, high-reliability, full-featured, SQL database engine. SQLite is the most used database engine in the world.

Helpful tools

Configuration examples

appsettings.production.json

{
    "Logging": {
        "LogLevel": {
            "Default": "Information",
            "Microsoft.AspNetCore": "Warning"
        }
    },
    "Account": {
        "Password": "xxxx" // Generate on first run in the password dialog
    },
    "Database": {
        "Path": "/opt/lifelogbb/"
    },
    "Uploads": {
        "Path": "/opt/lifelogbb/uploads/"
    },
    "Authentication": {
        "Cookie": {
            "ExpireDays": "30"
        },
        "JwtToken": {
            "Issuer": "https://localhost:6067/",
            "Audience": "https://localhost:6067/",
            "SigningKey": "xxxxxxxx", // Generate e.g. openssl genrsa -out ./jwt.key 4096
            "TokenTimeoutMinutes": "60"
        }
    },
    "Kestrel": {
        "Endpoints": {
            "Http": {
                "Url": "http://localhost:6066"
            }
        }
    }
}

nginx

server {
    listen 443 ssl http2;
    listen       [::]:443 ssl http2;

    server_name lifelog.example.org;

    index index.html index.htm;

    ssl_certificate /etc/letsencrypt/live/lifelog.example.org/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/lifelog.example.org/privkey.pem;
    ssl_session_timeout 1d;
    ssl_session_cache shared:MozSSL:10m;  # about 40000 sessions
    ssl_session_tickets off;
    ssl_dhparam /etc/ssl/dhparam.pem;

    # intermediate configuration
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
    ssl_prefer_server_ciphers off;

    location / {
            proxy_pass http://localhost:6066; # Port of your appsettings
            proxy_http_version 1.1;
            proxy_set_header   Upgrade $http_upgrade;
            proxy_set_header   Connection keep-alive;
            proxy_set_header   Host $host;
            proxy_cache_bypass $http_upgrade;
            proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header   X-Forwarded-Proto $scheme;
    }
}

Service file

Assuming a release is installed in /var/www/lifelogbb and the www-data user has write access to the database. For enhanced security you can create a dedicated user for the service.

[Unit]
Description=LifelogBbDeamon

[Service]
WorkingDirectory=/var/www/lifelogbb
ExecStart=/usr/bin/dotnet /var/www/lifelogbb/LifelogBb.dll
Restart=always
# Restart service after 10 seconds if the dotnet service crashes:
RestartSec=10
KillSignal=SIGINT
SyslogIdentifier=dotnet-lifelogbb
User=www-data
Environment=ASPNETCORE_ENVIRONMENT=Production
Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false

[Install]
WantedBy=multi-user.target

MCP Server

LifelogBB exposes a built-in Model Context Protocol (MCP) server that lets AI assistants (e.g. Claude, GitHub Copilot, Cursor) read and interact with your life-log data directly.

The MCP endpoint is available at /mcp and accepts a Bearer token in the Authorization header. Two kinds of token work:

  • MCP token (recommended). Set a long random value under Config → Chat / AI → MCP Token. It does not expire, so MCP clients keep working without re-authenticating. Leave the field empty to disable this and allow JWT tokens only.
  • JWT token. Generate one via the Swagger UI (/Swagger/) using POST /api/authentication with your configured password. It expires after Authentication:JwtToken:TokenTimeoutMinutes (60 minutes by default).

Example MCP configuration (Claude Desktop / mcp.json)

{
  "mcpServers": {
    "lifelogbb": {
      "type": "http",
      "url": "https://your-lifelogbb-host/mcp",
      "headers": {
        "Authorization": "Bearer <your-mcp-token>"
      }
    }
  }
}

Replace https://your-lifelogbb-host with the URL of your LifelogBB instance and <your-mcp-token> with the token from the config page.

The MCP token grants full read and write access to all of your life-log data and never expires. Only use it over HTTPS and treat it like a password.

Filtering, sorting and limiting results

Every area (weights, journals, todos, goals, habits, quotes, strength and endurance trainings) offers GetAll, Create, Update and Delete tools. The GetAll tools take three optional parameters, which are also available on the REST API as the filter, sort and limit query parameters.

Parameter Description
filter A JSON filter expression restricting which entries are returned.
sort Field to sort by. Append _desc for descending order, e.g. CreatedAt_desc. An unknown field is rejected instead of being ignored.
limit Maximum number of entries to return. Must be at least 1.

Whenever one of these parameters is used the results are sorted, so a limit returns a predictable set. Without an explicit sort the newest entries come first — by CreatedAt for most areas, and by the journal Date for journals, since that is the day an entry is about rather than the day it was written. Combining sort and limit is the way to ask for the latest entries, for example limit 1 for the current weight or the last workout, instead of fetching an entire area.

The filter expression is a group of conditions, optionally nested via groups:

{
  "operator": "And",
  "conditions": [
    { "field": "BodyWeight", "operator": "GreaterThan", "value": "80" }
  ]
}

operator on the group is And or Or. A condition supports Equal, NotEqual, GreaterThan, GreaterThanOrEqual, LessThan, LessThanOrEqual, Contains, NotContains, In and NotIn.

The same options on the REST API:

curl -H "Authorization: Bearer <your-token>" \
  "https://your-lifelogbb-host/api/weights?sort=CreatedAt_desc&limit=1"

Development

Clone the repository and either install Visual Studio or just the dotnet tools.

Run it by pressing F5 in Visual Studio or using the dotnet cli.

git clone https://github.com/spech66/lifelogbb.git
cd lifelogbb
cd LifelogBb
dotnet watch

Swagger UI at https://localhost:7290/Swagger/.

Generate database migrations using Add-Migration NAME.

Apply migrations using Update-Database.

Additional resources

AI Disclaimer: The entire codebase up to April 2026 - including the overall architecture, design decisions, and implementation - was written by humans. Future features and refactorings may be assisted by LLMs (e.g. GitHub Copilot); however, all changes are reviewed and approved by the project owner before being merged.

About

Lifelog - All your life related things in one place.

Topics

Resources

Stars

48 stars

Watchers

1 watching

Forks

Releases

Sponsor this project

Packages

Used by

Contributors

Languages