{"id":13621674,"url":"https://github.com/spech66/lifelogbb","last_synced_at":"2025-08-07T15:37:14.891Z","repository":{"id":61842410,"uuid":"548244899","full_name":"spech66/lifelogbb","owner":"spech66","description":"Lifelog - All your life related things in one place.","archived":false,"fork":false,"pushed_at":"2024-07-28T08:00:42.000Z","size":14116,"stargazers_count":6,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-04-15T01:39:38.373Z","etag":null,"topics":["fitness","journal","lifelog","lifelogging","self-improvement","sqlite","workout-tracker"],"latest_commit_sha":null,"homepage":"","language":"HTML","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/spech66.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"github":null,"patreon":null,"open_collective":null,"ko_fi":null,"tidelift":null,"community_bridge":null,"liberapay":null,"issuehunt":null,"otechie":null,"custom":"https://www.paypal.me/SPech/5"}},"created_at":"2022-10-09T07:08:16.000Z","updated_at":"2024-09-20T12:04:27.000Z","dependencies_parsed_at":"2024-08-01T21:54:17.096Z","dependency_job_id":null,"html_url":"https://github.com/spech66/lifelogbb","commit_stats":null,"previous_names":[],"tags_count":10,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/spech66%2Flifelogbb","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/spech66%2Flifelogbb/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/spech66%2Flifelogbb/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/spech66%2Flifelogbb/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/spech66","download_url":"https://codeload.github.com/spech66/lifelogbb/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":252819569,"owners_count":21809040,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["fitness","journal","lifelog","lifelogging","self-improvement","sqlite","workout-tracker"],"created_at":"2024-08-01T21:01:09.397Z","updated_at":"2025-05-07T05:24:35.280Z","avatar_url":"https://github.com/spech66.png","language":"HTML","funding_links":["https://www.paypal.me/SPech/5"],"categories":["HTML"],"sub_categories":[],"readme":"﻿# LifelogBB\n\n![Dotnet Workflow](https://github.com/spech66/lifelogbb/actions/workflows/dotnet.yml/badge.svg)\n![CodeQL Workflow](https://github.com/spech66/lifelogbb/actions/workflows/codeql.yml/badge.svg)\n\nLifelog - All your life related things in one place. **Journal, weight, Strength training, endurance training tracker, Bucket list, Vision board, ...**.\n\nThis service is build for a **single user**. **Password authentication** is included for the sites and API endpoints.\n\nAll **data** is stored in a single **SQLite database** for full control and portability over the data.\n\n## Features\n\n* 🦄 Free open source software\n* ⚖️ Weight tracking\n* 📔 Journal\n* 🏋️ Strength training tracker\n* 🏃 Endurance training tracker\n* ✅ Todos\n* 🎯 Goals\n* 🚀 Habits\n* 🌄 Bucket list and Vision board\n* 📜 Quotes\n* 🛠️ RESTful API for all routes, Swagger UI\n* 📅 iCal feeds: Todo for Todos and Goals, Event for Habits (Time boxing/blocking)\n* ⚙️ Settings\n* 🖼 [Tabler](https://tabler.io/) UI\n\n[TODO](https://github.com/spech66/lifelogbb/blob/main/TODO.md)\n\n## Technical\n\n* 📦 Self hosting\n* 🔐 Authentication\n* 📂 SQLite database\n\n## Screenshots\n\n[![Start](https://raw.githubusercontent.com/spech66/lifelogbb/main/_screenshots/s_001_start.png \"Start\")](https://raw.githubusercontent.com/spech66/lifelogbb/main/_screenshots/001_start.png)\n[![Dashboard](https://raw.githubusercontent.com/spech66/lifelogbb/main/_screenshots/s_002_dashboard.png \"Dashboard\")](https://raw.githubusercontent.com/spech66/lifelogbb/main/_screenshots/002_dashboard.png)\n[![Weight](https://raw.githubusercontent.com/spech66/lifelogbb/main/_screenshots/s_002_weight_01.png \"Weight\")](https://raw.githubusercontent.com/spech66/lifelogbb/main/_screenshots/002_weight_01.png)\n[![Bucket List Vision Board](https://raw.githubusercontent.com/spech66/lifelogbb/main/_screenshots/s_006_bucketlist_02.png \"Bucket List Vision Board\")](https://raw.githubusercontent.com/spech66/lifelogbb/main/_screenshots/006_bucketlist_02.png)\n\n[More screenshots](https://github.com/spech66/lifelogbb/tree/main/_screenshots)\n\n## Run from docker\n\nClone the repository and run docker.\n\n```sh\ngit clone https://github.com/spech66/lifelogbb.git\ncd lifelogbb\n```\n\nSet database path to `\"/database\"` in the `appsettings`.\n\n```sh\ncd LifelogBb\ndocker build . -t lifelogbb\ndocker run -v lifelogbbdatabase:/database -p 80:80 -p 443:443 lifelogbb\n```\n\n## Build and run from source\n\n* Install [dotnet](https://dotnet.microsoft.com/download) SDK 7.0 on [Linux](https://learn.microsoft.com/en-us/dotnet/core/install/linux?WT.mc_id=dotnet-35129-website) or [Windows](https://learn.microsoft.com/en-us/dotnet/core/install/windows?tabs=net70).\n* Install dotnet-ef for migrations `dotnet tool install --global dotnet-ef`\n* Checkout code (see below) or download the [latest release](https://github.com/spech66/lifelogbb/releases)\n* Adjust `appsettings.Production.json` to your needs\n* Create empty database file `lifelogbb.db` in the `LifelogBb` folder (or adjust `appsettings.Production.json`)\n * Create an empty file or use sqlite cli `sqlite3 lifelogbb.db \"VACUUM;\"`\n * Run migrations (see below)\n* Run `dotnet watch` in the `LifelogBb` folder\n\n```sh\ngit clone https://github.com/spech66/lifelogbb.git\ncd lifelogbb\ncd LifelogBb\ndotnet watch\n```\n\n## Migrate database\n\nAll migrations are bundled in the `efbundle` file. Run it with the `--connection` argument.\nFor Windows the `efbundle` is called `efbundle.exe`.\n\n```sh\n# Install dotnet-ef\ndotnet tool install --global dotnet-ef | echo \"already installed\"\n\n# Run efbundle\n./efbundle --connection \"Data Source=lifelogbb.db\"\n```\n\n## Dependencies\n\n* [.NET 7.0](https://dotnet.microsoft.com/en-us/) - .NET is a free, cross-platform, open source developer platform for building many different types of applications.\n* [SQLite](https://www.sqlite.org/index.html) - 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.\n\n## Helpful tools\n\n* [Postman](https://www.postman.com/) - Test/debug API.\n* [SQLite Browser](https://sqlitebrowser.org/) - DB Browser for SQLite.\n\n## Configuration examples\n\n### appsettings.production.json\n\n```json\n{\n    \"Logging\": {\n        \"LogLevel\": {\n            \"Default\": \"Information\",\n            \"Microsoft.AspNetCore\": \"Warning\"\n        }\n    },\n    \"Account\": {\n        \"Password\": \"xxxx\" // Generate on first run in the password dialog\n    },\n    \"Database\": {\n        \"Path\": \"/opt/lifelogbb/\"\n    },\n    \"Uploads\": {\n        \"Path\": \"/opt/lifelogbb/uploads/\"\n    },\n    \"Authentication\": {\n        \"Cookie\": {\n            \"ExpireDays\": \"30\"\n        },\n        \"JwtToken\": {\n            \"Issuer\": \"https://localhost:6067/\",\n            \"Audience\": \"https://localhost:6067/\",\n            \"SigningKey\": \"xxxxxxxx\", // Generate e.g. openssl genrsa -out ./jwt.key 4096\n            \"TokenTimeoutMinutes\": \"60\"\n        }\n    },\n    \"Kestrel\": {\n        \"Endpoints\": {\n            \"Http\": {\n                \"Url\": \"http://localhost:6066\"\n            }\n        }\n    }\n}\n```\n\n### nginx\n\n```\nserver {\n    listen 443 ssl http2;\n    listen       [::]:443 ssl http2;\n\n    server_name lifelog.example.org;\n\n    index index.html index.htm;\n\n    ssl_certificate /etc/letsencrypt/live/lifelog.example.org/fullchain.pem;\n    ssl_certificate_key /etc/letsencrypt/live/lifelog.example.org/privkey.pem;\n    ssl_session_timeout 1d;\n    ssl_session_cache shared:MozSSL:10m;  # about 40000 sessions\n    ssl_session_tickets off;\n    ssl_dhparam /etc/ssl/dhparam.pem;\n\n    # intermediate configuration\n    ssl_protocols TLSv1.2 TLSv1.3;\n    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;\n    ssl_prefer_server_ciphers off;\n\n    location / {\n            proxy_pass http://localhost:6066; # Port of your appsettings\n            proxy_http_version 1.1;\n            proxy_set_header   Upgrade $http_upgrade;\n            proxy_set_header   Connection keep-alive;\n            proxy_set_header   Host $host;\n            proxy_cache_bypass $http_upgrade;\n            proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;\n            proxy_set_header   X-Forwarded-Proto $scheme;\n    }\n}\n```\n\n### Service file\n\nAssuming a release is installed in `/var/www/lifelogbb` and the `www-data` user has write access to the database.\nFor enhanced security you can create a dedicated user for the service.\n\n```\n[Unit]\nDescription=LifelogBbDeamon\n\n[Service]\nWorkingDirectory=/var/www/lifelogbb\nExecStart=/usr/bin/dotnet /var/www/lifelogbb/LifelogBb.dll\nRestart=always\n# Restart service after 10 seconds if the dotnet service crashes:\nRestartSec=10\nKillSignal=SIGINT\nSyslogIdentifier=dotnet-lifelogbb\nUser=www-data\nEnvironment=ASPNETCORE_ENVIRONMENT=Production\nEnvironment=DOTNET_PRINT_TELEMETRY_MESSAGE=false\n\n[Install]\nWantedBy=multi-user.target\n```\n\n## Development\n\nClone the repository and either install [Visual Studio](https://visualstudio.microsoft.com/) or just the [dotnet tools](https://dotnet.microsoft.com/en-us/learn/aspnet/hello-world-tutorial/install).\n\nRun it by pressing F5 in Visual Studio or using the [dotnet cli](https://dotnet.microsoft.com/en-us/learn/aspnet/hello-world-tutorial/run).\n\n```sh\ngit clone https://github.com/spech66/lifelogbb.git\ncd lifelogbb\ncd LifelogBb\ndotnet watch\n```\n\nSwagger UI at `https://localhost:7290/Swagger/`.\n\nGenerate database migrations using `Add-Migration NAME`.\n\nApply migrations using `Update-Database`.\n\n## Additional resources\n\n* Hosting a [secure app](https://learn.microsoft.com/en-us/aspnet/core/security/docker-https?view=aspnetcore-6.0).\n* [Combining Bearer Token and Cookie Authentication in ASP.NET](https://weblog.west-wind.com/posts/2022/Mar/29/Combining-Bearer-Token-and-Cookie-Auth-in-ASPNET)\n* [Import a CSV File Into an SQLite Table](https://www.sqlitetutorial.net/sqlite-import-csv/) - Migrate from lifelogspd to LifelogBB\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fspech66%2Flifelogbb","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fspech66%2Flifelogbb","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fspech66%2Flifelogbb/lists"}