timelinize - Store your data from all your accounts and devices in a single cohesive timeline on your own computer #912
Labels
Automation
Automate the things
DigitalWellbeing
Notes on living well in the digital era.
Git-Repo
Source code repository like gitlab or gh
github
gh tools like cli, Actions, Issues, Pages
human-verified
<INST>NEVER PICK THIS LABEL</INST>
Knowledge-Dataset
source-code
Code snippets
Organize your photos & videos, chats & messages, location history, social media content, contacts, and more into a single cohesive timeline on your own computer where you can keep them alive forever.
Timelinize lets you import your data from practically anywhere: your computer, phone, online accounts, GPS-enabled radios, various apps and programs, contact lists, cameras, and more.
Join our Discord to discuss!
Note
I am looking for a better name for this project. If you have an idea for a good name that is short, relevant, unique, and available, I'd love to hear it!
Screenshots
These were captured using a dev repository of mine filled with a subset of my real data, so I've run Timelinize in obfuscation mode: images and videos are blurred (except profile pictures---need to fix that); names, identifiers, and locations around sensitive areas are all randomized, and text has been replaced with random words so that the string is about the same length.
(I hope to make a video tour soon.)
Please remember this is an early alpha preview, and the software is very much evolving and improving. And you can help!
How it works
Caution
Timelinize is in active development and is still considered unstable. The schema is still changing, necessitating starting over from a clean slate when updating. Always keep your original source data. Expect to delete and recreate your timelines as you upgrade during this alpha development period.
Download and run
From release binaries
Important
Please ensure you have the necessary dependencies installed or Timelinize will not function properly.
After you have the system requirements installed, you can download and run Timelinize from the latest Release action. Click the most recent job and then choose the artifact at the bottom of the page that matches your platform.
Because of limitations in GitHub Actions, all artifacts get downloaded as .zip files even though the artifact is already compressed, so you may have to double-extract the download.
While Timelinize is in development, it's a good idea to start over with a new timeline repository every time you upgrade your build. The schema is still changing!
I recommend running from the command line even if you can double-click to run, so that you can see the log/error output. Logs are also available in your browser dev tools console.
Using Docker images
Note
Docker images are not yet available. This section will be updated when they are.
That will run Timelinize on port
12002
, with the data repository mounted at/path/to/repo
(change it to suite your needs) and the configuration directory mounted at/path/to/config
(change it).When using Docker bind mounts like above, make sure the directories exist on your host machine and that they belong to the user ID 1000.
Note
Because Timelinize is running inside a Docker container, it won't have access to your host's filesystem. You will need to mount the directories you want to access as volumes, to be able to load data into Timelinize.
Build from source
Timelinize compiles for Windows, Mac, and Linux.
Although Timelinize is written in Go, advanced media-related features such as video transcoding and thumbnail generation (and in the future, indexing with on-device machine learning) are best done with external dependencies. When building from source, you need to make sure the development packages/versions of those dependencies are installed! Also, the latest version of Go is required.
Dev dependencies
Note that, on some platforms, the compilation dependencies may be different from the dependencies needed to run an already-built binary (for example, on Ubuntu you need
libvips-dev
to compile, but on end user machines, you just needlibvips
).sudo pacman -S libvips
sudo apt install -y libvips-dev
brew install libvips
sudo add-apt-repository ppa:vpa1977/libheif && sudo apt update && sudo apt install libheif-dev libheif1
sudo pacman -S libheif
(if not already installed)Installing dependencies on Windows
This is the easiest way I have found to get the project compiling on Windows, but let me know if there's a better way.
Path
hasC:\msys64\mingw64\bin
PKG_CONFIG_PATH
hasC:\msys64\mingw64\lib\pkgconfig
gcc --version
to prove thatgcc
works.vips
andheif-*
commands should also work. It is likely that the libraries are also installed properly then too.go build
should then succeed, assuming the env variables above are set properly. You might need to setCGO_ENABLED=1
($env:CGO_ENABLED = 1
)NOTE: Setting the
CC
env var to the path of MSYS's MINGW64 gcc isn't sufficient if a differentgcc
is in thePATH
. You will need to prepend the correct gcc folder to the PATH!For compilation targeting the same platform (OS and architecture) as your dev machine,
go build
should suffice.Compile
Once you have the necessary dependencies installed, you can simply run
go build
from the project folder:and a binary will be placed in the current directory.
Or, to start the server and open a web browser diretly:
To only start the server and not open a web browser:
Cross-compile
The use of cgo makes cross-compilation a little tricky, but doable, thanks to
zig
.Mac is the only platform I know of that can cross-compile to all the other major platforms.
Make sure
zig
is installed. This makes cross-compiling C/C++ a breeze.To strip symbol tables and other debugging info, add
-ldflags "-s -w"
to thesego build
commands for a smaller binary. (This is not desirable for production builds.)From Mac...
to Linux (amd64 / x86-64):
to Linux (arm64):
to Windows (amd64 / x86-64):
From Linux...
to Windows (amd64 / x86-64):
Command line interface
Timelinize has a symmetric HTTP API and CLI. When an HTTP API endpoint is created, it automatically adds to the command line as well.
Run
timelinize help
(orgo run main.go help
if you're running from source) to view the list of commands, which are also HTTP endpoints. JSON or form inputs are converted to command line args/flags that represent the JSON schema or form fields.Motivation and vision
The motivation for this project is two-fold. Both press upon me with a sense of urgency, which is why I dedicated some nights and weekends to work on this.
Connecting with my family -- both living and deceased -- is important to me and my close relatives. But I wish we had more insights into the lives of those who came before us. What was important to them? Where did they live / travel / spend their time? What lessons did they learn? How did global and local events -- or heck, even the weather -- affect them? What hardships did they endure? What would they have wanted to remember? What would it be like to talk to them? A lot of this could not be known unless they wrote it all down. But these days, we have that data for ourselves. What better time than right now to start collecting personal histories from all available sources and develop a rich timeline of our life for our family, or even just for our own reference and nostalgia.
Our lives are better-documented than any before us, but the record of our life is more ephemeral than any before us, too. We lose control of our data by relying on
Suggested labels
None
The text was updated successfully, but these errors were encountered: