wakapi

wakapi

兼容WakaTime的自托管代码统计工具

Wakapi是一个开源的代码统计工具,兼容WakaTime并支持自托管。它能统计项目、编程语言、编辑器、主机和操作系统的使用情况,提供数据徽章、每周邮件报告和REST API。Wakapi运行速度快,适合开发者追踪编码时间和分析工作效率。

Wakapi编程统计自托管开源WakaTimeGithub开源项目
<p align="center"> <img src="https://yellow-cdn.veclightyear.com/835a84d5/332a92ab-15e9-4ea2-b466-9646cafe6df1.svg" width="350"> </p> <p align="center"> <img src="https://badges.fw-web.space/github/license/muety/wakapi"> <a href="https://liberapay.com/muety/"><img src="https://yellow-cdn.veclightyear.com/835a84d5/ce0949b4-191d-4e8c-914c-3bde67ab9755.svg?logo=liberapay"></a> <img src="https://wakapi.dev/api/badge/n1try/interval:any/project:wakapi?label=wakapi"> <img src="https://badges.fw-web.space/github/languages/code-size/muety/wakapi"> <a href="https://goreportcard.com/report/github.com/muety/wakapi"><img src="https://goreportcard.com/badge/github.com/muety/wakapi"></a> <a href="https://sonarcloud.io/dashboard?id=muety_wakapi"><img src="https://sonarcloud.io/api/project_badges/measure?project=muety_wakapi&metric=ncloc"></a> </p> <h3 align="center">一个极简主义的、自托管的、兼容WakaTime的编码统计后端。</h3> <div align="center"> <h3> <a href="https://wakapi.dev">网站</a> <span> | </span> <a href="#-features">特性</a> <span> | </span> <a href="#%EF%B8%8F-how-to-use">如何使用</a> <span> | </span> <a href="https://github.com/muety/wakapi/issues">问题</a> <span> | </span> <a href="https://github.com/muety">联系</a> </h3> </div> <p align="center"> <img src="https://yellow-cdn.veclightyear.com/835a84d5/80b4bfb2-e56b-4292-979e-f97b3173353c.webp" width="500px"> </p>

安装说明可以在下方和Wiki中找到。

🚀 特性

  • ✅ 免费开源
  • ✅ 由开发者为开发者打造
  • ✅ 支持项目、语言、编辑器、主机和操作系统的统计
  • ✅ 徽章
  • ✅ 每周电子邮件报告
  • ✅ REST API
  • ✅ 部分兼容WakaTime
  • ✅ WakaTime集成
  • ✅ 支持Prometheus导出
  • ✅ 极速运行
  • ✅ 自托管

⌨️ 如何使用?

Wakapi有多种使用方式,从我们托管的云服务到自托管。无论您选择哪种方式,都需要额外进行客户端设置

☁️ 方式1:使用wakapi.dev

如果您想尝试免费的托管云服务,只需创建一个账户,然后设置客户端工具(见下文)。

📦 方式2:快速运行发布版本

$ curl -L https://wakapi.dev/get | bash

或者使用eget

$ eget muety/wakapi

🐳 方式3:使用Docker

# 创建持久卷 $ docker volume create wakapi-data $ SALT="$(cat /dev/urandom | LC_ALL=C tr -dc 'a-zA-Z0-9' | fold -w ${1:-32} | head -n 1)" # 运行容器 $ docker run -d \ -p 3000:3000 \ -e "WAKAPI_PASSWORD_SALT=$SALT" \ -v wakapi-data:/data \ --name wakapi \ ghcr.io/muety/wakapi:latest

注意: 默认使用SQLite作为数据库。要在Docker中使用MySQL或Postgres运行Wakapi,请参阅Dockerfileconfig.default.yml了解更多选项。

如果您想在Kubernetes上运行Wakapi,可以使用wakapi-helm-chart快速轻松部署。

🧑‍💻 方式4:从源代码编译并运行

# 构建并安装 # 或者:go build -o wakapi $ go install github.com/muety/wakapi@latest # 获取默认配置并自定义 $ curl -o wakapi.yml https://raw.githubusercontent.com/muety/wakapi/master/config.default.yml $ vi wakapi.yml # 运行 $ ./wakapi -config wakapi.yml

注意: 查看config.yml中的注释,了解安全配置等最佳实践。

💡 独立运行Wakapi(不使用Docker)时,建议将其作为SystemD服务运行。

💻 客户端设置

Wakapi依赖开源的WakaTime客户端工具。要为Wakapi收集统计数据,您需要设置这些工具。

  1. 为您的特定IDE或编辑器设置WakaTime。请参考相应的插件指南
  2. 按如下方式**编辑您本地的~/.wakatime.cfg**文件。
[settings] # 您的Wakapi服务器URL或使用云服务器时的'https://wakapi.dev/api' api_url = http://localhost:3000/api # 您的Wakapi API密钥(创建账户后从网页界面获取) api_key = 406fe41f-6d69-4183-a4cc-121e0c524c2b

此外,您还可以设置客户端代理

🔧 配置选项

您可以通过配置文件(默认:config.yml,可通过-c参数自定义)或环境变量指定配置选项。以下是所有选项的概览。

YAML 键 / 环境变量默认值描述
env /<br>ENVIRONMENTdev是否使用开发或生产设置
app.leaderboard_enabled /<br>WAKAPI_LEADERBOARD_ENABLEDtrue是否启用公共排行榜
app.leaderboard_scope /<br>WAKAPI_LEADERBOARD_SCOPE7_days公共排行榜的聚合间隔(参见此处允许的值)
app.leaderboard_generation_time /<br>WAKAPI_LEADERBOARD_GENERATION_TIME0 0 6 * * *,0 0 18 * * *重新计算排行榜的一个或多个时间点
app.aggregation_time /<br>WAKAPI_AGGREGATION_TIME0 15 2 * * *定期为所有用户生成摘要的时间点
app.report_time_weekly /<br>WAKAPI_REPORT_TIME_WEEKLY0 0 18 * * 5发送电子邮件报告的星期和时间
app.data_cleanup_time /<br>WAKAPI_DATA_CLEANUP_TIME0 0 6 * * 0执行数据清理操作的时间(参见 app.data_retention_months
app.import_enabled /<br>WAKAPI_IMPORT_ENABLEDtrue是否允许从 WakaTime 或其他 Wakapi 实例导入数据
app.import_batch_size /<br>WAKAPI_IMPORT_BATCH_SIZE50从外部服务导入时插入数据库的心跳批次大小
app.import_backoff_min /<br>WAKAPI_IMPORT_BACKOFF_MIN5用户可以尝试再次数据导入前的"冷却"期(分钟)
app.import_max_rate /<br>WAKAPI_IMPORT_MAX_RATE24成功数据导入后用户可以尝试另一次导入的最小等待小时数
app.inactive_days /<br>WAKAPI_INACTIVE_DAYS7将用户视为不活跃的天数(仅用于指标)
app.heartbeat_max_age /<br>WAKAPI_HEARTBEAT_MAX_AGE4320h心跳可接受的最大年龄(参见 ParseDuration
app.custom_languages-文件扩展名到语言名称的映射
app.avatar_url_template /<br>WAKAPI_AVATAR_URL_TEMPLATE(参见 config.default.yml外部用户头像图片的 URL 模板(例如来自 DicebearGravatar
app.date_format /<br>WAKAPI_DATE_FORMATMon, 02 Jan 2006格式化人类可读日期的 Go 时间格式字符串(参见 Time.Format
app.datetime_format /<br>WAKAPI_DATETIME_FORMATMon, 02 Jan 2006 15:04格式化人类可读日期时间的 Go 时间格式字符串(参见 Time.Format
app.support_contact /<br>WAKAPI_SUPPORT_CONTACThostmaster@wakapi.dev在页面上显示为支持联系方式的电子邮件地址
app.data_retention_months /<br>WAKAPI_DATA_RETENTION_MONTHS-1用户数据(心跳)的最大保留期(月)(-1 表示无限制)
app.max_inactive_months /<br>WAKAPI_MAX_INACTIVE_MONTHS12删除无数据用户账户的最大不活跃月数(-1 表示无限制)
server.port /<br> WAKAPI_PORT3000监听端口
server.listen_ipv4 /<br> WAKAPI_LISTEN_IPV4127.0.0.1监听的 IPv4 网络地址(设置为 '-' 以禁用 IPv4)
server.listen_ipv6 /<br> WAKAPI_LISTEN_IPV6::1监听的 IPv6 网络地址(设置为 '-' 以禁用 IPv6)
server.listen_socket /<br> WAKAPI_LISTEN_SOCKET-监听的 UNIX 套接字(设置为 '-' 以禁用 UNIX 套接字)
server.listen_socket_mode /<br> WAKAPI_LISTEN_SOCKET_MODE0666创建 UNIX 套接字的权限模式
server.timeout_sec /<br> WAKAPI_TIMEOUT_SEC30请求超时时间(秒)
server.tls_cert_path /<br> WAKAPI_TLS_CERT_PATH-SSL 服务器证书路径(留空表示不使用 HTTPS)
server.tls_key_path /<br> WAKAPI_TLS_KEY_PATH-SSL 服务器私钥路径(留空表示不使用 HTTPS)
server.base_path /<br> WAKAPI_BASE_PATH/Web 基础路径(在代理后的子路径下运行时更改)
server.public_url /<br> WAKAPI_PUBLIC_URLhttp://localhost:3000Wakapi 实例可公开访问的 URL
security.password_salt /<br> WAKAPI_PASSWORD_SALT-用于密码哈希的盐值
security.insecure_cookies /<br> WAKAPI_INSECURE_COOKIESfalse是否允许通过 HTTP 使用 cookie
security.cookie_max_age /<br> WAKAPI_COOKIE_MAX_AGE172800认证 cookie 的生存时间(秒)或 0 表示使用会话 cookie
security.allow_signup /<br> WAKAPI_ALLOW_SIGNUPtrue是否启用用户注册
security.signup_captcha /<br> WAKAPI_SIGNUP_CAPTCHAfalse注册表单是否需要解决验证码
security.invite_codes /<br> WAKAPI_INVITE_CODEStrue是否启用邀请码注册。主要用于禁用注册时(仅邀请服务器)。
security.disable_frontpage /<br> WAKAPI_DISABLE_FRONTPAGEfalse是否禁用登录页面(适用于个人实例)
security.expose_metrics /<br> WAKAPI_EXPOSE_METRICSfalse是否在 /api/metrics 下暴露 Prometheus 指标
security.trusted_header_auth /<br> WAKAPI_TRUSTED_HEADER_AUTHfalse是否为反向代理启用可信头部认证(参见 #534)。谨慎使用!
security.trusted_header_auth_key /<br> WAKAPI_TRUSTED_HEADER_AUTH_KEYRemote-User可信头部认证的头部字段。注意: 代理必须配置为从客户端请求中剥离此头部!
security.trust_reverse_proxy_ips /<br> WAKAPI_TRUST_REVERSE_PROXY_IPS-信任处理认证的反向代理的 IPv4 或 IPv6 地址列表,以逗号分隔。
security.signup_max_rate /<br> WAKAPI_SIGNUP_MAX_RATE5/1h注册端点的速率限制配置,格式为 <最大请求数>/<倍数><单位>,其中 单位 可以是 smh
security.login_max_rate /<br> WAKAPI_LOGIN_MAX_RATE10/1m登录端点的速率限制配置,格式为 <最大请求数>/<倍数><单位>,其中 单位 可以是 smh
security.password_reset_max_rate /<br> WAKAPI_PASSWORD_RESET_MAX_RATE5/1h密码重置端点的速率限制配置,格式为 <最大请求数>/<倍数><单位>,其中 单位 可以是 smh
db.host /<br> WAKAPI_DB_HOST-数据库主机
db.port /<br> WAKAPI_DB_PORT-数据库端口
db.socket /<br> WAKAPI_DB_SOCKET-数据库UNIX套接字(替代 host)(仅适用于MySQL)
db.user /<br> WAKAPI_DB_USER-数据库用户
db.password /<br> WAKAPI_DB_PASSWORD-数据库密码
db.name /<br> WAKAPI_DB_NAMEwakapi_db.db数据库名称
db.dialect /<br> WAKAPI_DB_TYPEsqlite3数据库类型(可选 sqlite3mysqlpostgrescockroachmssql
db.charset /<br> WAKAPI_DB_CHARSETutf8mb4数据库连接字符集(仅适用于MySQL)
db.max_conn /<br> WAKAPI_DB_MAX_CONNECTIONS2最大数据库连接数
db.ssl /<br> WAKAPI_DB_SSLfalse是否对数据库连接使用TLS加密(仅适用于Postgres和CockroachDB)
db.automgirate_fail_silently /<br> WAKAPI_DB_AUTOMIGRATE_FAIL_SILENTLYfalse启动时是否忽略架构自动迁移失败
mail.enabled /<br> WAKAPI_MAIL_ENABLEDtrue是否允许Wakapi发送电子邮件(例如用于密码重置)
mail.sender /<br> WAKAPI_MAIL_SENDERWakapi <noreply@wakapi.dev>发送邮件的默认发件人地址
mail.provider /<br> WAKAPI_MAIL_PROVIDERsmtp用于发送邮件的实现方式(可选 [smtp])
mail.smtp.host /<br> WAKAPI_MAIL_SMTP_HOST-SMTP服务器地址(如果使用 smtp 邮件提供商)
mail.smtp.port /<br> WAKAPI_MAIL_SMTP_PORT-SMTP服务器端口(通常为465)
mail.smtp.username /<br> WAKAPI_MAIL_SMTP_USER-SMTP服务器认证用户名
mail.smtp.password /<br> WAKAPI_MAIL_SMTP_PASS-SMTP服务器认证密码
mail.smtp.tls /<br> WAKAPI_MAIL_SMTP_TLSfalseSMTP服务器是否需要TLS加密(false 表示STARTTLS或无加密)
mail.smtp.skip_verify /<br> WAKAPI_MAIL_SMTP_SKIP_VERIFYfalse是否允许TLS加密的SMTP使用无效或自签名证书
sentry.dsn /<br> WAKAPI_SENTRY_DSN用于集成 Sentry 进行错误日志记录和跟踪的DSN(留空则禁用)
sentry.enable_tracing /<br> WAKAPI_SENTRY_TRACINGfalse是否启用Sentry请求跟踪
sentry.sample_rate /<br> WAKAPI_SENTRY_SAMPLE_RATE0.75Sentry跟踪请求的概率
sentry.sample_rate_heartbeats /<br> WAKAPI_SENTRY_SAMPLE_RATE_HEARTBEATS0.1Sentry跟踪心跳请求的概率
quick_start /<br> WAKAPI_QUICK_STARTfalse是否跳过初始启动任务。仅用于开发目的!
enable_pprof /<br> WAKAPI_ENABLE_PPROFfalse是否将 pprof 分析数据作为调试端点暴露

支持的数据库

Wakapi 使用 GORM 作为 ORM。因此,它支持一系列不同的关系型数据库。

🔐 身份认证

Wakapi 支持不同类型的用户身份认证。

  • **Cookie:**这种方法在浏览器中使用。用户通过发送一个加密的、安全的、仅限 HTTP 的 cookie(wakapi_auth)进行认证,该 cookie 在登录时由服务器的响应设置。
  • API 密钥:
    • **通过头部:**这种方法受 WakaTime 的认证机制启发,是对 API 端点进行认证的常用方式。用户将 Authorization 头部设置为 Basic <BASE64_TOKEN>,其中后一部分对应于您的 base64 哈希 API 密钥。
    • **通过查询参数:**或者,用户也可以在每个请求的 URL 中以查询参数的形式传递他们的纯 API 密钥(例如 ?api_key=86648d74-19c5-452b-ba01-fb3ec70d4c2f)。
  • 可信头部:这种机制允许将认证委托给反向代理(例如用于 SSO),Wakapi 将完全信任该代理。详见 #534
    • 必须通过配置文件中的 trusted_header_auth 启用,并配置 trust_reverse_proxy_ip
    • 警告:这种认证类型很容易配置错误。请确保您的反向代理正确地从客户端请求中剥离相关头部。

🔧 API 端点

请参阅我们的 Swagger API 文档

生成 Swagger 文档

$ go install github.com/swaggo/swag/cmd/swag@latest $ swag init -o static/docs

🤝 集成

Prometheus 导出

您可以将 Wakapi 统计数据导出到 Prometheus,以便在 Grafana 仪表板或类似工具中查看。以下是操作方法。

# 1. 启用该功能并启动 Wakapi $ export WAKAPI_EXPOSE_METRICS=true $ ./wakapi # 2. 获取您的 API 密钥并进行哈希处理 $ echo "<YOUR_API_KEY>" | base64 # 3. 在 prometheus.yml 中添加 Prometheus 抓取配置(见下文)

抓取配置示例

# prometheus.yml # (假设您的 Wakapi 实例在 localhost 的 3000 端口监听) scrape_configs: - job_name: 'wakapi' scrape_interval: 1m metrics_path: '/api/metrics' bearer_token: '<YOUR_BASE64_HASHED_TOKEN>' static_configs: - targets: [ 'localhost:3000' ]

Grafana

wakatime_exporter 的作者还提供了一个不错的 Grafana 仪表板

WakaTime 集成

Wakapi 可以与 WakaTime 很好地配合使用。一方面,您可以从 Wakapi 向 WakaTime 转发心跳,从而同时有效地使用两种服务。此外,还可以选择从 WakaTime 导入历史数据,以确保两个服务之间的一致性。这两个功能都可以在 Wakapi 实例设置页面的"集成"部分启用。

GitHub Readme Stats 集成

Wakapi 还集成了 GitHub Readme Stats,可以为您生成精美的卡片。以下是一个示例。要使用此功能,别忘了在 设置 -> 权限启用公开数据

<details> <summary>点击查看代码</summary>
![](https://github-readme-stats.vercel.app/api/wakatime?username={yourusername}&api_domain=wakapi.dev&bg_color=2D3748&title_color=2F855A&icon_color=2F855A&text_color=ffffff&custom_title=Wakapi%20Week%20Stats&layout=compact)
</details> <br>

Github Readme Metrics 集成

GitHub Metrics 有一个 WakaTime 插件,也兼容 Wakapi。要使用此功能,别忘了在 设置 -> 权限启用公开数据

预览:

<details> <summary>点击查看代码</summary>
- uses: lowlighter/metrics@latest with: # ... 其他选项 plugin_wakatime: yes plugin_wakatime_token: ${{ secrets.WAKATIME_TOKEN }} # 必需 plugin_wakatime_days: 7 # 显示上周统计 plugin_wakatime_sections: time, projects, projects-graphs # 显示时间和项目部分,以及项目图表 plugin_wakatime_limit: 4 # 每个图表显示 4 个条目 plugin_wakatime_url: http://wakapi.dev # Wakatime 网址端点 plugin_wakatime_user: .user.login # 用户
</details> <br>

浏览器插件(Chrome 和 Firefox)

browser-wakatime 插件使您能够在 WakaTime(当然也包括 Wakapi)中跟踪您的网页浏览。访问的网站将作为"文件"出现在摘要中。按照以下说明开始使用:

  1. 从官方商店安装浏览器扩展(FirefoxChrome
  2. 打开扩展设置对话框
  3. 按如下方式配置(见下方截图):
    • API 密钥:您的个人 API 密钥(在 wakapi.dev 获取)
    • 日志记录类型:仅域名
    • API URL:https://wakapi.dev/api/compat/wakatime/v1(或者将 wakapi.dev 替换为您的自托管实例主机名)
  4. 保存
  5. 开始浏览!

注意:插件只会偶尔同步心跳,所以它们可能需要一些时间才能出现在 Wakapi 上。要"强制"同步,只需打开插件的主对话框。

Gnome 扩展

如果您使用 GNOME 桌面,有一种快速方法可以在状态栏中显示今天的编码统计信息。

只需安装 Executor 扩展,并将以下命令添加为状态栏指示器:

~/.wakatime/wakatime-cli-linux-amd64 --today

📦 数据导出

你可以将Wakapi的编码活动数据以原始心跳的形式导出为CSV文件。虽然无法直接通过网页界面完成此操作,但我们提供了一个易于使用的Python 脚本来实现。

$ pip install requests tqdm $ python scripts/download_heartbeats.py --api_key API密钥 [--url URL] [--from 起始日期] [--to 结束日期] [--output 输出文件]
<details> <summary>示例</summary>
python scripts/download_heartbeats.py --api_key 04648d14-15c9-432b-b901-dbeec70d4eaf \ --url https://wakapi.dev/api \ --from 2023-01-01 \ --to 2023-01-31 \ --output wakapi_export.csv
</details>

👍 最佳实践

建议在反向代理后使用wakapi,如Caddynginx,以启用TLS加密(HTTPS)。

但是,如果你仍然想将wakapi实例公开暴露,你需要在config.yml中将server.listen_ipv4设置为0.0.0.0

🧪 测试

单元测试

单元测试旨在对业务逻辑进行细粒度测试。它们作为应用程序的一部分实现,使用Go的testing包以及stretchr/testify

如何运行

$ CGO_ENABLED=0 go test `go list ./... | grep -v 'github.com/muety/wakapi/scripts'` -json -coverprofile=coverage/coverage.out ./... -run ./...

API测试

API测试作为黑盒测试实现,通过HTTP请求与完整独立的Wakapi进行交互。它们旨在检查Wakapi的Web堆栈和端点,包括响应代码、标头和语法层面的数据,而不是检查返回的实际内容。

我们的API(或在某种程度上是端到端)测试是作为Postman集合实现的,可以在Postman内部运行,也可以使用newman作为命令行运行器。

为了获得可预测的环境,测试在一个全新且干净的Wakapi实例上运行,该实例使用SQLite数据库,仅填充了一些种子数据(参见data.sql)。通常建议软件测试应该是安全、无状态且无副作用的。与该范式相反,我们的API测试严格要求固定的执行顺序(Postman确保这一点),其断言可能依赖于特定的先前测试已成功。

前提条件(仅限Linux)

# 1. sqlite (cli) $ sudo apt install sqlite # Fedora: sudo dnf install sqlite # 2. newman $ npm install -g newman

如何运行(仅限Linux)

$ ./testing/run_api_tests.sh

🤓 开发者注意事项

构建Web资源

为了保持精简,所有JS和CSS资源都作为静态文件包含并提交到Git中。TailwindCSSIconify需要额外的构建步骤。为了只在开发时需要这些步骤,编译后的资源也提交到Git中。

$ yarn $ yarn build # 或: yarn watch

可以通过编辑scripts/bundle_icons.js中的icons数组来添加新图标。

预压缩

#284中所解释的,某些资源的预压缩(使用Brotli)版本被提供以节省额外的带宽。这受到Caddy的precompressed指令的启发。gzipped.FileServer检查每个静态文件的.br.gz等效文件,如果存在,则提供这些文件而不是实际文件,并附带Content-Encoding: br。目前,压缩后的资源简单地提交到Git中。以后我们可能会将其作为新的构建步骤的一部分。

要预压缩文件,请运行以下命令:

# 首先安装brotli $ sudo apt install brotli # 或: sudo dnf install brotli # 监视、构建和压缩 $ yarn watch:compress # 或者:仅构建和压缩 $ yarn build:all:compress # 或者:仅压缩 $ yarn compress

❔ 常见问题

由于Wakapi在很大程度上依赖于WakaTime提供的概念,他们的常见问题在很大程度上也适用于Wakapi。你可能会在那里找到答案。

<details> <summary><b>哪些数据会发送到Wakapi?</b></summary> <ul> <li>文件名</li> <li>项目名称</li> <li>编辑器名称</li> <li>你的计算机主机名</li> <li>你在编辑器中每个操作的时间戳</li> <li>...</li> </ul>

有关详细信息,请参阅相关的WakaTime常见问题部分

如果你自己托管Wakapi,你可以控制所有数据。但是,如果你使用我们的网络服务并关心隐私,你也可以排除或混淆某些文件或项目名称。

</details> <details> <summary><b>离线时会发生什么?</b></summary>

所有数据都在本地计算机上缓存,并在你重新上线时批量发送。

</details> <details> <summary><b>Wakapi是如何诞生的?</b></summary>

Wakapi是在我还是学生时开始的,当时我想跟踪有关编码时间的详细统计信息。虽然我是WakaTime的忠实粉丝,但当时我不想每月支付<a href="https://wakatime.com/pricing">9美元</a>。幸运的是,WakaTime的大部分内容都是开源的!

</details> <details> <summary><b>Wakapi与WakaTime相比如何?</b></summary>

Wakapi是WakaTime的一个小子集,功能较少。WakaTime中缺少的一些很酷的功能包括:

<ul> <li>排行榜</li> <li><a href="https://wakatime.com/share/embed">可嵌入的图表</a></li> <li>个人目标</li> <li>团队/组织支持</li> <li>额外的集成(与GitLab等)</li> <li>更丰富的API</li> </ul>

WakaTime物有所值。但是,如果你只需要基本的统计信息,并希望保持对数据的主权,你可能会选择Wakapi。

</details> <details> <summary><b>持续时间是如何计算的?</b></summary>

从心跳推断编码时间的度量方式与WakaTime略有不同。虽然WakaTime有<a href="https://wakatime.com/faq#timeout">超时间隔</a>,但Wakapi本质上只是为每个在较长暂停后发生的心跳添加2分钟的额外时间。

以下是一个示例(圆圈表示心跳):

|---o---o--------------o---o---| | |10秒| 3分钟 |10秒| |

如何处理中间的3分钟并不明确。开发者是进行了3分钟的休息,还是只是没有发送心跳,例如因为开发者在盯着屏幕试图找到解决方案,但实际上并没有输入代码?

<ul> <li><b>WakaTime</b>(5分钟超时):3分20秒 <li><b>WakaTime</b>(2分钟超时):20秒 <li><b>Wakapi:</b>10秒 + 2分钟 + 10秒 = 2分20秒</li> </ul>

Wakapi在第三次心跳之前会添加两分钟的"填充"时间。这就是为什么Wakapi和WakaTime之间的总时间会略有不同。

👥 社区贡献

👏 支持

在开源领域编程是我的热情所在,我希望有朝一日能够全职从事这项工作并以此为生。所以如果你喜欢这个项目,请考虑支持它🙂。你可以通过为我买杯咖啡或成为GitHub赞助者来捐赠。每一笔小额捐赠都备受感激,并能激励我继续改进Wakapi!

🙏 致谢

我非常感谢**@alanhamlett**和WakaTime团队的努力,也感谢他们将软件开源。

此外,感谢**server.camp**为Wakapi.dev赞助服务器基础设施。

<img src="https://yellow-cdn.veclightyear.com/835a84d5/2f012d13-f69d-46d9-91c7-90ac51e2f022.png" width="220px" />

📓 许可证

MIT © Ferdinand Mütsch

编辑推荐精选

Trae

Trae

字节跳动发布的AI编程神器IDE

Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。

AI工具TraeAI IDE协作生产力转型热门
问小白

问小白

全能AI智能助手,随时解答生活与工作的多样问题

问小白,由元石科技研发的AI智能助手,快速准确地解答各种生活和工作问题,包括但不限于搜索、规划和社交互动,帮助用户在日常生活中提高效率,轻松管理个人事务。

热门AI助手AI对话AI工具聊天机器人
Transly

Transly

实时语音翻译/同声传译工具

Transly是一个多场景的AI大语言模型驱动的同声传译、专业翻译助手,它拥有超精准的音频识别翻译能力,几乎零延迟的使用体验和支持多国语言可以让你带它走遍全球,无论你是留学生、商务人士、韩剧美剧爱好者,还是出国游玩、多国会议、跨国追星等等,都可以满足你所有需要同传的场景需求,线上线下通用,扫除语言障碍,让全世界的语言交流不再有国界。

讯飞智文

讯飞智文

一键生成PPT和Word,让学习生活更轻松

讯飞智文是一个利用 AI 技术的项目,能够帮助用户生成 PPT 以及各类文档。无论是商业领域的市场分析报告、年度目标制定,还是学生群体的职业生涯规划、实习避坑指南,亦或是活动策划、旅游攻略等内容,它都能提供支持,帮助用户精准表达,轻松呈现各种信息。

AI办公办公工具AI工具讯飞智文AI在线生成PPTAI撰写助手多语种文档生成AI自动配图热门
讯飞星火

讯飞星火

深度推理能力全新升级,全面对标OpenAI o1

科大讯飞的星火大模型,支持语言理解、知识问答和文本创作等多功能,适用于多种文件和业务场景,提升办公和日常生活的效率。讯飞星火是一个提供丰富智能服务的平台,涵盖科技资讯、图像创作、写作辅助、编程解答、科研文献解读等功能,能为不同需求的用户提供便捷高效的帮助,助力用户轻松获取信息、解决问题,满足多样化使用场景。

热门AI开发模型训练AI工具讯飞星火大模型智能问答内容创作多语种支持智慧生活
Spark-TTS

Spark-TTS

一种基于大语言模型的高效单流解耦语音令牌文本到语音合成模型

Spark-TTS 是一个基于 PyTorch 的开源文本到语音合成项目,由多个知名机构联合参与。该项目提供了高效的 LLM(大语言模型)驱动的语音合成方案,支持语音克隆和语音创建功能,可通过命令行界面(CLI)和 Web UI 两种方式使用。用户可以根据需求调整语音的性别、音高、速度等参数,生成高质量的语音。该项目适用于多种场景,如有声读物制作、智能语音助手开发等。

咔片PPT

咔片PPT

AI助力,做PPT更简单!

咔片是一款轻量化在线演示设计工具,借助 AI 技术,实现从内容生成到智能设计的一站式 PPT 制作服务。支持多种文档格式导入生成 PPT,提供海量模板、智能美化、素材替换等功能,适用于销售、教师、学生等各类人群,能高效制作出高品质 PPT,满足不同场景演示需求。

讯飞绘文

讯飞绘文

选题、配图、成文,一站式创作,让内容运营更高效

讯飞绘文,一个AI集成平台,支持写作、选题、配图、排版和发布。高效生成适用于各类媒体的定制内容,加速品牌传播,提升内容营销效果。

热门AI辅助写作AI工具讯飞绘文内容运营AI创作个性化文章多平台分发AI助手
材料星

材料星

专业的AI公文写作平台,公文写作神器

AI 材料星,专业的 AI 公文写作辅助平台,为体制内工作人员提供高效的公文写作解决方案。拥有海量公文文库、9 大核心 AI 功能,支持 30 + 文稿类型生成,助力快速完成领导讲话、工作总结、述职报告等材料,提升办公效率,是体制打工人的得力写作神器。

openai-agents-python

openai-agents-python

OpenAI Agents SDK,助力开发者便捷使用 OpenAI 相关功能。

openai-agents-python 是 OpenAI 推出的一款强大 Python SDK,它为开发者提供了与 OpenAI 模型交互的高效工具,支持工具调用、结果处理、追踪等功能,涵盖多种应用场景,如研究助手、财务研究等,能显著提升开发效率,让开发者更轻松地利用 OpenAI 的技术优势。

下拉加载更多