Giter Site home page Giter Site logo

matthiasn / lotti Goto Github PK

View Code? Open in Web Editor NEW
487.0 10.0 50.0 40.48 MB

Achieve your goals and keep your data private with Lotti. This life tracking app is designed to help you stay motivated and on track, all while keeping your personal information safe and secure. Now with on-device speech recognition.

License: GNU General Public License v3.0

Objective-C 0.01% Ruby 0.27% Makefile 0.27% Kotlin 0.01% Swift 0.51% Dart 96.90% CMake 0.73% C++ 1.17% C 0.07% Shell 0.07%
journal time-tracker flutter ios linux-app macos windows android-app fitness-app health speech-recognition speech-to-text

lotti's Introduction

Lotti

CodeFactor Flutter Test

Lotti helps you track habits, behavior, any data about yourself, in complete privacy.

Habits Tab

Read more on Substack.

New in 06/2023: Lotti can now transcribe audio recordings in 99 languages using whisper.cpp.

How to use Lotti

Check out the MANUAL. The images in there are updated automatically in CI using Fluttium.

Core beliefs / the WHY

Lotti is a tool for self-improvement centered around these core beliefs:

  1. Long-term outcomes in life can be improved by following good routines and establishing good habits, such as healthy sleep, mindfulness and improved self-awareness, healthy eating, enough physical activity and the like. Technology is essential when trying to establish and monitor good habits. Paper-based checklists are undesirable.
  2. Habits need to be monitored long-term. The 21-day habit theory, stating that it takes three weeks to form a new habit and then subsequently sticking with it automatically is questionable at best, and the only way to ensure that habits identified as important are actually followed is to monitor them.
  3. Any comprehensive attempt at tracking and monitoring the aforementioned areas of life will result in collecting far more data than anyone should be willing to share with anyone else.

Lotti is a tool for improving life via establishing good habits and monitoring their outcome. All collected data stays on your devices. Encrypted and entirely private synchronisation between your devices can be set up (instructions will follow).

Lotti currently supports recording the following data types:

  • Habits, which can be defined and tracked. Habit tracking then involves recording daily completions, which can be successes, failures, and also skipping the completion in case a habit could not be completed due to external circumstances.
  • Health-related data which can be imported automatically, such as steps, weight, sleep, blood pressure, resting heart rate, and whatever else can be recorded in Apple Health (or the Android equivalent).
  • Custom data types, such as the intake of water, food, alcohol, coffee, but also exercises such as pull-ups, you name (and define) it.
  • Text journal entries.
  • Tasks, with different statuses to track their lifecycle: open, groomed, in progress, blocked, on hold, done, rejected.
  • Audio recordings, as spoken journal entries, and also audio notes, for example when working on a task and documenting progress and doing a quick brain dump that can be useful when picking up a task again later.
  • Time, as in recording time spent on a tasks, and also a related story.
  • Tags for better organization and discoverability of journal entries.
  • Stories, a special tag type that is useful for reporting time spent on tasks related to their respective stories.
  • People, a special tag type with no additional functionality yet, only a different tag color.

Planned improvements:

  • Experiment/Intervention lifecycle. The app is already useful for monitoring experiments or interventions but those themselves currently remain implicit. For example, an experiment could be taking Vitamin D and see how that affects health parameters, or have a hypothesis what will happen, and then prove or disprove that, where a dashboard help monitor all relevant parameters. In future versions, the lifecycle of interventions shall be made explicit, by defining them in the first place, and then reviewing and refining them.
  • Better Reporting how time is spent.
  • Upfront planning of time budgets.

Please check out HISTORY.md for all the information on the project's history and back-story. You can find the previous version (written in Clojure and ClojureScript) in this repo: meins.

Principles

  • Lotti is private and does not share any information with anyone - see the Privacy Policy.
  • Lotti is open-source and everyone is encouraged to contribute, be it via contributing to code, providing feedback, testing, identifying bugs, etc.
  • Lotti strives to be as inclusive as possible and any request for improved accessibility will be addressed.
  • Lotti is supposed to become a friendly and welcoming community of people who are interested in data, improving their lives, and not or only very selectively sharing their data in the process. Please head over to Discussions and say Hi.
  • Localization. Lotti is multilingual and should be available in as many different languages as possible. English is the primary language, and there are French, German, and Romanian translations. Those need some update love, as the are many new UI labels that didn't exist when translations were last looked at. Please help, and also create issues and PRs for languages you would like to see. Thanks!

Beta testing

Lotti is currently available for beta testing for these platforms:

  • iOS and macOS versions are available via a Public Beta on TestFlight. Development is primarily done on macOS and both the iOS and macOS versions are in constant use by the author. You can expect Lotti to work on these two platforms.
  • The Android app is available as both aab and apk files on GitHub Releases. Both appeared to be working fine in some limited testing on both an Android phone and an Android tablet.
  • Windows there's an installer named lotti.msix in GitHub Releases. That's not signed though. There's also a (currently hidden) release on the Microsoft Store which appears to be working fine on Windows. However, some issues in the Microsoft Partner Center need to be resolved before making Lotti available on the Microsoft Store.
  • Linux: the simplest way to release would be on the Snap Store, with automatic updates, but that's blocked by this issue. There's a file named linux.x64.tar.gz GitHub Releases that contains the app. From limited testing, the app works fine on Linux, but is missing an app icon (could be a nice small PR).

The goal is to get Lotti out on all app stores in 2023.

Blog posts

Getting Started

  1. Install Flutter, see instructions.
  2. Clone repository and go to ./lotti
  3. Run flutter pub get
  4. Run make watch or make build_runner for code generation
  5. Open in your favorite IDE, e.g. Android Studio
  6. Run, either from the IDE or using e.g. flutter run -d macos

Platform-specific setup

Mac

Tested on macOS 13.3: no additional steps necessary. You only need to have Xcode installed.

Linux

Tested on Ubuntu 20.04.3 LTS inside a virtual machine on VMWare Fusion In addition to the common steps above, install missing dependencies:

$ sudo apt-get install libsecret-1-dev libjsoncpp-dev libjsoncpp1 libsecret-1-0 sqlite3 libsqlite3-dev
$ flutter packages get
$ make build_runner

In case the network in the virtual machine is not connecting after resuming: $ sudo dhclient ens33

Windows

If your system is set up to run the Flutter counter example app, you should be good to go.

Continuous Integration

This project uses Buildkite on macOS for releasing to TestFlight on iOS and macOS, and GitHub Actions for publishing to GitHub Releases for all other platforms.

Contributions

Contributions to this project are very welcome. How can you help?

  1. Please check under issues if there is anything specific that needs helping hands, or features to be discussed or implemented.
  2. Improve the test coverage (currently at around 71%). Any additional tests are welcome, including code changes to make the code easier to test.
  3. Create issues for feedback and ideas.
  4. Help translate into more languages, and improve the existing translations.

Thanks!

lotti's People

Contributors

alexmercerind avatar dependabot-preview[bot] avatar dependabot[bot] avatar ixici avatar matthiasn avatar thembabhebhe avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

lotti's Issues

Data Generator in Playground environment

When opening meo for the first time, I see an empty journal. That's boring. Instead, I want to have a playground that has a large number of entries for me to explore. I recently added this playground environment, but that one is also empty and boring at first.

In this issue, I would like to build a generator that creates a substantial amount of entries from a larger text that is in the public domain, such as War and Peace or the Autobiography of Benjamin Franklin. One paragraph could become one entry, and the whole piece of work spread over the past couple of months, in order. Together with hashtags and mentions, that could even be interesting to browse.

As part of this issue, it is enough to use a hardcoded text file, and simply trigger the creation from the menu. If useful, there could later be some user interface that can manage the playground, and create entries from different bodies of text.

Missing namespaces on build

I'm getting the following errors during build:

on both MacOS and Ubuntu in both the terminal running lein cljs-updater-dev and also in the terminal running lein cljs-renderer-dev, on following the build instructions:

Caused by: clojure.lang.ExceptionInfo: No such namespace: react, could not locate react.cljs, react.cljc, or JavaScript source providing "react" in file out/updater/reagent/impl/component.cljs

on both MacOS and Ubuntu in the terminal running lein cljs-main-dev I'm getting:

Caused by: clojure.lang.ExceptionInfo: No such namespace: electron, could not locate electron.cljs, electron.cljc, or JavaScript source providing "electron" in file /home/simon/workspace/meo/src/cljs/meo/electron/main/runtime.cljs

Note also that the README.md has, at line 50,

    $ lein cljs-main-dev
    $ lein cljs-renderer-dev
    $ then cljs-updater-dev

I'm very nearly certain that should be s/then/lein/

Potential Security Issue

👋 Hello, we've received a report for a potential high severity security issue in your repository.

Next Steps

1️⃣ Visit https://huntr.dev/bounties/1-other-matthiasn/meins for more advisory information.

2️⃣ Sign-up to validate or speak to the researcher for more assistance.

3️⃣ Propose a patch or outsource it to our community.


Confused or need more help?

  • Join us on our Discord and a member of our team will be happy to help! 🤗

  • Speak to a member of our team: @JamieSlome


This issue was automatically generated by huntr.dev - a bug bounty board for securing open source code.

Audio Playback improvements

Currently, there is a single audio player bloc, thus there can only be one active player showing. That was fine when audio could only be played back from the respective details page & before the linked entries list was introduced. Now however, there can be multiple players showing, each of which individually needs to be able to be paused, restarted etc. This will require some thought on where to handle this.

Update fails on mac

Update fails with this error logged in ~/Library/Caches/matthiasn.meo.ShipIt/ShipIt_stderr.log:

2018-02-09 11:40:50.984 ShipIt46712:585227 Installation error: Error Domain=NSPOSIXErrorDomain Code=13 "Permission denied" UserInfo={NSURL=file:///private/var/folders/pn/9gfn4y3j7c1d1c65jfng02mm0000gp/T/matthiasn.meo.ShipIt.tfdecL3C/meo.app/Contents/Resources/app/bin/zulu8-mac_x64/jre/LICENSE, NSLocalizedDescription=Permission denied, NSLocalizedFailureReason=Couldn't remove quarantine attribute from "/private/var/folders/pn/9gfn4y3j7c1d1c65jfng02mm0000gp/T/matthiasn.meo.ShipIt.tfdecL3C/meo.app/Contents/Resources/app/bin/zulu8-mac_x64/jre/LICENSE". This most likely means the file is read-only.}
2018-02-09 11:40:50.984 ShipIt46712:585227 ShipIt quitting
2018-02-09 11:40:51.025 ShipIt46718:585257 Resuming installation attempt 2
2018-02-09 11:40:53.527 ShipIt46718:585259 Installation error: Error Domain=NSPOSIXErrorDomain Code=13 "Permission denied" UserInfo={NSURL=file:///private/var/folders/pn/9gfn4y3j7c1d1c65jfng02mm0000gp/T/matthiasn.meo.ShipIt.ueah2OGw/meo.app/Contents/Resources/app/bin/zulu8-mac_x64/jre/LICENSE, NSLocalizedDescription=Permission denied, NSLocalizedFailureReason=Couldn't remove quarantine attribute from "/private/var/folders/pn/9gfn4y3j7c1d1c65jfng02mm0000gp/T/matthiasn.meo.ShipIt.ueah2OGw/meo.app/Contents/Resources/app/bin/zulu8-mac_x64/jre/LICENSE". This most likely means the file is read-only.}
2018-02-09 11:40:53.527 ShipIt46718:585259 ShipIt quitting
2018-02-09 11:40:53.561 ShipIt46719:585281 Resuming installation attempt 3
2018-02-09 11:40:55.994 ShipIt46719:585282 Installation error: Error Domain=NSPOSIXErrorDomain Code=13 "Permission denied" UserInfo={NSURL=file:///private/var/folders/pn/9gfn4y3j7c1d1c65jfng02mm0000gp/T/matthiasn.meo.ShipIt.WlJp10dX/meo.app/Contents/Resources/app/bin/zulu8-mac_x64/jre/LICENSE, NSLocalizedDescription=Permission denied, NSLocalizedFailureReason=Couldn't remove quarantine attribute from "/private/var/folders/pn/9gfn4y3j7c1d1c65jfng02mm0000gp/T/matthiasn.meo.ShipIt.WlJp10dX/meo.app/Contents/Resources/app/bin/zulu8-mac_x64/jre/LICENSE". This most likely means the file is read-only.}
2018-02-09 11:40:55.994 ShipIt46719:585282 ShipIt quitting
2018-02-09 11:40:56.027 ShipIt46720:585296 Too many attempts to install, aborting update
2018-02-09 11:40:56.067 ShipIt46720:585299 Application launched at file:///Applications/meo.app/
2018-02-09 11:40:56.067 ShipIt46720:585299 ShipIt quitting

Startup issue on Linux: no GUI window showing up

Hi, I followed the procedure in README to build the code from source, everything seemed to work fine (there might be few warning messages but I didn't pay much attention to them). Then I started meins, it output the following message and stopped there, with no GUI interface showing up:

$ ./target/jlink/bin/meins
22:02:27.413 [async-dispatch-5    ] INFO   o.eclipse.jetty.util.log - Logging initialized @6955ms to org.eclipse.jetty.util.log.Slf4jLog
22:02:27.625 [async-dispatch-5    ] INFO                   org.xnio - XNIO version 3.3.6.Final
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by org.xnio.nio.NioXnio$2 (file:/localdata/github/meins/target/jlink/meins.jar) to constructor sun.nio.ch.EPollSelectorProvider()
WARNING: Please consider reporting this to the maintainers of org.xnio.nio.NioXnio$2
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
22:02:27.702 [async-dispatch-5    ] INFO     o.p.wunderboss.web.Web - Registered web context /
22:02:27.709 [async-dispatch-5    ] INFO                 m.s.server - Immutant-web listening on port 8765 on interface localhost

I'm not sure what exactly those "illegal reflective access" warning messages meant or if they mattered. Accessing the web server running at localhost:8765 returns only a simple "hello world..." text.

Below are the process tree:

meins,83142 ./target/jlink/bin/meins
  `-java,83144 -jar ./target/jlink/bin/../meins.jar
      |-{java},83145
      |-{java},83146
      |-{java},83147
      |-{java},83148
      |-{java},83149
      |-{java},83150
      |-{java},83151
      |-{java},83152
      |-{java},83153
      |-{java},83154
      |-{java},83155
      |-{java},83156
      |-{java},83157
      |-{java},83158
      |-{java},83159
      |-{java},83160
      |-{java},83161
      |-{java},83171
      |-{java},83172
      |-{java},83173
      |-{java},83174
      |-{java},83175
      |-{java},83176
      |-{java},83177
      |-{java},83178
      |-{java},83179
      |-{java},83180
      |-{java},83181
      |-{java},83182
      |-{java},83183
      |-{java},83184
      `-{java},83185

Top or strace commands show that they are not doing anything interesting.

Any idea what went wrong? Thanks.

Alert user about unsaved changes

As reported on reddit

"For example, the right hand “add” button and its resulting half circle of options, have no tooltips and disappears if one hovers on an icon. Adding an entry isn’t saved (or prompted to) unless one knows to click on the small disk item in the editor."

This issue tracks the UX around saving entries. The add button UX is tracked in #1018.

make jlink failed

make jlink
failed with the following error message:
$ make jlink
Cleaning up...
Exception in thread "main" java.lang.ExceptionInInitializerError
at java.base/java.lang.Class.forName0(Native Method)
at java.base/java.lang.Class.forName(Class.java:374)
at clojure.lang.RT.classForName(RT.java:2168)
at clojure.lang.RT.classForName(RT.java:2177)
at clojure.lang.RT.loadClassForName(RT.java:2196)
at clojure.lang.RT.load(RT.java:443)
at clojure.lang.RT.load(RT.java:419)
at clojure.core$load$fn__5677.invoke(core.clj:5893)
at clojure.core$load.invokeStatic(core.clj:5892)
at clojure.core$load.doInvoke(core.clj:5876)
at clojure.lang.RestFn.invoke(RestFn.java:408)
at clojure.core__init.load(Unknown Source)
at clojure.core__init.(Unknown Source)
at java.base/java.lang.Class.forName0(Native Method)
at java.base/java.lang.Class.forName(Class.java:374)
at clojure.lang.RT.classForName(RT.java:2168)
at clojure.lang.RT.classForName(RT.java:2177)
at clojure.lang.RT.loadClassForName(RT.java:2196)
at clojure.lang.RT.load(RT.java:443)
at clojure.lang.RT.load(RT.java:419)
at clojure.lang.RT.doInit(RT.java:461)
at clojure.lang.RT.(RT.java:331)
at clojure.main.(main.java:20)
Caused by: java.lang.ClassNotFoundException: java/sql/Timestamp
at java.base/java.lang.Class.forName0(Native Method)
at java.base/java.lang.Class.forName(Class.java:374)
at clojure.lang.RT.classForName(RT.java:2168)
at clojure.lang.RT.classForNameNonLoading(RT.java:2181)
at clojure.instant$loading__5569__auto____6869.invoke(instant.clj:9)
at clojure.instant__init.load(Unknown Source)
at clojure.instant__init.(Unknown Source)
... 23 more
Makefile:78: recipe for target 'clean' failed
make: *** [clean] Error 1

I haven't figured out how to fix it.

It seems that the following provides some clue:
Caused by: java.lang.ClassNotFoundException: java/sql/Timestamp

It might be related to my environment missing some Java libraries? I by-passed the Java related installation in the make install-ubuntu.

Please provide help on how to install on Ubuntu

After I download the file meins-0.6.80.dmg
I tried and searched around, but could not figure out how to install the software.

I tried to mount it, but it seems that the file is compressed. I couldn't.

I tried to convert it to .img file by dmg2img, but I found that it would restore to a disk, looks too dangerous to do.

Custom field definition editor not working

I can search for for custom field definitions in the config view, but then the detail view does not show. There is some error on the console: Cannot read property 'toLowerCase' of null

Faster application startup

Application startup is getting slow when there are many entries, such as 110K in my case. The reason is that there is no database with a persisted index that can just quickly be thawed on application startup. Instead, there is a graph data structure that is used for storing and finding entries in memory. The reason is that the application should not have to keep a separate database process alive, made worse by supporting Mac, Linux, and Windows.

The entries are stored in a single writer append log. That way, nothing is ever overwritten but only new versions of entities appended when they are observed. The graph is then created as entries are inserted, where on application startup, the changes of the past are simply replayed. This mechanism works reasonably well once all past events have been replayed, but the startup phase is getting way too long, taking minutes in my case, especially since it is required on every application update.

I had frozen the entire application state using nippy before, but at around 100MB in file size and seconds to serialize and write, that was too expensive.

Reading the 250K lines (entry versions) for my 110K entries on startup and storing them in a simple map takes no more than 5 seconds, which is still acceptable as my Clojure on the JVM application takes longer to load itself. Now if I store entry versions in a map and not within the nodes in the graph, I should be able to serialize a much smaller data structure in substantially less time, making it feasible to save this to disk on every entry update, and thaw that on startup, plus the entries themselves. When querying for entries, they can just be taken from the map instead of from the node in the graph.

The serialized graph should contain a version number which can be compared with what's in the code, and then force a rebuilt when the data structure itself has changed.

Missing support for getLocalTimezone

Currently, getLocalTimezone is not supported by flutter_native_timezone on Linux, so the timezone name field stays empty.

This issue here can be resolved by removing the empty timezone workaround once the library supports Linux, or better yet, create a PR in the library to add support first. Also see this issue.

Rethink the queries for dashboard data

Currently, the queries for dashboard data fetch all days at once, going back 90 days from the current day. That works fine. However, with the scrolling mechanism introduced in v0.6.39, this becomes unwieldy as fetching and parsing all the data takes longer than a smooth scrolling experience would allow.

Instead, the data should be fetched by day so that what's there can be scrolled, and the missing data filled in as it arrives. On the backend, the stats-cache can be used, making it simple and fast to send more queries.

On the client, handling data from days that have multiple individual values needs to be concatenated for each day, e.g. with data from Healthkit where there are potentially multiple values per day, e.g. for heart rate variability or blood pressure.

logging to stdout

Previously, I merged my logging config with the timbre standard config, which takes care of logging to stdout. However, I was seeing ominous deadlocks and got them to disappear when removing logging to stdout. That is obviously not convenient during development though.

Has anyone seen anything similar before? I'd like to get the proper logging back, just this time without freezing the application. Thanks

Improve first-time use for measurements

Currently, when trying to capture a new measurement in the journal via the add icons, and none is defined yet, the page appears broken. Instead, the user should be prompted to create a first measurable instead.

Tried upgrading ClojureScript to 0.10.145 but ran into issues

Both when compiling the mobile and the main Electron application, I ran into different issues. Anyone wants to investigate? I did not capture the exact error messages and can't go back at this moment, but should be easy to reproduce by bumping up the ClojureScript version to the latest. Thanks

Full-text search broken

At some point, the full-text search broke and I am not quite sure where or how. In this ticket, the issue needs to be explored first, and then solved once there is more information.

delete doesn't work

When pressing the deletion button on an entry, nothing happens.

output dev console

/Applications/iWasWhere.app/Contents/Resources/app/prod/renderer/renderer.js:274 :search-refresh-fn
/Applications/iWasWhere.app/Contents/Resources/app/prod/renderer/renderer.js:274 WARN: UNDEFINED SPEC :state/search

Daily Log

{:timestamp 1510067339914, :deleted true}

Focus mode

One main focus of meins is to make task tracking better. I should see how I spend my time, and then make better decisions how to spend my time in the future. Tracking time enables this.

Recording time spent also documents the process, which becomes useful next time I encounter a related task, where any contemporary witness report is more useful than my memory alone, especially when some time has passed. For that, I need to put the current task in context, in two ways.

First, there are other tasks and entries that are directly linked. These should immediately be accessible and show a useful preview, and will likely be helpful while working on the task. Second, there is the story that the task belongs to. There is a good chance that other tasks and entries from the same story will be relevant in one way or another. Both together could be shown in a unified timeline to put the current task in context.

In a focus mode, this timeline could be placed between the running task on the left, the timeline in the middle, and the regular right tab, where clicking anything on the timeline makes the respective entry appear on the right side.

[Flutter Windows]: failure when creating MSIX installer

I'm trying to build and MSIX installer for Windows and I run into this issue:

flutter pub run msix:create
--
  | running "flutter build windows"...
  |  
  | Building with sound null safety
  |  
  | Building Windows application...
  |  
  | Unhandled exception:
  | CMake Error at flutter/generated_plugins.cmake:18 (add_subdirectory):
  | add_subdirectory given source
  | "flutter/ephemeral/.plugin_symlinks/connectivity_plus_windows/windows"
  | which is not an existing directory.
  | Call Stack (most recent call first):
  | CMakeLists.txt:51 (include)
  |  
  |  
  | CMake Error at flutter/generated_plugins.cmake:18 (add_subdirectory):
  | add_subdirectory given source
  | "flutter/ephemeral/.plugin_symlinks/flutter_secure_storage_windows/windows"
  | which is not an existing directory.
  | Call Stack (most recent call first):
  | CMakeLists.txt:51 (include)
  |  
  |  
  | CMake Error at flutter/generated_plugins.cmake:18 (add_subdirectory):
  | add_subdirectory given source
  | "flutter/ephemeral/.plugin_symlinks/hotkey_manager/windows" which is not an
  | existing directory.
  | Call Stack (most recent call first):
  | CMakeLists.txt:51 (include)
  |  
  |  
  | CMake Error at flutter/generated_plugins.cmake:18 (add_subdirectory):
  | add_subdirectory given source
  | "flutter/ephemeral/.plugin_symlinks/permission_handler_windows/windows"
  | which is not an existing directory.
  | Call Stack (most recent call first):
  | CMakeLists.txt:51 (include)
  |  
  |  
  | CMake Error at flutter/generated_plugins.cmake:18 (add_subdirectory):
  | add_subdirectory given source
  | "flutter/ephemeral/.plugin_symlinks/sqlite3_flutter_libs/windows" which is
  | not an existing directory.
  | Call Stack (most recent call first):
  | CMakeLists.txt:51 (include)
  |  
  |  
  | CMake Error at flutter/generated_plugins.cmake:18 (add_subdirectory):
  | add_subdirectory given source
  | "flutter/ephemeral/.plugin_symlinks/url_launcher_windows/windows" which is
  | not an existing directory.
  | Call Stack (most recent call first):
  | CMakeLists.txt:51 (include)
  |  
  |  
  | CMake Error at flutter/generated_plugins.cmake:18 (add_subdirectory):
  | add_subdirectory given source
  | "flutter/ephemeral/.plugin_symlinks/window_manager/windows" which is not an
  | existing directory.
  | Call Stack (most recent call first):
  | CMakeLists.txt:51 (include)
  |  
  |  
  | Unable to generate build files
  |  
  | #0      WindowsBuild.build (package:msix/src/windows_build.dart:32:7)
  | <asynchronous suspension>
  | #1      Msix._buildMsixFiles (package:msix/msix.dart:107:7)
  | <asynchronous suspension>
  | #2      Msix._createMsix (package:msix/msix.dart:101:5)
  | <asynchronous suspension>
  | #3      Msix.create (package:msix/msix.dart:71:5)
  | <asynchronous suspension>
  | #4      main (file:///c:/flutter/.pub-cache/hosted/pub.dartlang.org/msix-3.5.1/bin/create.dart:4:3)
  | <asynchronous suspension>
  | pub finished with exit code 255
  | 🚨 Error: The command exited with status 1
  | user command error: exit status 1

git commits per day in dashboard

I would like to see the number of git commits I have authored per day, which I find interesting all by itself, but even more so in comparison to other metrics. For that, first of all the git commits need to be tracked, for example by scanning directories that contain git repositories, and then parsing the log and importing the commits as journal entries in meo.

With those entries imported, the number of commits needs to be available in the stats, and finally plotted in the dashboard section.

Dashboards settings is blocking general settings

Scenario:

  • navigate to dashboards tab
  • tap the dashboards setting gear at top-right
  • try to tap the bottom-right settings tab - you don't go to general settings, you remain stuck in dashboards settings
    expected result: clicking the general settings tab will always load the general settings

"lein cljsbuild auto" and figwheel do not work for mobile

Currently, the only thing that works for building the mobile app is the lein prod-build task, see the rn-app directory.

I initially used re-natal as the template for the app, but with that, I could not get any kind of production build to work, ONLY Figwheel. All attempts to build a production build that would work without the laptop open failed with the metro-bundler timing out. Only having figwheel is fairly useless, as I obviously want to use any app on the go, especially if it's a geolocation based journal that you want to test. When running with figwheel, it would only work with the app and the laptop being on the same network.

So I found re-natal-husk and that works fine for the production build - thank you, @pesterhazy. But especially for UI work, it would be useful to have figwheel back, or at least be able to use lein cljsbuild auto to shorten the feedback cycle, because otherwise the full build with lein prod-build and then in XCode takes over 2 minutes, which is good for mini meditations but still quite annoying overall.

Any help here would be much appreciated. Ideally, both should work, but either of them would also help.

Here's what happens with the lein cljsbuild auto task:
image
First build works, but afterwards it does not find react. Those directories are there, though. Using ClojureScript 1.9.946. Just tried 1.10.145 but that always fails. Will create a separate issue for that.

Figwheel fails differently:
image
This does not find the buffer module, which is in node_modules and working fine in the production build. I have enable auto-require, see figwheel2.sh.

Please let me know if you have an idea how to fix this, or better yet submit a PR :) Thanks

Development on Windows

I just changed the location of the data in the development instance. Previously, it was under ./data, so in the repository folder itself, but then excluded from Git. However, this could lead to packaging the data folder, which I would find problematic if I used actual data.

As a solution for me, I now changed the location to /tmp/meo/data in , which works fine on Mac and Linux. However, I assume this would not work on Windows. Which directory should be used there? Also a nice and small PR for anyone who's on Windows, I'll help as much as I can.

Create screenshots from menu

Screenshots are a desktop functionality, and it would be useful to also be able to create screenshots from the desktop app menu, which is not currently implemented.

Editor draft restore issue

Recently, I added persisting editor state drafts to a database. That is now occasionally causing issues where the draft state is apparently not changed to saved status in the database, and the red disk/save icon does not go away. Needs investigation.

Geolocation support on Linux

Currently, it is not possible to detect the geolocation for a journal entry on Linux since that is not supported by the location library, see this issue.

In order to resolve this issue, there are multiple options:

  1. In order to avoid crashes, getting the location is not attempted on Linux. This needs changing once the library supports it.
  2. Create a PR in the aforementioned library to add support, and then resolve step 1.
  3. Change to a different library.

Android bundle fails after upgrade to Flutter 3.0.0

After upgrading to Flutter 3.0.0, the Android target fails to build with the following error.

> Task :flutter_health_fit:compileDebugKotlin FAILED
e: /usr/local/Caskroom/flutter/1.22.5/flutter/.pub-cache/git/flutter_health_fit-30102b653cdd2af64509edb4643e809e40139e7c/android/src/main/kotlin/com/metaflow/flutterhealthfit/FlutterHealthFitPlugin.kt: (42, 1): Class 'FlutterHealthFitPlugin' is not abstract and does not implement abstract member public abstract fun onRequestPermissionsResult(p0: Int, p1: Array<(out) String!>, p2: IntArray): Boolean defined in io.flutter.plugin.common.PluginRegistry.RequestPermissionsResultListener
e: /usr/local/Caskroom/flutter/1.22.5/flutter/.pub-cache/git/flutter_health_fit-30102b653cdd2af64509edb4643e809e40139e7c/android/src/main/kotlin/com/metaflow/flutterhealthfit/FlutterHealthFitPlugin.kt: (1068, 5): 'onRequestPermissionsResult' overrides nothing

Please help if you're knowledgable on the Android side of things.

[Flutter Linux]: Bundling for Snap Store not working

Bundling the Linux app as a Snap file and eventually publishing to the Snap Store would offer a far better user experience than publishing a tar file on GitHub Releases. However, I'm running into issues with CMake being too old. When bundling a Snap file, apparently the Flutter installation from the Flutter Snap is used, and that comes with an ancient version.

Also see:

Documentation on CLJ backend for an Electron app?

Thank you for this repo and the blog post. What's most interesting to me is how you have a Clojure backend within a Electron app. It doesn't sound like users have to set up a server running Clojure - this runs locally I thought. But Electron only has a node.js "backend". I looked through the code and the shell scripts and it wasn't obvious how you do this. Would you mind documenting what happens and how this is done? Thanks you

Improve add actions

As reported on reddit

"For example, the right hand “add” button and its resulting half circle of options, have no tooltips and disappears if one hovers on an icon. Adding an entry isn’t saved (or prompted to) unless one knows to click on the small disk item in the editor."

This issue tracks the add button UX. Saving entries is tracked in #1018.

TLS issue when using Gmail

When using imap.gmail.com for the sync mechanism via IMAP, I get an uncaught exception Error: self signed certificate.

However, checking the certificate with openssl doesn't look suspicious to me, but I'm also no expert:

$ openssl s_client -crlf -connect imap.gmail.com:993
CONNECTED(00000006)
depth=2 OU = GlobalSign Root CA - R2, O = GlobalSign, CN = GlobalSign
verify return:1
depth=1 C = US, O = Google Trust Services, CN = GTS CA 1O1
verify return:1
depth=0 C = US, ST = California, L = Mountain View, O = Google LLC, CN = imap.gmail.com
verify return:1
---
Certificate chain
 0 s:/C=US/ST=California/L=Mountain View/O=Google LLC/CN=imap.gmail.com
   i:/C=US/O=Google Trust Services/CN=GTS CA 1O1
 1 s:/C=US/O=Google Trust Services/CN=GTS CA 1O1
   i:/OU=GlobalSign Root CA - R2/O=GlobalSign/CN=GlobalSign
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIFiTCCBHGgAwIBAgIRAOyBLEo0a24AAgAAAABG0BMwDQYJKoZIhvcNAQELBQAw
[...]

For now, I have turned off this check when using Gmail by checking for the substring "gmail" in the server address and then deactivating the check in the connection's TLS options using rejectUnauthorized: false. That is obviously not a long-term solution. Until then, it's probably better to use services other than Gmail for the synchronization. I personally don't use it for this purpose anyway.

Has anyone seen and maybe even solved similar problems in the past? Help much appreciated, please point me in the right direction or help with debugging and/or fixing it. Thanks!

[Localization]: French

The purpose of this issue is to track the translation of Lotti into French until completed.

Improved Habit tracking

A habit is a recording of the intent to perform a certain action at certain intervals. Such an action can be doing certain exercises, filling out questionnaires, walking a certain number of steps per day, drinking more that x ml of water, or less than y of coffee. Or recording blood pressure, where a successful completion is recorded when measured for example twice per day, with at least one considered within normal range, and the diastolic average being less than 85mmHg, or whatever, any recordable thing and a set of rules that determine success.

Current state:
A habit entry is a normal entry that shows additional information when tagged with the #habit hashtag. The user can select the weekdays on which the habit will be shown, and there's a field for the date and time when the habit will become active. Furthermore, there are two checkboxes where the user can either mark the habit as done or as skipped. In either case, a new habit entry will be created, which will be shown on the next of the selected weekdays, plus the current one marked as completed. This is too much like a task, and creates too much redundant text in the system, which matters when you want an accurate wordcount for the journal as a whole.

Desired state:
Within meo, a habit entry is a special entry with additional fields that define the ruleset for the habit, the rhythm, rewards and penalties, and the like. Completions are recored in a comment-like completion entry, but only when manually completing the habit by clicking a checkbox or tapping a checkmark in the mobile app. For those completions that can be derived from other entries, such as with healthcare data, no additional entry shall be recorded or necessary.

The graph shall then be queryable for both actual completions and derived or virtual completions through a common interface that provides success, failure, or missing data, for any requested day. With this unified interface, it should be easy to build a dashboard that shows the successful completion of habits for the last n days, and thus motivating the user to keep the indicator green. This indicator could live in the top bar. Also, through something minimal like sparklines, it should be visible for each habit how successful the recent past was.

When the action is to fill out a questionnaire, there should be a mechanism to create a new entry as specified. For the questionnaires as defined, this could be a #perm-tag as that would not require any text.

Bring back local geocoder

There used to be a locally running geocoder, which I removed in 871b118 because it's been broken for some time. Generally, the idea to locally obtain country, county, city information might be useful for some users and can be tracked here.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.