在您自己的计算机上将照片和视频、聊天记录和消息、位置历史、社交媒体内容、联系人等整理成一个连贯的时间线,让它们永久保存。
Timelinize让您可以从几乎任何地方导入数据:您的计算机、手机、在线账户、GPS设备、各种应用程序、联系人列表、相机等。
加入我们的Discord 一起讨论!
[!注意] 我正在为这个项目寻找一个更好的名字。如果您有一个简短、相关、独特且可用的好名字想法,我很乐意听听!
截图
这些截图来自我的开发仓库,其中包含了我部分真实数据的子集,因此我在运行Timelinize时使用了模糊处理模式:图像和视频被模糊处理(除了头像——需要修复);敏感区域周围的名称、标识符和位置都被随机化,文本被替换为随机词语,保持大致相同的长度。
(我希望能尽快制作一个视频导览。)
请记住,这是一个早期的alpha预览版,软件正在不断发展和改进。您也可以参与其中!
工作原理
获取您的数据。 这通常涉及从应用程序、在线账户或设备导出数据。例如,从Google Takeout请求存档。(Apple iCloud、Facebook、Twitter/X、Strava、Instagram等都提供类似的GDPR合规功能。)尽早进行这一步,因为某些服务可能需要几天时间才能提供您的数据。 使用Timelinize导入您的数据。您无需解压.tar或.zip压缩包;Timelinize会尝试以原始格式和文件夹结构识别您的数据。所有导入的数据都会被索引到SQLite数据库中,并按日期存储在磁盘上,不进行混淆或复杂处理。 探索和组织!Timelinize提供了一个用各种投影和过滤器呈现数据的用户界面。它可以回忆您过去的时刻,帮助您更全面地查看您的生活。(这是一个很好的实时家族历史工具。) 根据需要重复步骤1-3。Timelinize会跳过任何相同的现有数据,只导入新内容。对于您最重要的活跃账户,您可以每隔几周或几个月进行一次更新。[!注意] Timelinize正在积极开发中,仍被视为不稳定版本。架构仍在变化,这意味着在更新时需要从头开始重新创建。请始终保留您的原始源数据。在这个alpha开发期间,请预期在升级时需要删除并重新创建您的时间线。
下载和运行
[!重要] 请确保您已安装必要的依赖项,否则Timelinize将无法正常运行。 安装系统要求后,您可以从最新的Release操作下载并运行Timelinize。点击最近的任务,然后在页面底部选择与您平台相匹配的产物。
由于GitHub Actions的限制,所有产物都会以.zip文件形式下载,即使产物本身已经压缩过。因此,您可能需要对下载内容进行二次解压。
在Timelinize开发期间,每次升级构建时最好从新的时间线仓库重新开始。因为模式仍在变化!
我建议即使可以双击运行,也从命令行运行,这样您可以看到日志/错误输出。日志也可以在浏览器开发者工具控制台中查看。
从源代码构建
Timelinize可以编译用于Windows、Mac和Linux。
尽管Timelinize是用Go编写的,但像视频转码和缩略图生成这样的高级媒体相关功能(未来还会有设备内机器学习索引)最好使用外部依赖来完成。从源代码构建时,您需要确保安装了这些依赖的开发包/版本!另外,需要安装最新版本的Go。
开发依赖
注意,在某些平台上,编译依赖可能与运行已构建二进制文件所需的依赖不同(例如,在Ubuntu上编译需要libvips-dev,但在最终用户机器上只需要libvips)。
Go(最新版本;不要使用Debian或Ubuntu包管理器) ffmpeg(可执行文件必须在PATH中) libvips-dev Arch: sudo pacman -S libvips Ubuntu: sudo apt install -y libvips-dev macOS: brew install libvips libheif(我认为安装libvips时有时会自动安装libheif) Ubuntu: sudo add-apt-repository ppa:vpa1977/libheif && sudo apt update && sudo apt install libheif-dev libheif1 Arch: sudo pacman -S libheif(如果尚未安装) 在Windows上安装依赖这是我发现在Windows上编译项目最简单的方法,但如果有更好的方法请告诉我。
确保您没有已安装的MSYS2,且C:\msys64不存在。 安装MSYS2:https://www.msys2.org/ - 安装后不要运行,因为它可能会打开错误的shell(UCRT;我们需要MINGW64 - 是的,UCRT被推荐为更现代的选择,但我不确定我们的依赖是否作为UCRT包可用)。 运行MSYS2 MINGW64应用程序(这是MSYS2的MINGW64环境)。 安装mingw64及相关工具、libvips和libheif:pacman -S --needed base-devel mingw-w64-x86_64-toolchain mingw-w64-x86_64-libvips mingw-w64-x86_64-libheif 转到Windows账户的环境变量设置,确保: Path包含C:\msys64\mingw64\bin PKG_CONFIG_PATH包含C:\msys64\mingw64\lib\pkgconfig 重启任何运行中的程序/终端/shell,然后运行gcc --version验证gcc是否正常工作。vips和heif-*命令也应该可以使用。这样库也很可能正确安装了。 假设上述环境变量设置正确,运行go build应该就能成功。您可能需要设置CGO_ENABLED=1($env:CGO_ENABLED = 1)
注意:如果PATH中存在其他gcc,仅设置CC环境变量为MSYS的MINGW64 gcc路径是不够的。您需要将正确的gcc文件夹添加到PATH的最前面!
对于针对与开发机器相同平台(操作系统和架构)的编译,go build就足够了。
编译
安装必要的依赖后,您可以在项目文件夹中简单地运行go build:
$ go build
二进制文件将被放置在当前目录中。
或者,直接启动服务器并打开网页浏览器:
$ go run main.go
仅启动服务器而不打开网页浏览器:
$ go run main.go serve
交叉编译
使用cgo使交叉编译变得有点棘手,但多亏了zig,这是可行的。
Mac是我所知道的唯一可以交叉编译到所有其他主要平台的平台。
确保安装了zig。这使得交叉编译C/C++变得非常容易。
要删除符号表和其他调试信息,可以在这些go build命令中添加-ldflags "-s -w"以获得更小的二进制文件。(这对生产构建不是理想选择。)
从Mac... 编译到Linux(amd64 / x86-64):CGO_ENABLED=1 GOOS=linux GOARCH=amd64 CC="zig cc -target x86_64-linux" CXX="zig c++ -target x86_64-linux" go build 编译到Linux(arm64):
CGO_ENABLED=1 GOOS=linux GOARCH=arm64 CC="zig cc -target aarch64-linux" CXX="zig c++ -target aarch64-linux" go build 编译到Windows(amd64 / x86-64):
CGO_ENABLED=1 GOOS=windows GOARCH=amd64 CC="zig cc -target x86_64-windows" CXX="zig c++ -target x86_64-windows" go build 从Linux... 编译到Windows(amd64 / x86-64):
CGO_ENABLED=1 GOOS=windows CC="zig cc -target x86_64-windows" CXX="zig c++ -target x86_64-windows" go build
命令行界面
Timelinize具有对称的HTTP API和CLI。当创建HTTP API端点时,它会自动添加到命令行中。
运行timelinize help(或者如果您从源代码运行,则使用go run main.go help)查看命令列表,这些命令也是HTTP端点。JSON或表单输入会转换为表示JSON模式或表单字段的命令行参数/标志。
Linux, macOS$ wails dev Windows
$env:CC="zig cc"; $env:CXX="zig c++"; wails dev
或者,如果是跨平台编译:
> $env:CC="zig cc -target x86_64-windows"; $env:CXX="zig c++ -target x86_64-windows"; wails dev
动机和愿景
这个项目的动机有两个方面。两者都给我带来了一种紧迫感,这就是为什么我会花一些晚上和周末的时间来开发这个项目。
与家人——包括在世的和已故的——保持联系对我和我的近亲来说很重要。但我希望我们能更多地了解那些先人的生活。对他们来说什么是重要的?他们住在哪里/旅行过哪里/在哪里度过他们的时光?他们学到了什么教训?全球和地方事件——甚至天气——如何影响他们?他们经历了什么艰难?他们会想记住什么?和他们交谈会是什么感觉?除非他们把这一切都写下来,否则我们无法得知。但如今,我们自己就拥有这些数据。还有什么比现在更好的时机来开始从所有可用的来源收集个人历史,为我们的家人,甚至仅仅为了我们自己的参考和怀旧而发展出丰富的人生时间线呢?
我们的生活比以往任何时候都更有记录,但我们生活的记录也比以往任何时候都更加短暂。通过依赖当前有用但明天可能就消失的集中式、专有的应用程序和云服务,我们失去了对自己数据的控制。我编写Timelinize是因为现在是时候从那些不拥有我们数据却拥有唯一副本的公司手中解放我们的数据了。这个现实已经让我多年来感到不安,而且这种情况短期内不会消失。Timelinize让这种情况变得可以接受。
想象一下,能够在离线状态下,在一个单一的屏幕上查看你来自任何和所有在线账户和服务的数据。在那里,你可以一目了然地看到你生活的诸多方面:你的照片和视频、社交媒体帖子、地图上的位置和你如何到达那里、电子邮件和信件、文件、健康和体育活动、心理和情感健康,甚至可能是你在任何给定日子里听的音乐。你可以"缩小"以获得全局视图。机器学习算法可以根据你的内容建议主要集群来总结你的日、月或年,并基于此,甚至推荐打印实体纪念品。这就像一个高度详细的、自动化的日记,完全由你控制,你可以在应用程序中添加内容:像普通日记一样用你自己的想法来增补它。
然后将你自己的时间线与全球公共时间线交叉参考:看看你去过的地方如何随时间变化,或者哪些重大新闻事件可能影响了你,或者当时的政治/社会气候——或者实际气候——是什么样的。例如,你可能会想,"为什么家人在某一年的夏天大部分时间都呆在室内?"然后你可能会发现,"哦,因为连续两个月气温都在110华氏度(43摄氏度)。"
或者将投影转向侧面,不看时间横截面,而是看你时间线的不同媒体类型的横截面:照片、帖子、位置、情感。查看你的体育活动的图表、图形。
或者按空间而不是时间查看投影:在地图上查看项目之间的相互关系,甚至包括那些没有位置数据的项目,因为数据库是实体感知的。所以如果一个人收到了一条短信,而同一个人在大约同一时间从照片或GPS设备获得了位置信息,那么这条短信也可以出现在地图上,提醒你在哪里首次收到了关于你侄子出生的消息。
所有这些都在你自己的电脑上运行:没有其他人可以访问它,没有其他人拥有它,只有你。
如果每个人都有自己的时间线,理论上它们可以合并成一个全球超级时间线,成为人类的详细记录,而无需将我们的数据集中在由贪婪的公司控制的云服务上。
历史
我从2013年左右就开始研究这个项目了,甚至在我构思Caddy之前。我最初的设想是创建一个我可以存储在自己硬盘上的Picasa相册的自动备份。这个项目被称为Photobak。Picasa最终变成了Google Photos,大约在同一时间,我意识到我也想备份我发布在Facebook、Instagram和Twitter上的照片。既然如此,为什么不也包括我的Google位置历史来增强照片的位置数据呢?随着我意识到我的家人也可以使用这个,愿景继续扩大,因此模式升级以支持多个人/实体。这可以让我们在家庭成员去世时,或者他们相互分享部分时间线时合并数据库或时间线。Timelinize是原始项目的成熟演变,现在设计为通过数字(或数字化)内容对一个人的生活进行全面、高度详细的存档。一个权威的、统一的记录,易于保存和组织。
许可证
这个项目使用AGPL许可。我选择这个许可证是因为我不希望其他人使用这个包来制作专有或商业软件。这个项目的目的是解放和控制一个人自己的个人数据,我想确保这个项目不会被用于任何可能延续我们今天已经面临的封闭花园困境的东西。即使这个项目的未来可能有专有源代码,我也可以确保它会保持与我的价值观和项目的原始目标一致。