Other pages: FAQ
This Page
Tutorial video
Getting Started
Lifesheets are custom micro-journaling applications that allow you to record a series of dated events about your life (or your loved ones lives, e.g. data about your children’s development). In addition to collecting data that you enter, Lifesheets also allow you to do calculations on that data, and to visualize the data using graphs.
Here is an example lifesheet used to track blood pressure over time. This one has 5 entries:
Note: Under the hood, Lifesheets are standalone Mavo applications. However, you don’t need to know Mavo, or HTML & CSS to create them; that’s what the Lifesheets app is for!
Data & storage
You use lifesheets to manually record data about an aspect of your or your loved ones' life. When you use a lifesheet to enter data, the data is not saved until you click "Save".
Why do I need to save manually? Why doesn’t my lifesheet just autosave?
This is because every time you save, lifesheets creates an entry in the history of your saved data, that you could use if you need to ever restore previous data (e.g. if you accidentally delete entries). Do note that restoring previous data is not yet exposed through the lifesheets interface. In the event that you need to restore past data, you would need to either contact us. If you know of any programmers, they could do it too (just tell them you need to "restore a past git commit").
Both lifesheets you create, as well as the data they record, are stored on a site called GitHub. You also need a GitHub account to log in to Lifesheets.
You may have used services like Dropbox or Google Drive. GitHub is similar to those, but it also records all the different versions of your data over time (version control) and allows publishing the stored files as a website, which is why Lifesheets uses it as a backend.
Lifesheets uses GitHub to store both the applications you create, as well as the data you save when using these applications. This means that unlike commercial tracking apps, even if Lifesheets goes away at some point, your trackers will continue to work, as you fully own them, they are standalone applications stored in your own GitHub account, not some proprietary system that we control.
Read and edit mode
Each lifesheet application has two modes: A read mode and an edit mode. If you are logged in, it will automatically start in edit mode, to facilitate input. If not, it will be in read mode. This is primarily useful in public sheets, to share data with other people in a nice presentable format. On private sheets, you will likely be spending most of your time in edit mode.
Entries
Each lifesheet contains a list of entries. These are the actual dated life events that you are tracking. For example, in our blood pressure tracker, the entries are the blood pressure measurements.
How do I customize the noun used for entries?
By default entries are just called "entry" (plural: "entries") but you can customize that in the "Main info" panel:
Entries are composed of little building blocks called fields. Fields store data (properties), display calculations (expressions), or can even modify other fields programmatically (actions).
The four temporal categories of trackers
In the preliminary research we did to create Lifesheets, we saw that most tracking use cases fall into 4 main categories regarding their handling of time:
- Single date Each entry includes a single date, and no other temporal information.
These are most suitable for infrequent events, or events that are only expected to occur maximum once per day, and the time they occur is not relevant.
Examples of such trackers could be:
- Child milestones
- Medical exam results
- Monthly injections
- Expenses
- Range of dates Each entry includes a (start) date, and an end date, with no time information.
These are most suitable for events that occupy a range, but for which times are irrelevant.
Examples of such trackers:
- Menstruation
- Single date & time Each entry includes a single date, and a time.
These are most suitable for events that do not have a duration, but for which time is still relevant.
Examples of such trackers:
- Blood sugar for diabetes patients
- Seizures for epilepsy sufferers
- Range of dates & times Each entry includes a (start) date and time, and an end date and time.
These are most suitable for events that both have a duration, and for which time matters.
Examples of such trackers:
- Sleep
- Child nursing session
Lifesheets supports all four main types of trackers. New sheets start off as Single date but you can select the right type in the Dates & Times settings (Main Info panel):
Note that the same type of tracker may belong to a different temporal category for different people, depending on what matters to you, and how frequently you plan to use the tracker you are creating. For example, someone tracking their blood sugar results from their periodic medical tests may opt to only have dates, since the event is infrequent enough that times don't matter. However, a diabetic that measures their blood sugar several times a day would opt to have times as well. As another example, someone tracking trips may decide that it's the dates that matter, and only track start and end date, or they may decide to track more details, such as times as well.
You can change between temporal categories for your tracker at any point, even after you have tracked data. Any data you have entered will be preseved, even if it’s not displayed due to a change in temporal settings (e.g. if you change from a date range to a single date, the end dates you have already entered will be preserved and will still be shown if you change back to date range in the future).
Fields
Each entry contains a list of fields ("Entry fields"). Fields are little building blocks. There are four different types of fields:
- Properties are for the information you want to store. Each property has a name that you can use to refer to it in other places.
- Expressions are for displaying calculations and other dynamic information (similar to spreadsheet formulas). You can use the values of your properties in expressions by simply using their name. Expressions can also optionally have a name, which is useful when you need to use them in other expressions.
- Actions are buttons that set property values on one or more entries you specify. They can even create new entries and set values on them (or not).
- Spacers allow you to control how your other fields are laid out, by inserting space or line breaks between them.
The lifesheet itself can also contain fields ("General fields"), which can be useful for aggregate calculations (e.g. averages), general settings (e.g. "child's date of birth"), or general actions (e.g. "Add new entry with type = 'a'").
Each type of field can exist both on entries (entry field), as well as on the lifesheet itself (general field).
Auto-generated fields
Every lifesheet starts with four fields, three on entries and one general field:
Two of them are:
- The notes (property) field is for any additional context that may not be tracked through other fields. It is auto-added since it's so common on so many trackers, but you can remove it if you don’t need notes.
- A general action for adding new entries (without overridding any values on them).
There are also two fields related to dates and times:
- weekday (expression) for showing the day of the week for the date you have selected. You can delete it if you don’t want to show that.
- date (property) for tracking the date of the event.
When you change the temporal category of your tracker, you will get more or fewer of these:
If you are tracking times, you also get:
- time (property)
- date_time (expression) which combines the values of date and time in one value that you can use in various calculations (e.g. durations). Since this is primarily intended for use in other expressions, it is hidden.
If you are tracking ranges of dates, you also get:
- end_date (property) for the end date
- duration (expression) The number of milliseconds between the start and end date (you can use this in various other date & time functions to present it nicely)
- duration_readable (expression) This presents the difference between the two dates in a suitable human readable format (e.g. "2 days, 4 hours").
If you are tracking both ranges and times, you also get:
- end_date_time (property) that combines end_date and end_time, similarly to how date_time combines date and time. Since this is primarily intended for use in other expressions, it is hidden.
Other properties have different behavior when tracking date/time ranges, compared to just date ranges:
- end_date is hidden unless an end_time is specified. Even then, in most cases it is automatically computed from the start date and the times. It is only shown in edit mode, unless it has a different value than the automatically predicted one.
- The duration and duration_readable expressions use date_time and end_date_time instead of date and end_date
Always select the right temporal category, rather than trying to add your own date & time properties. There is logic in these auto-generated fields (e.g. when to hide them, default values etc) that you would have to manually re-create in that case. Only add your own date & time properties if you need to track additional temporal data.
Properties
Properties are the core of each tracker: they hold the actual data you are storing. They take many different forms: numbers, text, toggles, even images and videos! Once you add a new property you can select what data it should hold from the top of the "Edit property" panel:
Default values
One way to make your lifesheet very fast to use, is to set appropriate default values. A default value is the value a property will have when you create a new entry, before you edit it.
These can be either literal values or expressions that set the default value based on the values of other properties. When the default value is an expression, it updates when the properties it depends on update (a bit like an Expression field that you can also edit). Sometimes, the Lifesheets editor will suggest presets that are expressions, e.g. for entry properties, the previous or next value:
The auto-generated temporal properties are already set up with suitable default values, for example date defaults to today's date
but you can change it to another preset, or an entirely different expression (or value):
For example, the auto-generated end_date field when you are tracking date/time ranges has a default value that is a pretty complicated expression:
if(end_time, if(end_time < time, date(date + 1 * days()), date))
What does this do? First, the outer if()
ensures there is a default value only when end_time is set.
Then, the inner if()
says that the default value is the day after date if the end_time is smaller than time,
otherwise the default is the same as the date value of the same entry.
Default value presets are always expressions, so after you select one, default value text field will be in expression mode. If you want to enter literal values, make sure to click the 𝑓𝑥 icon to toggle it back into literal mode:
Expressions
Expressions allow you to dynamically display calculations and other dynamic information. If you have used spreadsheets (e.g. Excel, Google Sheets, Apple Numbers) you are already familiar with the concept of expressions ("formulas").
Unlike spreadsheets where you use column or cell references like "B5" to refer to values, in Lifesheets you use the field names you specified. Every property has a name, and thus can be used in expressions. You can optionally name expressions as well, to use them in other expressions.
How do I write expressions? What are functions, operators, and special properties?
- Just like spreadsheet functions, functions consist of a function name, parentheses and function arguments.
E.g.
count(entry)
orif(intensity > 3, 'strong', 'mild')
orsqrt(intensity)
which count the number of entries, produce a human-readable string from a numeric intensity, and calculate a square root, respectively. - Just like spreadsheet functions, There are operators, which allow you to perform certain calculations more succinctly.
E.g. to subtract two numbers you can write
subtract(a, b)
, but you can also just writea - b
. - There are also special properties, which are predefined property names. To distinguish them from regular properties, they start with a
$
. For example:$previous
and$next
get you the previous entry (chronologically)$index
gets you the numerical index of the current entry$now
gives you a number that represents the current time (in milliseconds since January 1st, 1970). It is not very useful by itself, but you can use it in any function that expects milliseconds, or in calculations (e.g.duration($now - date)
presents the time passed sincedate
in a nice human readable duration like e.g. "1 day" or "3 weeks")
For many types of expressions thta are common to trackers, you will not need to compose them manually. Instead, you could simply use one of the "Quick add" widgets:
You can search all available functions, operators, and special properties in the integrated function browser that you can access when you click on any expression text field:
In addition to the value of expression fields, you can also write expressions in many other places. When a setting supports entering an expression, instead of a plain text field you will see a text field with a T symbol on the right. You can click the T symbol to switch to writing an expression instead of a plain text value:
Notice that the text field now gets a light green background and the icon on the right changed to an 𝑓𝑥. The 𝑓𝑥 symbol means that the content is interpreted as an expression, and the light green background tells us that the expression was checked and seems correct. If there are errors (e.g. a missing parenthesis), the field will become red instead, and an error will be shown.
Some settings expect an expression by default, in which case the field will be in expression mode from the beginning. Similarly, you can click the 𝑓𝑥 symbol to change the text field back to plain text mode.
Actions
Actions are buttons that actually modify your entered data. Any modifications are temporary, until you actually Save.
There are two types of actions:
- Set/Add which can add new entries, and/or set values on either existing entries or new entries.
- Delete which delete certain entries that you target.
Why would we set values through an action when we can have default values? One reason is that sometimes there may not be a clear default. With actions, we can create several buttons, each of which creates new items with different values.
Spacers
The last type of field, spacers, are for controlling where the other fields are placed. They can help act as a divider, to move all fields after the spacer to the right of the row, or to create new lines, so that fields after them have their own separate row.
Charts
Charts allow you to get an overview of your data grouped in a certain way. If you’re familiar with spreadsheets, think of them like pivot tables.
There are several types of chart presentation (bar chart, pie chart etc). Every chart starts off as a table by default, so you can easily make sure you are displaying the correct data.
You add a chart by clicking on the + button in the Charts panel. Then you create your chart by selecting three main things:
- Which values to combine (e.g. systolic pressure in the blood pressure example)
- How to group them, e.g. "per month" combines those that are in the same month. Possibly the most common grouping is temporal (e.g. by day, by month etc) but you can also group them by the values of another property (i.e. combine those that have the same value for a given property)
- How to combine values within the same group (e.g. count, sum, average etc). Even if you don’t plan to have multiple entries in the same group (e.g. you are creating a bar chart of a property by day and you only plan to have one entry per day), Lifesheets still needs to be able to handle the case where you have more than one entry.