Note
I'm developing this into a fully functioning product as a learning experience.
Therefore, it's gonna be usable but keep in mind there are most likely better alternatives both proprietary and open source
Also, my primary project is Bodypace thus I'm developing this one in the free time and when I actually need a given function. Right now I'm already using it, but the first example below + some equipment and files tracking is all I need, thus other features are not implemented yet.
Warning
This project is not ready yet:
terminal app
is unfinishedweb app
is unfinisheddata server
is unfinished- no
integrations
andsynchronizations
yet (e.g. automatically creatingοΈοΈπ§ email
items)- no
Tangler Cloud
yet- no
web browser extension
yetThis document describes what Tangler will be but remember it's not there yet.
Build of the latest commit
web app
+data server
FOR PREVIEW ONLY ("AS IS", WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND)
is sometimes available at: http://tangler.space
(you can play with it to see how the code works right now)
You define the items you use! Moreover, those items can also synchronize with external data!
What does it mean? It means that you will be able to create one place (easly!) where you have everything you want to keep your eye on, so no more switching between 10 different apps that do the same, but only for their niche.
todo: update this section, it's too complicated and a little bit probably incorrect
Common item types are pre-defined, optional, alterable and restorable so you don't have to do anything.
- List can contain items of only one kind or many - you decide.
- There is a handy filter and global view where you get a list per each item type, with all items of that type.
- Every item can point to and contain items of any other item type.
- Every item type is definable and editable: its emoji (optional), its name, what fields does it have etc.
- Every item can have required and optional fields, with content (full or some part) encrypted & protected if needed.
- What kind of content is allowed where (date, check, text, number etc.) is also definable.
- Items and lists can be self updating, sync with external programs and be used interchangeably with those programs.
- Instead of syncing with external programs and services you can sync with Tangler Cloud to be sure your data is yours and only yours.
E.g. you could define such items:
π project
name
,status
:active
ortodo
π― milestone
name
,category
:feat
ormaintainance
,due date
β task
name
,category
:feat
ormaintainance
,time required
,priority
:p4
,p3
,p2
orp1
π routine
name
,category
:feat
ormaintainance
,when
π note
title
, (note: in Tangler every item has specialdetails
field)
to be able to have such "todo" list of your projects:
ββ³β π Homegrown vegetables active
β£ββ³β π― Build greenhouse feat 2023-06-01
β β£βββ β
dig the ground feat 5 hours p3
β β£ββ³β β
install roof frame (scaffolding) feat 3 hours p2
β β ββββ β
buy pvc pipes for frame feat 1 hour p2
β β£βββ β
lay foil over the frame as a roof feat 1 hour p2
β ββββ π add a door if entry is facing the wind
βββ³β π― Harvest the first crops! feat 2023-09-01
β£βββ π salad is cheap, easy to grow and fast
β as long as you keep the snails at bay :D
β£βββ β
sow the ground feat 2 hours p2
β£βββ π check everything for pests maintainance at evening
ββββ π water everything maintainance at evening
ββ³β π Become great chef todo
β£βββ π take some cooking classes?
ββββ π go over every dish you can order online
and try doing it at home
...
You could also use synchronizing items (thanks to integrations):
π account
name
,username
,email
,password
(encrypt=yes)
π€ contact
name
,phone number
,email address
- sync:
smartphone
: one way: readgoogle contacts
: one way: read
οΈοΈπ§ email
title
,content
,date
,status: "sent" or "received" or "draft"
,sender
,receiver
- sync:
gmail
: two way: read and write
𧳠equipment
name
π file
name
,path
- sync:
device storage
: one way: readcloud storage
: one way: read
π² transaction
title
,date
,balance
,account
- sync:
bank
: one way: read
to have such lists:
ββ³β π Amazon User89437120 myemail@mail.com ********
β£ββ³β οΈοΈπ§ Account creation 2023-05-01 received amazom.com
β β£βββ π Terms and Conditions cloud://some/path
β ββββ π Privacy policy cloud://some/path
β£βββ 𧳠Amazon $25 gift card
βββ³β 𧳠Vacuum cleaner
β£βββ οΈπ User manual cloud://some/path
βββ³β π€ SellerNo11235813 +1 112 3581321 contact@goodstuff.com
β£βββ οΈπ² Vacuum cleaner payment 2023-05-01 -$32 IBAN 12345678910
βββ³β οΈοΈπ§ Vacuum cleaner purchase order 2023-05-01 received amazom.com
ββββ οΈπ Payment confirmation cloud://some/path
ββββ οΈπ Warranty cloud://some/path
ββ³β π Bolt Robert myemail@mail.com ********
β£ββ³β οΈοΈπ§ Account creation 2023-05-01 received bolt.eu
β β£βββ π Terms and Conditions cloud://some/path
β ββββ π Privacy policy cloud://some/path
β£βββ οΈοΈπ§ Some spam message 2023-05-01 received bolt.eu
β£βββ οΈοΈπ§ Some spam message 2023-05-01 received bolt.eu
β£βββ οΈοΈπ§ Some spam message 2023-05-01 received bolt.eu
β£βββ οΈοΈπ§ Some spam message 2023-05-01 received bolt.eu
ββββ οΈοΈπ§ Some spam message 2023-05-01 received bolt.eu
...
With fields derived one from another you can get detailed budget overview:
π² transaction
title
,date
,balance
,account
- sync:
bank
: one way: read
π¦ loan
title
,date
,total
,left
π subscription
title
,date
,rate
,until
,paid
Arbitrary fields can be calculated one from another and it's easy to setup. Again, you define what you want.
E.g. π subscription
can track all child π² transaction
items and show their sum as paid
field.
ββ³β π Bank 12345678 myemail@mail.com ********
βββ³β οΈπ¦ Consumer Loan no.1 2023-01-01 +$5000 $2000
β£ββ³β οΈοΈπ§ Loan agreements 2023-05-01 received contact@bank.com
β β£βββ π Terms cloud://some/path
β ββββ π Payment schedule cloud://some/path
β£βββ οΈπ² Loan installment no.1 2023-02-01 -$1000 <BANK IBAN ADDRESS>
β£βββ οΈπ² Loan installment no.2 2023-03-01 -$1000 <BANK IBAN ADDRESS>
ββββ οΈπ² Loan installment no.3 2023-04-01 -$1000 <BANK IBAN ADDRESS>
ββ³β π MusicApp Robert myemail@mail.com ********
β£βββ οΈοΈπ§ Account confirmation 2023-03-01 received customers@musicapp.com
βββ³β π Standard account 2023-03-01 $10/month until cancelled $30
β£βββ π Agreements cloud://some/path
β£βββ οΈπ² MusicApp subscription for 2023-03 2023-03-01 -$10 <MUSICAPP INC. BANK ADDRESS>
β£βββ οΈπ² MusicApp subscription for 2023-04 2023-04-01 -$10 <MUSICAPP INC. BANK ADDRESS>
ββββ οΈπ² MusicApp subscription for 2023-05 2023-05-01 -$10 <MUSICAPP INC. BANK ADDRESS>
...
Here is a simple list, a journal and wishlist. Types:
π journal
what I did
,date
,mood
:π₯ excellent
,π good
,π blank
,π grumpy
,π bad
π‘ idea
what to do
,how will I probably feel
:π₯ excellent
,π good
,π blank
,π grumpy
,π bad
Possible result:
βββ π Slept until 10am 2023-04-07 π bad
βββ π Ran 10km again 2023-04-07 π good
βββ π Cooked my first sushi 2023-04-07 π₯ excellent
βββ π Woke up at 8am 2023-04-08 π blank
βββ π Riding dirt bike 2023-04-08 π₯ excellent
βββ π Woke up at 9am 2023-04-09 π grumpy
βββ π Reached project A milestone 2023-04-08 π₯ excellent
βββ π Woke up at 5:30am 2023-04-10 π₯ excellent
...
βββ π‘ Go skydiving π₯ excellent
βββ π‘ Build a birdhouse π good
...
Lastly, to get the point across, you can really define whatever you want and integrate it with whatever else. As long as Tangler provides an integration with a given 3'rd party, it will be possible and easy to setup.
Otherwise, it's still possible but only for technology savy users as users can write their own integrations/synchronization logic for items/lists but it requires programming skills (It's easy tho, Thangler is designed in a way (that's the goal) where there is little logic that clicks well together to give many functionalities thus there is not that much code to write (and it's simple)).
Thus, e.g. smart home is also possible (but for now only if you implement the synchronization yourself):
ποΈ place
name
π measurement day
date
π‘ temperature
created difference
,at location
,outside
π§ water
used liters
π electricity
net watts
,produced watts
(optional)
,consumed watts
(options)
whatever else...
Example record of resources consumption for a given day could look like that:
ββ³β π
2023-05-01
β£βββ π§ 25L
β£ββ³β ποΈ House
β β£βββ π‘ +11'C 24'C 13'C
β β£βββ π§ 20L
β β£βββ π +7kW +30kW -23kW
β β£ββ³β ποΈ Home gym
β β βββ³β 𧳠Treadmill
β β ββββ π -2kW
β β£ββ³β ποΈ Solar panels
β β ββββ π +30kW
β βββ³β ποΈ Bathroom
β ββββ π§ 12L
βββ³β ποΈ Garden
ββββ π§ 5L
That one is a little bit hard to read right? We are in charge and thus we can make ποΈ place
more compact! e.g.:
ββ³β π
2023-05-01 π§ -25L π‘ +11'C (24'C - 13'C) π +7kW (+30kW -23kW)
β£ββ³β ποΈ House π§ -20L π‘ +11'C (24'C - 13'C) π +7kW (+30kW -23kW)
β β£ββ³β ποΈ Home gym π§ -- π‘ -- π -2kW
β β βββ³β 𧳠Treadmill
β β ββββ π -2kW
β β£βββ ποΈ Solar panels π§ -- π‘ -- π +30kW
β ββββ ποΈ Bathroom π§ -12L π‘ -- π --
ββββ ποΈ Garden π§ -5L π‘ -- π --
Now it's better :).
That was the last example. I hope it's clear we can note pretty much whatever we want with those lists, e.g. add βοΈ coal
household usage or produced grams of π§ plastic
to the above household monitoring.
Looking at those examples, one can deduce that with such tool you no longer need a separate app for your shopping receipts, another one for budget planning, another one for passwords and accounts (password manager), another one for notes taking, another for todo lists, another for calendar, another for emails browsing, etc.
Everything is here, plain and simple, and that is the goal.
Tangler can sync with external data providers like gmail, cloud storage (documents, images,...) or bank so you can manage or at least read all the data that is there through Tangler.
Instead of using GitHub Issues, GitHub Projects, JIRA or something else Tangler tasks, docs and everything else is managed by Tangler itself. If you want to see what is going on right now in this project or how it already looks like in action, run below.
git clone https://github.com/ssurrealism/Tangler
cd Tangler
docker compose up
# now visit localhost:9000 in your web browser
# or make curl request, e.g. http://localhost:9000/api/config
# enter cli/server directory
cd app
# install dependencies
python -m venv .venv
source .venv/bin/activate
pip -r requirements.txt
# run some commands (help not implemented yet)
python tangler.py
python tangler.py read note
python tangler.py read task
python tangler.py create task label 'feat' due_date '2023-03-13' project 'cli' title 'implement help command'
# Tangler uses json and yaml files as database right now so you can also read those manually if you want
cat _data/_config.yaml # this file defines all item types and how to display them
cat _data/task.json # this file holds all items of type "task" ("task" is defined in _config.yaml)
-
Data directory
Directory on your computer or phone or any other device where all lists and items are stored.
-
Data server
Program that exposes data stored inside Data directory to the internet. Used by PWA and Terminal app.
-
Website and mobile app (PWA)
Self explanatory. Can work on any data exposed by Data server. Has build in support for Tangler Cloud.
-
Tangler Cloud
For people that just want to use PWA working out of the box with data synced and accessible across all of their devices. It's an instance of Data server managed by tangler authors. Data directory for each user in Tangler Cloud is fully encrypted so that nobody who has access to Tangler Cloud can access user data.
-
Terminal app
Command line app, can work on any data exposed by Data server or directly on Data directory if computer has access to it.
-
Library
Python package, used by both Terminal app and Data server to create, read, update and delete data in Data directory. Can be used to write scripts and other tools. Library also implements all build-in integrations and analytics.
- Topics:
Google Workspace
,Banking
,Crypto
,eCommerce
,items market
,sharing and renting
,Arbitrary internet service
, ... - Examples:
gmail
,google drive
,google contacts
,mBank
,Binance
,Amazon
,Revolut
,PKO
,ING
,BPC
,Coinbase
,DEGIRO
,Exante
,TradingView
, ... - Functions: accounts automatic detection and easy+delegated management (e.g. closing, raport of what is unused (not necessary) or duplicates features),...,
progress and stagnation detection
,financial analytics
,projects analytics
note: <space_name> below is not implemented yet.
Besides using firefox to access your Tangler space:
firefox tangler.space/
firefox tangler.space/me/
firefox tangler.space/<space_name>
You can also use Tangler cli to work without any server, on your local data:
tangler config read
tangler config read type
tangler config read type task
tangler config read field task
tangler config read field task category
tangler read task
tangler read task 34
Or with data from any server, including your own and official https://tangler.space/ server:
tangler cloud auth login
tangler cloud auth status
tangler cloud auth logout
tangler cloud config read
tangler cloud config read type
tangler cloud config read type task
tangler cloud config read field task
tangler cloud config read field task category
tangler cloud read task
tangler cloud read task 34
You can also use curl without anything locally installed to interact with Tangler server:
note: for now it's tangler.space/api
curl api.tangler.space/<space_name>/
curl api.tangler.space/<space_name>/config
curl api.tangler.space/<space_name>/config/types
curl api.tangler.space/<space_name>/config/types/task
curl api.tangler.space/<space_name>/config/fields/task/category
curl api.tangler.space/<space_name>/data/task
curl api.tangler.space/<space_name>/data/task/34
Above will give you your data in json format.
If you want it nicely formatted to readable lists in terminal, just like the Tangler cli does, request cli
endpoint:
curl cli.tangler.space/<space_name>/
curl cli.tangler.space/<space_name>/config
curl cli.tangler.space/<space_name>/config/types
curl cli.tangler.space/<space_name>/config/types/task
curl cli.tangler.space/<space_name>/config/fields/task/category
curl cli.tangler.space/<space_name>/data/task
curl cli.tangler.space/<space_name>/data/task/34
And the last π cherry on the π cake (83% sure it's cake :p), use ai
command to interact with your data through "chat like" interface:
tangler ai "I did <task>, mark it as done"
tangler ai "what should I do now in my vegetables project?"
curl ai.tangler.space/<space_name> ("I did <task>, mark it as done" in requet body)
curl ai.tangler.space/<space_name> ("what should I do now in my vegetables project?" in request body)