Giter Club home page Giter Club logo

tempo's Introduction

Tempo - your personal diary and mood tracker

Tempo is a diary, mood tracker and Kanban board. Its main goals are to help you:

  • Keep, organize and find your writings, logs or whatever piece of text you want
  • Record and understand how your mood changes and evolves over time
  • Remember what needs to be done and organize accordingly

Tempo's Diary view

Tempo is also free to use, open source and web based. You can use it at no cost, from any compatible web browser, both on mobile and desktop, without even creating an account. The data entered in Tempo never leaves your device and isn't shared with any third-party. Finally, because Tempo is a Progressive Web App, it will continue to work on your device even without any internet connection.

On a more personal note, Tempo is by far the most personal software project I've ever worked on. Since its birth in April 2020, I have put a lot of myself in it. Among other things, it helped me overcome serious mental health issues and still supports me on a daily basis. It was built to address very specific needs (i.e, mine) and also as an experiment.

As a result, Tempo isn't meant for everyone. I don't expect it to be used by many people and this is completely fine. There are a lot of other tools available out there that will probably be a better fit for you. But if that's not the case, well, you might want to give Tempo a try.

With that in mind, let's proceed ;)

Using Tempo

To start using Tempo, simply visit https://tempo.agate.blue/.

If you're using Tempo often on mobile, you will probably want to use the "Install app" or "Add to homescreen" feature of your web browser. This will let you launch and use Tempo as you would with any other native app.

The About Page in Tempo itself should answer most the questions you have while using the app. You can also read more about Tempo's features below.

Diary

Tempo's Diary view

Tempo's diary should be relatively straightforward to use. Simply type your text in the text area, hit save and tada! You've recorded a new note in your diary. There is no hard limit to the size of a single note.

In addition, the diary support advanced use cases and features. All these features are enterily optional and you can use Tempo without even thinking about it, but there are in if you ever need them.

Markdown

You can use titles, bullet list, links, emphasis and other Markdown syntax inside your entries, and have them rendered properly once the note is saved. If you are not familiar with Markdown syntax, you can learn how to use it in a couple minutes.

Favorites

Entries can be favorited to be quickly found when you most need them.

Tags

Prefixing any word with a # will render it as a hashtag, like this: Played some #guitar tonight.. As hashtags can easily be clicked and searched for, this helps you organize your diary without spending too much time thinking about it

Similarly, prefixing a word with an exclamation mark, like this: Got my first !tattoo today, will tag entries as important and give you a way to quickly retrieve and browse them afterwards.

Tempo supports several other type of tags, related to its mood tracking capabilities and thus described below.

Threads

Entries in the diary can have replies, which is especially useful if you want to group them. For instance, you can use a single thread to gather everything related to an event (planning, notes, feedback, etc.)

Thread replies are regular diary entries and, as such, can be queried, favorited, contain tags, annotations, etc.

Annotations

Entries can contain annotations, beginning with a @ that let you track more structured data, such as weight, sleep duration, medication increase or decrease, hormone levels, pain levels, etc.

Here is an example note with two annotations below:

Got my blood test results:

@estradiol="114" (pg/mL)
@testosterone="22.3" (ng/dL)

This data can then be used to build graphical visualizations such as charts, tables, or even be exported for use in other tools. You can read more on annotations in the dedicated section below.

Querying and search

Tempo includes a search bar and a powerful query language you can use to quickly find entries:

  • Full text search: guitar gives you entries containing guitar
  • Tag search: tag:music gives you entries tagged with #music or !music
  • Date search:
    • date:2021 gives you entries recorded in 2021
    • date:2021-05 gives you entries recorded in May 2021
    • date:2021-05-13 gives you entries recorded in May 13th, 2021
  • Tag type search:
    • # gives you entries with any hashtag
    • ! gives you all important entries
  • Other operators:
    • is:favorite gives you all favorited entries
    • is:thread gives you all first entries of a thread
    • is:reply gives you all replies thread
    • not:guitar gives you all entries not containing guitar. not: can be used before other operators, such as not:is:reply or not:date:2021

All these operators can be combined to further refine your search:

  • ! date:2021-05 gives you important entries recorded in May 2021
  • music jam gives you entries that includes both music and jam in their body
  • tag:music piano gives you entries tagged with music and containing piano in their body

You can use a coma separator to express OR queries:

  • piano, guitar gives you entries including piano or guitar in their body
  • date:2021-01, date:2022-01 gives you entries submitted in January 2021 or January 2022

Finally, if this isn't enough for you, Tempo support defining query aliases. It's not uncommon to use several variations of a word or tag inside entries. For instance, if you record your dreams, you may have some that are tagged with #dream, others with #dreams, other with #nightmares, etc. To easily find all those entries without typing all the possible variations every time, you can define a $dreams alias, corresponding to the following search query: tag:dream, tag:dreams, tag:nightmare.

You can then use the $dreams alias in place of the original, longer query.

Mood tracker

Mood tracking in Tempo is done by leveraging your diary. As a result, while it is totally possible to use Tempo as a diary without any of the mood tracking features, you'll have to use the diary at least a little bit in order to track your mood in Tempo. You don't have to worry though, it doesn't mean you have to write a lot.

Moodtags

For instance, the following diary entries contain enough information for Tempo to act as a mood tracker:

-sad
+happy
+excited
-exhausted

The + and - in front of words tells Tempo that the corresponding note is linked to your mood, in a positive or negative way, respectively. In Tempo's vocabulary, they are called moodtags.

This gives you the opportunity to include more context about how you are feeling, which tends to be very helpful when you're going trying to understand why your mood changed at a given point in time.

For instance:

I had an -exhausting day at work.

I was already tired because of -insomnia and it just got worse.

Moodtags can be repeated to convey greater intensity:

I am very +++excited about tomorrow
That was a --bad nightmare

Because mood isn't binary, you can use as many and different moodtags in the same note to express nuances:

I had a pretty decent night of +sleep and was in a good mood this morning.

However, I received a phone call that made me quite --anxious

Tempo will keep a track that this note include both positive and negative moods, but that it was predominently negative. Internally, a mood score is attached to the note, based on the number of moodtags and repetitions:

  • guitar gets a score of 0
  • +excited gets a score of 1
  • --anxious gets a score of -2
  • -tired but ++happy gets a score of +1 (-1 + 2)

Visualization

Tempo's mood chart

Tempo's calendar

At some point, you will probably want to use this information to actually understand what's going on with your mood. Tempo use moodtags in various places:

  • In the Diary view, at the top corner of each note, a color badge showsyou the predominent mood of a note
  • Similarly, in the Calendar view, entries have a color matching their predominent mood
  • In the Visualization view, Tempo display several charts:
    • A day to day chart, showing your mood variations, using the total mood scores of each day's entries
    • A "Common tags" table, showing you the most used tags and their associated mood score
  • In search queries, via the - and + operators, to filter negative or positive entries respectively

Kanban board

Tempo's Kanban board

The "Tasks" menu gives you access to a relatively simple Kanban Board.

You can customize the number of lists (columns) shown in the board, their name, and optionally define a few categories. Once you're done with this initial configuration (you can change the appearance of your board afterwards if needed), you can start using the board:

  • Creating tasks in various columns
  • Move them between columns
  • Check them to mark them as done
  • Filter them via the search bar, using keyword search or their category

Using Tempo on multiple devices

By default, all the data you put in Tempo stays in your web browser. It never leaves your device, which is a good thing in terms of privacy and simplicity but becomes an issue when you want to use Tempo on multiple devices, for instance on your phone and laptop.

The good news is that Tempo does support multi-device synchronization, giving you a full read and write access to your data on as many devices as you want.

However, this feature requires an access to a CouchDB database to store this data and synchronize it. As I don't have the resources to host such as service and provide it for free, it means you'd have to do it yourself, if you have the skills, or find someone who can do it for your.

Once you have access to a CouchDB database server, fill your credentials in Tempo Settings page. You have to do this on all the devices that you plan to use.

Your local data will be pushed on the remote database, and vice-versa, during the initial synchronization. Afterwards, all modifications to your data such as adding, updating, deleting and note or task will be forwarded to your CouchDB database and other devices that are connected to it.

The "Sync" button in the menu let you force the data synchronization. This can be useful if you were offline for a while, and want to immediatly push your changes without waiting for Tempo to resume the syncing process.

Backing up data

The settings page lets you export your notes, board and other settings for backup and restore purpose.

Tempo's backup/restore form

Importing data

From the "Settings" page, you can import your notes, board and settings from a previously generated backup file. A couple important things:

  • When you import notes, your existing diary will be preserved, unless some notes have the same timestamp. In that case, existing notes will be replaced by the ones from the backup.
  • Importing your board will work in the same way. Existing tasks will be preserved. However, your existing board configuration will be replaced by the new one, which could lead to some inconsistencies if you have different columns and/or categories in the current and backed-up board.

Deleting data

You will find a form to delete all your data from Tempo at the end of the settings page. Doing so will effectively and definitely remove all your notes, tasks and configuration, giving you a blank state. It isstrongly recommended to perform a JSON backup beforehand, just in case.

If you have connected Tempo to a CouchDB database before deletion, only your local copy of the data will be deleted. Data will remain unaffected on the CouchDB database and other devices.

Browser compatibility

Tempo is known to work with at least the following browsers:

  • Firefox (Desktop and Android)
  • Chrome (Desktop and Android)
  • Safari (IPhone)
  • Vivaldi (Android)

More browsers, especially WebKit and Blink based browsers should also work.

Performance and resource consumption

Because Tempo is web-based and all data is hosted locally, performance will vary depending on your browser and device.

My current Tempo database currenly has around 1900 notes and 500 tasks, spread over two years.

  • A backup of the notes takes 740 KB
  • A backup of the board takes 95 KB

On my laptop, with this data, a complex search query completes in less than 500ms, making the delay unnoticeable. On my 2019 Xiaomi Mi A3, the same query takes between 1 and 1.5 seconds.

I am thus confident that Tempo can handle fairly large diaries and task boards, especially given the fact that little to no performance optimizations were made.

Contributing to Tempo

Tempo is a a personal project and I work on it on my spare time. I am not willing nor able to dedicate much time on the project. I will not implement and maintain complex features if I'm not going to use them myself or if I think they are out of scope for the project.

With that in mind, I will gladly accept bug reports, feature requests, pull requests and other contributions. I will also respectfully decline contributions I cannot or do not want to handle for the reasons stated above.

Community and contribution rules

If you're using Tempo or one of the community spaces such as the GitHub issues or any other discussion space, you are expected to comply with our Code of Conduct.

This Code of Conduct is non-negotiable and I will gladly enforce it. You can also contact me at [email protected] if you think some moderation action needs to be taken.

Software license

Tempo is licensed under GNU Affero General Public License v3.0.

Reporting bugs

If you encounter a bug while using Tempo, you're welcome to open an issue. Please have a quick look at the issue tracker beforehand, as someone may already have reported it.

Include as much context as applicable and possible, in particular:

  • Browser name and version
  • Operating system name and version
  • Steps to reproduce the issue (if you found a way to reproduce it)
  • Screenshots (in particular if the issue is related to the user interface)

Requesting features or enhancements

If you'd like to see a new feature or enhancement in Tempo, you're welcome to open an issue. Please have a quick look at the issue tracker beforehand, as someone may already have asked for it.

Include as much context as applicable and possible regarding the use case or the problem you want solved.

Submitting merge requests

If you want to fix a bug, a typo, or implement a new feature or enhancement, please do! I will happily review and merge your contribution unless it doesn't meet the criteria described above in the "Contributing to Tempo" section.

If your contribution is a sizeable enhancement or new feature, I strongly recommend you start a discussion before beginning to work on it

Run Tempo in development

Tempo is a VueJS / Vuetify application written in Javascript.

Project setup

# install dependencies
yarn install

Serve a development version with hot-reload

yarn serve

You can then access the development version at http://localhost:8080

Compiles and minifies for production

yarn build

Run unit tests

yarn test:unit

Run a CouchDB server

If you want to try CouchDB synchronization in development, use the instructions below (docker is required):

docker run -e COUCHDB_USER=admin -e COUCHDB_PASSWORD=password -p 5984:5984 -v couchdbdata:/opt/couchdb/data couchdb:3

Then:

Deploying using Docker

If you want to deploy Tempo using Docker, you can use our Dockerfile:

docker build -t tempo .
docker run --rm -p 8097:80 tempo

The image includes an Nginx server and a compiled bundle of Tempo assets.

tempo's People

Contributors

agateblue avatar eliotberriot avatar entropyqueen avatar saintnong 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

Watchers

 avatar  avatar  avatar  avatar  avatar

tempo's Issues

Time display in diary

I noticed a bug with time display. For my timezone (eastern US), if I enter a diary entry beyond 7 PM, then the calculated time displaying in the diary is a negative number (-1, -2, -3, etc). I think there is a bug in this function:

export function getPrettyTimeFromDate (v) {

Why not use built-in javascript function for displaying local time:

date.toLocaleTimeString([], { hour: 'numeric', minute: '2-digit', hourCycle: 'h24' }))

Sort by date

When adding past date entries to the diary, they show up on top of the list instead of being sorted descending by date.

Bug sur le parsing de mood

J'ai pu observer plusieurs comportements étranges sur le parsing de mood. Typiquement j'utilise souvent des -- pour séparer des éléments quand j'écris, ils sont ici parsés comme un tag de "bad mood":

Exemple:

#test

- test
a + b = c 
oh -- no ++ ? heeeh
--bad-mood
------very-bad-moood
++++++++yaay

++good_mood ?

2022-12-19_22-39

Ici, le -- est considéré comme un marqueur de "bad mood", alors qu'il ne devrait pas. Ça ne le fait pas sur le ++.

Aussi il semble y avoir une limite sur le nombre de + à la suite (je suppose que c'est le même comportement pour les - ?), ça fait effectivement ptet pas trop de sens d'en mettre des tonnes, mais je sais pas si c'est nécessaire de mettre une limite ?

Cannot sync with CouchDB

I setup my CouchDB server on my home PC using docker. It is up and running, and I created a "tempo" database all ready to sync. However I cannot get tempo to sync. I get a "Sync OK!" message when I input my database information (I had to unblock insecure content on Vivaldi since I'm just using my local IP with insecure http://).

I checked developer console. It seems I get a 200 back for the _session request (which is sending my username and password in the request header). That's why I get a "Sync OK" message in my browser page.

When I try to actually sync, I get 401 unauthorized. It seems the credentials are not being sent in the request headers. Any help would be appreciated. Thanks.

Sync with CouchDB → 404 errors

Hi,

First of all thanks for taking the time to thoroughly document that tool for others. It is already really useful to me.

The synchronization features started to throw errors, but I only realized it when try to force sync and saw a not found message.
Here's a screenshot of what happens :

Maybe it's a problem on my side but I have no clue to debug it. Do you have any idea ?

Thanks and have a nice day.

Journal entries are ordered by creation order and not by entry timestamp

Description

In the default diary view, notes are displayed in the order they were created (the most recently created first), instead of being ordered by timestamp. This means, for example, that notes created with a timestamp in the past are listed at the top of the list, above notes with a more recent timestamp.

Refreshing the window does not work. Even starting with a fresh browser and setting up CouchDB sync to pull the content results in the entries being listed in the incorrect order. The GIF below shows that.
wrongorder

Steps to reproduce

  1. Create multiple notes with various dates in the past
  2. The notes are listed in the (reverse) order they were created and not according to their date

Workaround

None that I could find.

Extra info

Tested and found to occur on Firefox 116.0 (officially packaged versions) on a Debian Sid system.

better tag search ?

When searching for a tag in the search bar, it needs to be written without the '#' in front of it, which might not be an habit for new people
It would be nice to be able to search both for #tag and tag all the same, what do you think? :)

Bug in annotation parsing/edit

Quand on édite un tag annotation, le contenu n'est pas re-parsé, il faut nécessairement l'éditer dans les champs en dessous. Je pense que ça ferai sens d'avoir un re-parsing de l'entrée.

Par exemple, je veux créer 2 annotations:
tempo_annotation_bug1

Je me suis ratée, ça donne ça:
tempo_annotation_bug2

Donc j'édite pour remettre le retour à la ligne, ce qui donne:
tempo_annotation_bug3

Je pense qu'il serait préférable que la valeur du tag soit prise jusqu'au \n ou s'arrêter avant si il y a une autre annotation ? Et sinon juste pour l'édition, re-parser l'entrée pour corriger les valeurs.

Feature request: make/change default visualization

The data visualization is amazing, but every time I want to check some graphs I have to got to the Data tab, and then select the proper blueprint to display, because I usually don't want to check my mood (yeah I know Tempo is a mood tracker :D). It would be amazing to be able to set another blueprint as default !

Add "time" type fields to blueprint

Hello 😊

I am making a blueprint and wanted to add a time field but the "date" type field only allows for dates (hence the name, sure :D). But I think it would be nice to have a "time" type field, and maybe also a "datetime" type field too.

Feature request: ability to set the time at which the day starts

Hi !
Ok so this might be a weird one: I would like to be able to set the time of day at which the day begins. I know, it sounds weird, but hear me out. I will often add entries after midnight, but before sleeping. Ideally, I would like events before say 4AM to be added to belong to the day before. This has been one of my biggest frustrations with several mood trackers I've used in the past, and I feel it's way easier to implement it in JS than to go to bed early everyday.

What I'm seeing is something like this:

  • at a "Shift start of day by" setting
  • adjust dates in calendar
  • fix groupByPeriod (this one might get pretty tricky) to enforce this as well
  • fix the query filters as well

Custom datetime of new entries is ignored

Description

When creating a new journal entry (with the default form or another) and setting a custom datetime, the date is ignored and the datetime is set to now instead.

wrongdate

Steps to reproduce

  1. Write a new entry
  2. Set a custom datetime
  3. Save
  4. The entry appears to have been written right now

Workaround

Editing the entry afterwards allows to set the right datetime (although this sometimes glitches too, sometimes the Save button just does not work.)

Extra info

Tested and found to occur on both Firefox 116.0 and Chromium 116.0.5845.96 (officially packaged versions) on a Debian Sid system.

Merge all export modals in a single place

Right now, exporting data is made through two separate UIs:

  • one in the Tasks tab
  • in the Advanced tab, in the diary

Ideally, this should be doable in a single place.

CouchDB security

CouchDB security is a little confusing. I have my "admin" account listed as an admin on my tempo database, but I have no "members" listed. According to CouchDB documentation, if no "members" are listed, the database is public. Therefore my tempo database is public, if someone gets my url and database name, they can see all my information. Not cool.

Now, as soon as I add a "member" to the database in CouchDB (whether that be an admin account or a regular user account), tempo webapp can no longer sync. As soon as I remove members (making my db public) it is able to sync again.

Can you check your pouchdb code and make sure that it is requiring CouchDB auth, not just for adding rows to the database, but also for retrieving rows. The current behavior makes me think that the tempo webapp is retrieving the database without sending authorization, and only uses authorization when adding rows to the database.

See pouchdb authentication recipes for more details on CouchDB security and settings for pouchdb.

Reusable tasks

Sometimes, I do repetitive tasks with many subtasks. Typically, doing groceries or packing my luggage often involve similar steps, and retyping everything everytime is annoying.

A thing I have in mind to help with that is to support saving tasks as "templates" that can be reused at a later time.

Filtering out the blueprint data ?

Hi! is there a way to filter out the blueprints data, I would like to see only the manual text entries, without having to add a tag to each of them, is this possible? :)

I tried to search for ! is:form, but it doesn't display anything.

Also, thanks for you work, tempo is amazing :3

Feature request: change default visualization

Hey first off all nice and perfect software u created her. im using it since a few days and yeah didnt find something else that would be better in any possible way for my use Just perfect.

So i wanted too ask. Whether it would be possible to change the default blueprints.
These can currently only be viewed.
But I would like to add a few extensions to the mood "default" tag,
(wanna add a mood ground level like hows ur daily "mood" from 1-10points with a extra graph and some more details)
The main point would too change the Visualization or, more precisely, too change the art of the graphs from the defaults.

Idk but maybe something like a setting too unlock this so that any person that us it can not change anything unintentionally.
and "destroy" his complete tempo data.

ty for answers
mfg Alkralys

hope u can understand this bulli english from me xD

Documentation

I was hoping you could add some documentation (to the readme file?) regarding how to use blueprints to visualize data.

For example, you show a little bit how you can use @ labels to document data points (lab values, weight, etc) , but I cannot figure out how to visualize that data on the graph section.

Thanks.

Clicking on "Tempo" should clear tag

When clicking on the home button "Tempo", in the top left corner, the URL changes and removes the tag query, but the tag isn't cleared, I think it would be nice to remove the tag by clicking the "Tempo" button instead of having to go to the Search bar and remove the tag. What do you think?

Visualization groupByPeriod bug

Coucou !

Bon j'ai un turbo bug sur les groupByPeriod dans les visualisation des blueprints, voici:

Je commence par aller sur l'onglet data, et pour le blueprint Diary, les données sont formatés de la facon suivante:

groupByPeriod_date

Si je veux changer l'affichage du groupByPeriod (j'ai pris l'exemple du day of the week, mais c'est buggy sur chaque truc), ça ne change rien cf:

groupByPeriod_dayOfWeek_bug

En revanche, le comportement observé n'est pas le même dans la partie Visualisation quand on edit un blueprint:

Observation initiale:
groupByPeriod_date_blueprint_edit

Puis je change en day of the week, qui est bon:
groupByPeriod_dayOfWeek_edit

Mais ensuite, si je veux re-changer pour un autre machin, bah ça reste sur le premier que j'ai pris ; ici ça continue d'afficher en Day of The week:
groupByPeriod_date_blueprint_edit_BUG

Mood instability bug

Le calcul de mood instability semble buggy, en effet:

  • je fais une entrée avec des tags positif et négatif, le calcul qui va être fait pour cette entrée va donner une valeur + ou - en fonction de la somme des tags.
  • Si le même jour je n'ai qu'une seule entrée dans laquelle je mets des tags + et -, le résultat c'est que dans le mood instability on se retrouve avec une valeur de 0, puisque la seule entrée a uniquement une valeur finale soit positive soit négative.

La solution temporaire c'est de split les entrées en une contenant tous les tag neg, et l'autre contenant que les tag positif, mais du coup je suppose que c'est un bug :D

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.