getumbrel / umbrel-apps

The official app repository of the Umbrel App Store. Submit apps and updates here. Learn how → https://github.com/getumbrel/umbrel-apps#readme
https://apps.umbrel.com
481 stars 356 forks source link

App Submission: Maybe #1105

Closed CaptainCodeman closed 1 week ago

CaptainCodeman commented 1 month ago

App Submission

Maybe

Closes https://github.com/getumbrel/umbrel-apps/issues/1104

256x256 SVG icon

(Submit an icon with no rounded corners as it will be dynamically rounded with CSS. GitHub doesn't allow uploading SVGs directly, so please upload your icon to an alternate service, like https://svgur.com, and paste the link below.) We will help finalize this icon before the app goes live in the Umbrel App Store.

maybe

Gallery images

(Upload 3 to 5 high-quality gallery images (1440x900px) of your app in PNG format, or just upload 3 to 5 screenshots of your app and we'll help you design the gallery images.) We will help finalize these images before the app goes live in the Umbrel App Store.

maybe-screenshot-1

Screenshot 2024-05-24 at 2 07 15 PM

Screenshot 2024-05-24 at 2 06 55 PM

I have tested my app on:

CaptainCodeman commented 1 month ago

Question: the app needs a (free) API key for currency conversion - is there a way to prompt for that during install or make it a configurable option?

highghlow commented 1 month ago

Question: the app needs a (free) API key for currency conversion - is there a way to prompt for that during install or make it a configurable option?

As far as I know, no. The only way is to make it configurable through the app's settings (this feature is optional, so you can just leave it as is)

CaptainCodeman commented 1 month ago

Tested on Umbrel Home (used https://github.com/CaptainCodeman/umbrel-community-app-store, but fundamentally the same config).

CaptainCodeman commented 1 month ago

As far as I know, no. The only way is to make it configurable through the app's settings (this feature is optional, so you can just leave it as is)

Thanks, yeah most people probably won't need it and will just use their local currency that can be set in the app.

CaptainCodeman commented 1 month ago

The idea behind adding the env_file is to provide something to configure optional settings for "maybe", such as SYNTH_API_KEY. I set it to ${APP_DATA_DIR}/.env but maybe it should go in the data folder (?)

highghlow commented 1 month ago

but maybe it should go in the data folder (?)

You still can technically write to ${APP_DATA_DIR} directly and this could be used for configuration. The only problem is that a container restart would the required for the config to update (which I think isn't possible from inside the container)

CaptainCodeman commented 1 month ago

I think that's OK - I'd expect to have to restart the app to pick up the new config file setting, I just need to have the ability to set it somewhere.

CaptainCodeman commented 4 weeks ago

Thanks for the review - I'll make the updates requested.

nmfretz commented 2 weeks ago

Hi @CaptainCodeman, are you okay to make the requested changes? If you prefer I can take this one to the finish line, no problem at all.

The gallery assets are ready. Since the self-hosted version of Maybe doesn't really have any features at the moment (and is just available as a way for people to try a very early version of the app) we have only included screenshots of available features so people don't think they'll be able to connect their accounts. Here's a screen recording showing the limited feature set right now:

https://github.com/getumbrel/umbrel-apps/assets/85373263/bb360c94-35f3-4c94-829f-e5a74a03b7a0

Here's the assets: icon 1 2 3

CaptainCodeman commented 2 weeks ago

Yeah, apologies for the delay - got busy with other work. I'll get the updates completed tomorrow.

CaptainCodeman commented 2 weeks ago

Updated and re-tested with the emulator.

nmfretz commented 1 week ago

Yeah, apologies for the delay - got busy with other work. I'll get the updates completed tomorrow.

No worries at all!

I have made some changes to finalize Maybe and we are now going live to the app store 🎉. Thanks again for submitting this, and great work!


The main change I made was related to the .env file. In the current implementation of our apps framework, only a whitelisted selection of files/subdirectories get copied when a user updates an app:

https://github.com/getumbrel/umbrel/blob/5a3ecfd49bc2ed452820d656cd5b2e6cc7a6ed64/packages/umbreld/source/modules/apps/legacy-compat/app-script#L594-L595

This means that any changes we make to the .env file in this repo will not be copied over when a user updates the app. For example, say later down the line we want to add a new environment variable placeholder to the .env file. If we add this to the .env file here, it will not be copied over when a user updates the app.

To make this work with the current apps framework implementation I removed the committed .env file and instead added a pre-install hook that creates a .env with the following commented out lines:

$ cat ~/umbrel/app-data/maybe/.env
# Uncomment the SYNTH_API_KEY line and replace YOUR_SYNTH_API_KEY with your personal Synth API key
# SYNTH_API_KEY=YOUR_SYNTH_API_KEY

We can use this and other hooks in future app updates if needed to modify the .env file. Ideally though, Maybe will add the ability to input API keys through the UI 🤞

The other main change I made was to the app description. I added some wording about this being an early version of the app without a full feature set, so users aren't surprised after installing. The main image on Maybe's website shows a bunch of features that aren't available yet, but it's not readily clear that this is the case unless you find this on their GitHub:

image

I also added some instructions about multi-currency support.

image
CaptainCodeman commented 6 days ago

Thanks for merging plus all the detailed feedback, very useful.

I'll look at other PRs to get a feel for submitting version updates.

jbrauck-unchained commented 1 day ago

Hey y'all just downloaded bc I am excited to try it out. I did get an immediate error upon installation

Screenshot 2024-07-01 at 2 18 49 PM
web_1        | - Has the database name changed? Verify that config/database.yml contains the correct database name.
web_1        | 
web_1        |  ["/usr/local/bundle/ruby/3.3.0/bundler/gems/rails-5d34172ff44e/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb:63:in `rescue in new_client'", "/usr/local/bundle/ruby/3.3.0/bundler/gems/rails-5d34172ff44e/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb:57:in `new_client'", "/usr/local/bundle/ruby/3.3.0/bundler/gems/rails-5d34172ff44e/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb:982:in `connect'", "/usr/local/bundle/ruby/3.3.0/bundler/gems/rails-5d34172ff44e/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb:994:in `reconnect'", "/usr/local/bundle/ruby/3.3.0/bundler/gems/rails-5d34172ff44e/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb:655:in `block in reconnect!'", "/usr/local/bundle/ruby/3.3.0/bundler/gems/rails-5d34172ff44e/activesupport/lib/active_support/concurrency/null_lock.rb:9:in `synchronize'", "/usr/local/bundle/ruby/3.3.0/bundler/gems/rails-5d34172ff44e/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb:654:in `reconnect!'", "/usr/local/bundle/ruby/3.3.0/bundler/gems/rails-5d34172ff44e/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb:756:in `block in verify!'", "/usr/local/bundle/ruby/3.3.0/bundler/gems/rails-5d34172ff44e/activesupport/lib/active_support/concurrency/null_lock.rb:9:in `synchronize'", "/usr/local/bundle/ruby/3.3.0/bundler/gems/rails-5d34172ff44e/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb:747:in `verify!'", "/usr/local/bundle/ruby/3.3.0/bundler/gems/rails-5d34172ff44e/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb:764:in `connect!'", "/usr/local/bundle/ruby/3.3.0/bundler/gems/rails-5d34172ff44e/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb:970:in `block in with_raw_connection'", "/usr/local/bundle/ruby/3.3.0/bundler/gems/rails-5d34172ff44e/activesupport/lib/active_support/concurrency/null_lock.rb:9:in `synchronize'", "/usr/local/bundle/ruby/3.3.0/bundler/gems/rails-5d34172ff44e/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb:969:in `with_raw_connection'", "/usr/local/bundle/ruby/3.3.0/bundler/gems/rails-5d34172ff44e/activerecord/lib/active_record/connection_adapters/postgresql/quoting.rb:128:in `quote_string'", "/usr/local/bundle/ruby/3.3.0/bundler/gems/rails-5d34172ff44e/activerecord/lib/active_record/connection_adapters/abstract/quoting.rb:76:in `quote'", "/usr/local/bundle/ruby/3.3.0/bundler/gems/rails-5d34172ff44e/activerecord/lib/active_record/connection_adapters/postgresql/quoting.rb:122:in `quote'", "/usr/local/bundle/ruby/3.3.0/gems/good_job-3.29.3/lib/good_job/notifier.rb:258:in `with_connection'", "/usr/local/bundle/ruby/3.3.0/gems/good_job-3.29.3/lib/good_job/notifier.rb:201:in `block in create_listen_task'", "/usr/local/bundle/ruby/3.3.0/gems/concurrent-ruby-1.3.3/lib/concurrent-ruby/concurrent/executor/safe_task_executor.rb:24:in `block in execute'", "/usr/local/bundle/ruby/3.3.0/gems/concurrent-ruby-1.3.3/lib/concurrent-ruby/concurrent/synchronization/mutex_lockable_object.rb:48:in `block in synchronize'", "/usr/local/bundle/ruby/3.3.0/gems/concurrent-ruby-1.3.3/lib/concurrent-ruby/concurrent/synchronization/mutex_lockable_object.rb:48:in `synchronize'", "/usr/local/bundle/ruby/3.3.0/gems/concurrent-ruby-1.3.3/lib/concurrent-ruby/concurrent/synchronization/mutex_lockable_object.rb:48:in `synchronize'", "/usr/local/bundle/ruby/3.3.0/gems/concurrent-ruby-1.3.3/lib/concurrent-ruby/concurrent/executor/safe_task_executor.rb:22:in `execute'", "/usr/local/bundle/ruby/3.3.0/gems/concurrent-ruby-1.3.3/lib/concurrent-ruby/concurrent/ivar.rb:170:in `safe_execute'", "/usr/local/bundle/ruby/3.3.0/gems/concurrent-ruby-1.3.3/lib/concurrent-ruby/concurrent/scheduled_task.rb:298:in `process_task'", "/usr/local/bundle/ruby/3.3.0/gems/concurrent-ruby-1.3.3/lib/concurrent-ruby/concurrent/executor/timer_set.rb:166:in `block (2 levels) in process_tasks'", "/usr/local/bundle/ruby/3.3.0/gems/concurrent-ruby-1.3.3/lib/concurrent-ruby/concurrent/executor/ruby_thread_pool_executor.rb:359:in `run_task'", "/usr/local/bundle/ruby/3.3.0/gems/concurrent-ruby-1.3.3/lib/concurrent-ruby/concurrent/executor/ruby_thread_pool_executor.rb:350:in `block (3 levels) in create_worker'", "<internal:kernel>:187:in `loop'", "/usr/local/bundle/ruby/3.3.0/gems/concurrent-ruby-1.3.3/lib/concurrent-ruby/concurrent/executor/ruby_thread_pool_executor.rb:341:in `block (2 levels) in create_worker'", "/usr/local/bundle/ruby/3.3.0/gems/concurrent-ruby-1.3.3/lib/concurrent-ruby/concurrent/executor/ruby_thread_pool_executor.rb:340:in `catch'", "/usr/local/bundle/ruby/3.3.0/gems/concurrent-ruby-1.3.3/lib/concurrent-ruby/concurrent/executor/ruby_thread_pool_executor.rb:340:in `block in create_worker'"]
web_1        | I, [2024-07-01T18:17:22.254305 #1]  INFO -- : [GoodJob] Notifier subscribed with LISTEN
web_1        | I, [2024-07-01T18:17:22.274177 #1]  INFO -- : [GoodJob] Notifier unsubscribed with UNLISTEN
web_1        | E, [2024-07-01T18:17:22.274621 #1] ERROR -- : [GoodJob] Notifier errored: ActiveRecord::StatementInvalid: PG::UndefinedTable: ERROR:  relation "good_job_processes" does not exist
web_1        | LINE 10:  WHERE a.attrelid = '"good_job_processes"'::regclass
web_1        |                              ^
web_1        | 
web_1        |  ["/usr/local/bundle/ruby/3.3.0/bundler/gems/rails-5d34172ff44e/activerecord/lib/active_record/connection_adapters/postgresql/database_statements.rb:19:in `exec'", "/usr/local/bundle/ruby/3.3.0/bundler/gems/rails-5d34172ff44e/activerecord/lib/active_record/connection_adapters/postgresql/database_statements.rb:19:in `block (2 levels) in query'", "/usr/local/bundle/ruby/3.3.0/bundler/gems/rails-5d34172ff44e/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb:997:in `block in with_raw_connection'", "/usr/local/bundle/ruby/3.3.0/bundler/gems/rails-5d34172ff44e/activesupport/lib/active_support/concurrency/null_lock.rb:9:in `synchronize'", "/usr/local/bundle/ruby/3.3.0/bundler/gems/rails-5d34172ff44e/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb:969:in `with_raw_connection'", "/usr/local/bundle/ruby/3.3.0/bundler/gems/rails-5d34172ff44e/activerecord/lib/active_record/connection_adapters/postgresql/database_statements.rb:18:in `block in query'", "/usr/local/bundle/ruby/3.3.0/bundler/gems/rails-5d34172ff44e/activesupport/lib/active_support/notifications/instrumenter.rb:58:in `instrument'", "/usr/local/bundle/ruby/3.3.0/bundler/gems/rails-5d34172ff44e/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb:1112:in `log'", "/usr/local/bundle/ruby/3.3.0/bundler/gems/rails-5d34172ff44e/activerecord/lib/active_record/connection_adapters/postgresql/database_statements.rb:17:in `query'", "/usr/local/bundle/ruby/3.3.0/bundler/gems/rails-5d34172ff44e/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb:1078:in `column_definitions'", "/usr/local/bundle/ruby/3.3.0/bundler/gems/rails-5d34172ff44e/activerecord/lib/active_record/connection_adapters/abstract/schema_statements.rb:109:in `columns'", "/usr/local/bundle/ruby/3.3.0/bundler/gems/rails-5d34172ff44e/activerecord/lib/active_record/connection_adapters/schema_cache.rb:345:in `block (2 levels) in columns'", "/usr/local/bundle/ruby/3.3.0/bundler/gems/rails-5d34172ff44e/activerecord/lib/active_record/connection_adapters/abstract/connection_pool.rb:406:in `with_connection'", "/usr/local/bundle/ruby/3.3.0/bundler/gems/rails-5d34172ff44e/activerecord/lib/active_record/connection_adapters/schema_cache.rb:344:in `block in columns'", "/usr/local/bundle/ruby/3.3.0/bundler/gems/rails-5d34172ff44e/activerecord/lib/active_record/connection_adapters/schema_cache.rb:343:in `fetch'", "/usr/local/bundle/ruby/3.3.0/bundler/gems/rails-5d34172ff44e/activerecord/lib/active_record/connection_adapters/schema_cache.rb:343:in `columns'", "/usr/local/bundle/ruby/3.3.0/bundler/gems/rails-5d34172ff44e/activerecord/lib/active_record/connection_adapters/schema_cache.rb:354:in `block in columns_hash'", "/usr/local/bundle/ruby/3.3.0/bundler/gems/rails-5d34172ff44e/activerecord/lib/active_record/connection_adapters/schema_cache.rb:353:in `fetch'", "/usr/local/bundle/ruby/3.3.0/bundler/gems/rails-5d34172ff44e/activerecord/lib/active_record/connection_adapters/schema_cache.rb:353:in `columns_hash'", "/usr/local/bundle/ruby/3.3.0/bundler/gems/rails-5d34172ff44e/activerecord/lib/active_record/connection_adapters/schema_cache.rb:54:in `columns_hash'", "/usr/local/bundle/ruby/3.3.0/bundler/gems/rails-5d34172ff44e/activerecord/lib/active_record/connection_adapters/schema_cache.rb:198:in `columns_hash'", "/usr/local/bundle/ruby/3.3.0/bundler/gems/rails-5d34172ff44e/activerecord/lib/active_record/model_schema.rb:592:in `load_schema!'", "/usr/local/bundle/ruby/3.3.0/bundler/gems/rails-5d34172ff44e/activerecord/lib/active_record/counter_cache.rb:187:in `load_schema!'", "/usr/local/bundle/ruby/3.3.0/bundler/gems/rails-5d34172ff44e/activerecord/lib/active_record/encryption/encryptable_record.rb:127:in `load_schema!'", "/usr/local/bundle/ruby/3.3.0/bundler/gems/rails-5d34172ff44e/activerecord/lib/active_record/model_schema.rb:539:in `block in load_schema'", "/usr/local/bundle/ruby/3.3.0/bundler/gems/rails-5d34172ff44e/activerecord/lib/active_record/model_schema.rb:536:in `synchronize'", "/usr/local/bundle/ruby/3.3.0/bundler/gems/rails-5d34172ff44e/activerecord/lib/active_record/model_schema.rb:536:in `load_schema'", "/usr/local/bundle/ruby/3.3.0/bundler/gems/rails-5d34172ff44e/activerecord/lib/active_record/model_schema.rb:429:in `columns_hash'", "/usr/local/bundle/ruby/3.3.0/gems/good_job-3.29.3/app/models/good_job/process.rb:69:in `lock_type_migrated?'", "/usr/local/bundle/ruby/3.3.0/bundler/gems/rails-5d34172ff44e/activerecord/lib/active_record/relation/delegation.rb:78:in `block in lock_type_migrated?'", "/usr/local/bundle/ruby/3.3.0/bundler/gems/rails-5d34172ff44e/activerecord/lib/active_record/relation.rb:1355:in `_scoping'", "/usr/local/bundle/ruby/3.3.0/bundler/gems/rails-5d34172ff44e/activerecord/lib/active_record/relation.rb:541:in `scoping'", "/usr/local/bundle/ruby/3.3.0/bundler/gems/rails-5d34172ff44e/activerecord/lib/active_record/relation/delegation.rb:78:in `lock_type_migrated?'", "/usr/local/bundle/ruby/3.3.0/gems/good_job-3.29.3/app/models/good_job/process.rb:50:in `block in <class:Process>'", "/usr/local/bundle/ruby/3.3.0/bundler/gems/rails-5d34172ff44e/activerecord/lib/active_record/relation.rb:548:in `instance_exec'", "/usr/local/bundle/ruby/3.3.0/bundler/gems/rails-5d34172ff44e/activerecord/lib/active_record/relation.rb:548:in `block in _exec_scope'", "/usr/local/bundle/ruby/3.3.0/bundler/gems/rails-5d34172ff44e/activerecord/lib/active_record/relation.rb:1355:in `_scoping'", "/usr/local/bundle/ruby/3.3.0/bundler/gems/rails-5d34172ff44e/activerecord/lib/active_record/relation.rb:548:in `_exec_scope'", "/usr/local/bundle/ruby/3.3.0/bundler/gems/rails-5d34172ff44e/activerecord/lib/active_record/scoping/named.rb:175:in `block in scope'", "/usr/local/bundle/ruby/3.3.0/gems/good_job-3.29.3/app/models/good_job/process.rb:61:in `cleanup'", "/usr/local/bundle/ruby/3.3.0/gems/good_job-3.29.3/lib/good_job/notifier/process_heartbeat.rb:18:in `block in register_process'", "/usr/local/bundle/ruby/3.3.0/gems/good_job-3.29.3/lib/good_job/overridable_connection.rb:26:in `override_connection'", "/usr/local/bundle/ruby/3.3.0/gems/good_job-3.29.3/lib/good_job/notifier/process_heartbeat.rb:17:in `register_process'", "/usr/local/bundle/ruby/3.3.0/bundler/gems/rails-5d34172ff44e/activesupport/lib/active_support/callbacks.rb:362:in `block in make_lambda'", "/usr/local/bundle/ruby/3.3.0/bundler/gems/rails-5d34172ff44e/activesupport/lib/active_support/callbacks.rb:208:in `call'", "/usr/local/bundle/ruby/3.3.0/bundler/gems/rails-5d34172ff44e/activesupport/lib/active_support/callbacks.rb:563:in `block in invoke_after'", "/usr/local/bundle/ruby/3.3.0/bundler/gems/rails-5d34172ff44e/activesupport/lib/active_support/callbacks.rb:563:in `each'", "/usr/local/bundle/ruby/3.3.0/bundler/gems/rails-5d34172ff44e/activesupport/lib/active_support/callbacks.rb:563:in `invoke_after'", "/usr/local/bundle/ruby/3.3.0/bundler/gems/rails-5d34172ff44e/activesupport/lib/active_support/callbacks.rb:111:in `run_callbacks'", "/usr/local/bundle/ruby/3.3.0/gems/good_job-3.29.3/lib/good_job/notifier.rb:206:in `block (3 levels) in create_listen_task'", "/usr/local/bundle/ruby/3.3.0/bundler/gems/rails-5d34172ff44e/activesupport/lib/active_support/execution_wrapper.rb:91:in `wrap'", "/usr/local/bundle/ruby/3.3.0/gems/good_job-3.29.3/lib/good_job/notifier.rb:205:in `block (2 levels) in create_listen_task'", "/usr/local/bundle/ruby/3.3.0/gems/good_job-3.29.3/lib/good_job/notifier.rb:260:in `with_connection'", "/usr/local/bundle/ruby/3.3.0/gems/good_job-3.29.3/lib/good_job/notifier.rb:201:in `block in create_listen_task'", "/usr/local/bundle/ruby/3.3.0/gems/concurrent-ruby-1.3.3/lib/concurrent-ruby/concurrent/executor/safe_task_executor.rb:24:in `block in execute'", "/usr/local/bundle/ruby/3.3.0/gems/concurrent-ruby-1.3.3/lib/concurrent-ruby/concurrent/synchronization/mutex_lockable_object.rb:48:in `block in synchronize'", "/usr/local/bundle/ruby/3.3.0/gems/concurrent-ruby-1.3.3/lib/concurrent-ruby/concurrent/synchronization/mutex_lockable_object.rb:48:in `synchronize'", "/usr/local/bundle/ruby/3.3.0/gems/concurrent-ruby-1.3.3/lib/concurrent-ruby/concurrent/synchronization/mutex_lockable_object.rb:48:in `synchronize'", "/usr/local/bundle/ruby/3.3.0/gems/concurrent-ruby-1.3.3/lib/concurrent-ruby/concurrent/executor/safe_task_executor.rb:22:in `execute'", "/usr/local/bundle/ruby/3.3.0/gems/concurrent-ruby-1.3.3/lib/concurrent-ruby/concurrent/ivar.rb:170:in `safe_execute'", "/usr/local/bundle/ruby/3.3.0/gems/concurrent-ruby-1.3.3/lib/concurrent-ruby/concurrent/scheduled_task.rb:298:in `process_task'", "/usr/local/bundle/ruby/3.3.0/gems/concurrent-ruby-1.3.3/lib/concurrent-ruby/concurrent/executor/timer_set.rb:166:in `block (2 levels) in process_tasks'", "/usr/local/bundle/ruby/3.3.0/gems/concurrent-ruby-1.3.3/lib/concurrent-ruby/concurrent/executor/ruby_thread_pool_executor.rb:359:in `run_task'", "/usr/local/bundle/ruby/3.3.0/gems/concurrent-ruby-1.3.3/lib/concurrent-ruby/concurrent/executor/ruby_thread_pool_executor.rb:350:in `block (3 levels) in create_worker'", "<internal:kernel>:187:in `loop'", "/usr/local/bundle/ruby/3.3.0/gems/concurrent-ruby-1.3.3/lib/concurrent-ruby/concurrent/executor/ruby_thread_pool_executor.rb:341:in `block (2 levels) in create_worker'", "/usr/local/bundle/ruby/3.3.0/gems/concurrent-ruby-1.3.3/lib/concurrent-ruby/concurrent/executor/ruby_thread_pool_executor.rb:340:in `catch'", "/usr/local/bundle/ruby/3.3.0/gems/concurrent-ruby-1.3.3/lib/concurrent-ruby/concurrent/executor/ruby_thread_pool_executor.rb:340:in `block in create_worker'"]
CaptainCodeman commented 1 day ago

I'll take a look into it.

jbrauck-unchained commented 1 day ago

Weird, I did an umbrel restart to see if it would self-resolve... and it did! Should have tried that before coming here. I will let you know if I run into anything else. Thanks for putting this up, I have been looking for some self hosted finance alternatives.

CaptainCodeman commented 1 day ago

Weird - thanks for the update!

Yeah, I've never found anything I really liked but this was one of the closest I've found (I've used Wealthica, Mint, and others all the way back to MS Money). I just want something to track balances and not deal with transactions, linking accounts to online services and so on, ideally local data, but need multi-currency support including non-fiat currencies, plus the ability to have partial ownership of assets (e.g. a bank account for a company you part own). I've ended up creating my own that is optimized for how I typically work (to make it quicker when updating all the balances from one institution) and has all the usual nice graphs and things. I'll maybe open-source it at some point and / or make it publicly usable.

Screenshot 2024-07-01 at 2 18 59 PM Screenshot 2024-07-01 at 2 20 09 PM