A RELATIONSHIP SHARING EXPERIMENT

人们习惯说相信
可我想要看见真相

always 是一个围绕“关系中的状态共享”展开的实验型产品。 你可以自建后端、部署自己的数据库,再用 Android 客户端去连接关系、同步状态、 查看通知镜像和关系总结。

INTRODUCTION

一套围绕关系共享、状态同步与自建部署展开的完整方案

01

自建部署

通过 Docker 在任意机器启动后端服务,数据库和环境变量由你自己掌控。

02

关系绑定

以关系为核心串联双方设备,让后续状态、通知和总结都有明确的同步对象。

03

状态快照

采集并同步设备状态,形成可被查看、回溯和总结的状态记录。

04

定位申请

不是默认暴露位置,而是通过请求与授权流转来明确边界和权限。

05

通知镜像

在授权前提下同步通知摘要,把“最近发生了什么”变成可阅读的信息流。

06

关系总结

把一段时间内的状态、申请和事件收束成更容易理解的关系概览。

DEPLOYMENT PATHS

两种常用启动方式,按你的机器环境和协作方式来选

Recommended

方式 A:本机 PostgreSQL + Docker 后端容器

最适合本机开发与快速联调。数据库继续跑在宿主机上, 后端镜像通过环境变量连接它,容器启动时会自动执行 migration。

docker pull xanxushu/always-backend:latest
docker run --rm -p 3000:3000 ^
  -e DATABASE_URL="postgresql://postgres:postgres@host.docker.internal:5432/always" ^
  -e JWT_ACCESS_SECRET="your-access-secret" ^
  -e JWT_REFRESH_SECRET="your-refresh-secret" ^
  xanxushu/always-backend:latest
  • 上手最快
  • 适合单机开发
  • 本机 PostgreSQL 直接复用
Shareable

方式 B:Docker Compose 同时启动 backend + postgres

更适合给同事、测试同学或异地机器复用。整套依赖一起启动, 迁移和依赖关系更统一,也更不容易漏配。

services:
  postgres:
    image: postgres:16-bookworm
    restart: unless-stopped
    environment:
      POSTGRES_DB: always
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres
    ports:
      - "5432:5432"
    volumes:
      - postgres-data:/var/lib/postgresql/data

  backend:
    image: xanxushu/always-backend:latest
    restart: unless-stopped
    depends_on:
      - postgres
    environment:
      DATABASE_URL: postgresql://postgres:postgres@postgres:5432/always
      JWT_ACCESS_SECRET: your-access-secret
      JWT_REFRESH_SECRET: your-refresh-secret
    ports:
      - "3000:3000"

volumes:
  postgres-data:
  • 更适合协作共享
  • 数据库卷持久化
  • 部署路径更稳定

HOW TO RUN

从拉取镜像到真机联调,保持最短但完整的路径

1

拉取镜像

先拉取 `xanxushu/always-backend:latest`,确保拿到最新修复过 migration 的版本。

2

准备数据库

可以用本机 PostgreSQL,也可以用独立 postgres 容器,关键是 `DATABASE_URL` 可连通。

3

传入环境变量

至少要有 `DATABASE_URL`、`JWT_ACCESS_SECRET`、`JWT_REFRESH_SECRET`,变量多时建议用 `--env-file`。

4

启动容器并看日志

容器会先执行 `prisma migrate deploy`,确认日志里没有 pending error 后再联调客户端。

5

连接 Android 真机

真机不要填 `localhost`,要填宿主机局域网 IP,例如 `192.168.x.x:3000`。

ANDROID

更接近真实客户端的页面展示

Always Android Concept Preview

Relationship Sharing

一个把关系、状态、通知与总结串起来的 Android 客户端

这里不追求还原真实界面,而是用一块更简洁的展示板, 把客户端的几个核心功能和信息流关系讲清楚。

状态快照 定位申请 通知镜像

Home

当前状态

展示最近一次同步结果、电量、网络、位置和共享状态。

未同步 电量 网络

Notify

通知中心

把最近同步过来的通知摘要整理成可查看、可追溯的入口。

Timeline

时间线

把关系事件、申请处理和状态变更串成一条连续记录。

Summary

关系总结

将一段时间内的数据浓缩成更容易理解的阶段性总结。

Android 下载

安装客户端后,填入你的后端地址和账号配置,就可以体验关系绑定、 状态同步、时间线和总结等功能。

当前展示风格按你提供的客户端截图进行了重新拟合,整体更接近真实界面。

联调提示

  • 真机不要填 `localhost`,请填宿主机局域网 IP。
  • 确认防火墙已放行后端监听端口,例如 `3000`。
  • 如果换了镜像版本,建议先 `docker pull` 再重建容器。

NOTES & THOUGHTS

项目说明不只是教程,也应该包含你的判断、想法与路线感

Viewpoint

为什么要做 GitHub Pages

README 更像仓库说明,GitHub Pages 更像项目门面。 它能更直观地告诉别人这个项目是什么、做到哪一步了,以及如何开始体验。

Product

为什么页面里要保留产品感

如果只有技术步骤,别人看见的是部署流程;如果还有界面、语气和设计, 别人看见的才是一个逐渐成形的产品。

Future

后续还能继续加什么

你后面可以继续补 APK 更新记录、Release Timeline、功能截图、 设计想法、Roadmap,甚至把自己的碎碎念写成长期更新栏目。