GNU General Public License v3.0

项目介绍

ellite/Wallos 是一个托管在 GitHub 上的开源项目,主要使用 PHP 编写,采用 GNU General Public License v3.0 许可证,目前获得 8.8k 个 Star、463 次 Fork。

仓库全名
ellite/Wallos
开源许可证
GNU General Public License v3.0
Star 数
8.8k
Fork 数
463
未关闭 Issue
89

README 摘要

Wallos: Open-Source Personal Subscription Tracker Table of Contents Introduction Features Demo Getting Started Prerequisites Baremetal Docker Installation Baremetal Updating Docker Docker-Compose Usage Screenshots OIDC AI Recommendations API Documentation Contributing Contributors Translations License Links Introduction Wallos is a powerful, open-source, and self-hostable web application designed to empower you in…

完整内容见 GitHub 原始 README 或本页 。

常见问题

Wallos 用什么语言开发?

主要使用 PHP 编写,采用 GNU General Public License v3.0 许可证,目前有 8.8k 个 Star。

Wallos 可以免费商用吗?

仓库标注的许可证为 GNU General Public License v3.0,商用前请先阅读仓库 LICENSE 文件确认授权范围。

如何获取 Wallos 的源码?

可以直接克隆仓库:git clone https://github.com/ellite/Wallos.git;安装与运行步骤见仓库 README。

Wallos 最近还在维护吗?

仓库最近一次更新为 6 天前,当前有 89 个未关闭 Issue;Star 数为 8.8k,可作为社区活跃度的参考。

关于

GitHub 原始描述(英文)

Wallos: Open-source, self-hostable personal subscription tracker. Visualize your recurring expenses, manage your budget, and save money.

描述取自 GitHub 官方 API,保持仓库作者书写的原文。

简要分析

热度分
9743
价值分
5416
活跃状态
活跃

语言占比

CSS
Dockerfile
Hack
JavaScript
PHP
Python
Shell

Release

README

Wallos

Wallos: Open-Source Personal Subscription Tracker

Stars Docker GitHub contributors GitHub Sponsors Discord

Table of Contents

Introduction

Wallos is a powerful, open-source, and self-hostable web application designed to empower you in managing your finances with ease. Say goodbye to complicated spreadsheets and expensive financial software – Wallos simplifies the process of tracking expenses and helps you gain better control over your financial life.

Features

  • Subscription Management: Keep track of your recurring subscriptions and payments, ensuring you never miss a due date.
  • Category Management: Organize your expenses into customizable categories, enabling you to gain insights into your spending habits.
  • Multi-Currency support: Wallos supports multiple currencies, allowing you to manage your finances in the currency of your choice.
  • Currency Conversion: Integrates with the Fixer API so you can get exchange rates and see all your subscriptions on your main currency.
  • Data Privacy: As a self-hosted application, Wallos ensures that your financial data remains private and secure on your own server.
  • Customization: Tailor Wallos to your needs with customizable categories, currencies, themes and other display options.
  • Sorting Options: Allowing you to view your subscriptions from different perspectives.
  • Logo Search: Wallos can search the web for the logo of your subscriptions if you don’t have them available for upload.
  • Mobile view: Wallos on the go.
  • Statistics: Another perspective into your spendings.
  • Notifications: Wallos supports multiple notification methods (email, discord, pushover, telegram, gotify and webhooks). Get notified about your upcoming payments.
  • Multi Language support.
  • OIDC with OAuth
  • AI Recommendations with ChatGPT, Gemini, OpenRouter, a local Ollama or any OpenAI-compatible API

Demo

If you want to try Wallos, a demo is available at https://demo.wallosapp.com.
The database is reset every 2 hours.
To access the demo use the following credentials:

Username: demo  
Password: demo

Getting Started

See instructions to run Wallos below.

Prerequisites

Baremetal
  • NGINX or APACHE websever running
  • PHP 8.3 with the following modules enabled:
    • curl
    • dom
    • gd
    • intl
    • openssl
    • sqlite3
    • zip
    • mbstring
    • fpm
Docker
  • Docker

Installation

Baremetal
  1. Download or clone this repo and move the files into your web root - usually /var/www/html
  2. Rename /db/wallos.empty.db to /db/wallos.db
  3. Open the app in your browser — migrations run automatically on the registration page
  4. Add the following scripts to your cronjobs with crontab -e
0 1 * * * php /var/www/html/endpoints/cronjobs/updatenextpayment.php >> /var/log/cron/updatenextpayment.log 2>&1
0 2 * * * php /var/www/html/endpoints/cronjobs/updateexchange.php >> /var/log/cron/updateexchange.log 2>&1
0 8 * * * php /var/www/html/endpoints/cronjobs/sendcancellationnotifications.php >> /var/log/cron/sendcancellationnotifications.log 2>&1
0 9 * * * php /var/www/html/endpoints/cronjobs/sendnotifications.php >> /var/log/cron/sendnotifications.log 2>&1
*/2 * * * * php /var/www/html/endpoints/cronjobs/sendverificationemails.php >> /var/log/cron/sendverificationemail.log 2>&1
*/2 * * * * php /var/www/html/endpoints/cronjobs/sendresetpasswordemails.php >> /var/log/cron/sendresetpasswordemails.log 2>&1
0 */6 * * * php /var/www/html/endpoints/cronjobs/checkforupdates.php >> /var/log/cron/checkforupdates.log 2>&1
30 1 * * 1 php /var/www/html/endpoints/cronjobs/storetotalyearlycost.php >> /var/log/cron/storetotalyearlycost.log 2>&1
30 3 * * 1 php /var/www/html/endpoints/cronjobs/generaterecommendations.php weekly >> /var/log/cron/generaterecommendations.log 2>&1
0 4 1 * * php /var/www/html/endpoints/cronjobs/generaterecommendations.php monthly >> /var/log/cron/generaterecommendations.log 2>&1
  1. If your web root is not /var/www/html/ adjust the cronjobs above accordingly.
Updating
  1. Re-download the repo and move the files into the correct folder or do git pull (if you used git clone before)
  2. Check the Prerequisites and install / enable the missing ones, if any.
  3. Run http://domain.example/endpoints/db/migrate.php if you are logged in, or via CLI run:
php /var/www/html/endpoints/db/migrate.php
Docker
docker run -d --name wallos -v /path/to/config/wallos/db:/var/www/html/db \
-v /path/to/config/wallos/logos:/var/www/html/images/uploads/logos \
-e TZ=Europe/Berlin -p 8282:80 --restart unless-stopped \
bellamy/wallos:latest

Disable healthcheck (optional, e.g., for Docker <25 or faster startup reporting):

docker run -d --name wallos -v /path/to/config/wallos/db:/var/www/html/db \
-v /path/to/config/wallos/logos:/var/www/html/images/uploads/logos \
-e TZ=Europe/Berlin -p 8282:80 --restart unless-stopped \
--health-cmd=NONE \
bellamy/wallos:latest

Docker Compose

services:
  wallos:
    container_name: wallos
    image: bellamy/wallos:latest
    ports:
      - "8282:80/tcp"
    environment:
      TZ: 'America/Toronto'
    # Volumes store your data between container upgrades
    volumes:
      - './db:/var/www/html/db'
      - './logos:/var/www/html/images/uploads/logos'
    restart: unless-stopped

Disable healthcheck (optional, e.g., for Docker <25 or faster startup reporting):

services:
  wallos:
    container_name: wallos
    image: bellamy/wallos:latest
    ports:
      - "8282:80/tcp"
    environment:
      TZ: 'America/Toronto'
    volumes:
      - './db:/var/www/html/db'
      - './logos:/var/www/html/images/uploads/logos'
    restart: unless-stopped
    healthcheck:
      test: ["NONE"]

Usage

Just open the browser and open ip:port of the machine running wallos.
On the first time you run wallos a user account must be created.
Go to settings and personalise your Avatar and add members of your household. While there add / remove any categories and currencies.
Get a free API Key from Fixer and add it in the settings.
If you want to trigger an Update of the exchange rates, change your main currency after adding the API Key, and then change it back to your preferred one.

Screenshots

Screenshot

See more screenshots

Screenshot

Screenshot

Screenshot

Screenshot

Screenshot

Screenshot

Screenshot

Screenshot Screenshot

Screenshot

Screenshot Screenshot

OIDC

OIDC can be enabled on the Admin page and can be used with providers that support OAuth. Wallos can also resolve OIDC settings declaratively from environment variables. When an OIDC_* variable is set, it overrides the corresponding database value at runtime without rewriting the database.

If OIDC_ISSUER is set, Wallos will fetch /.well-known/openid-configuration at runtime and use discovery for the authorization, token, and user info endpoints unless a more specific endpoint variable is also set.

Environment Variable UI Equivalent
OIDC_ENABLED Enable OIDC/OAuth
OIDC_PROVIDER_NAME Provider Name
OIDC_CLIENT_ID Client ID
OIDC_CLIENT_SECRET Client Secret
OIDC_CLIENT_SECRET_FILE Client Secret
OIDC_ISSUER No direct UI field
OIDC_AUTH_URL Auth URL
OIDC_TOKEN_URL Token URL
OIDC_USERINFO_URL User Info URL
OIDC_REDIRECT_URL Redirect URL
OIDC_LOGOUT_URL Logout URL
OIDC_USER_IDENTIFIER User Identifier Field
OIDC_SCOPES Scopes
OIDC_AUTO_CREATE_USER Create user automatically
OIDC_DISABLE_PASSWORD_LOGIN Disable password login
OIDC_REQUIRE_EMAIL_VERIFIED Require verified email for account linking

SSRF allowlist

Wallos blocks webhook, SMTP, and OIDC endpoint URLs that resolve to private/link-local/loopback addresses unless the host is present in the Security Settings allowlist. Normally that allowlist is edited through the Admin UI, which requires a manual login before OIDC can be used against an identity provider on a private address (e.g. a self-hosted IdP at auth.example.com).

Setting the SSRF_ALLOWLIST environment variable overrides the database value entirely (same full-override semantics as the OIDC_* variables above), so the allowlist can be provisioned on first boot with no manual UI step. It accepts a comma-separated list of hosts/IPs, optionally with a port (e.g. SSRF_ALLOWLIST=auth.example.com,192.168.1.100:8123). While set, the Security Settings field in the Admin UI is shown but disabled.

AI Recommendations

Wallos can ask an AI model for ways to save money on your subscriptions. Each user sets it up under Settings, in the AI Recommendations section: enable it, choose a provider, then select Test to load the available models, pick one and save.

Provider Needs
ChatGPT An OpenAI API key
Gemini A Google AI Studio API key
OpenRouter An OpenRouter API key
Local Ollama The Ollama URL, e.g. http://localhost:11434
OpenAI Compatible The API base URL, e.g. http://localhost:11434/v1, and an API key if the server requires one

Generate Recommendations runs it on demand; the run schedule can also repeat it weekly or monthly. Recommendations are based on your active subscriptions and household members, and appear on the dashboard. When AI is enabled with a model saved and the interface language is not English, the categories section of the settings page can also translate category names into that language.

A local Ollama or OpenAI-compatible server on a private address is blocked unless its host is in the SSRF allowlist. For any user other than the first (admin) account, the admin also has to enable Allow standard users to use the Webhook Allowlist in the Security Settings. The host still has to be in the allowlist; enabling the setting alone is not enough.

API Documentation

Wallos provides a comprehensive API that allows you to interact with the application programmatically. The API documentation is available at https://api.wallosapp.com/.

Contributing

Feel free to open Pull requests with bug fixes and features. I’ll do my best to keep an eye on those.
Feel free to open issues with bug reports or feature requests. Bug fixes will take priority.
I welcome contributions from the community and look forward to working with you to improve this project.

Contributors

Translations

If you want to contribute with a translation of wallos:

  • Add your language code to includes/i18n/languages.php in the format "en" => ["name" => "English", "dir" => "ltr"],. Please use the original language name and not the english translation.
  • Create a copy of the file includes/i18n/en.php and rename it to the language code you used above. Example: pt.php for “pt” => [“name” => “Português”, “dir” => “ltr”],.
  • Translate all the values on the language file to the new language. (Incomplete translations will not be accepted).
  • Create a copy of the file scripts/i18n/en.js and rename it to the language code you used above. Example: pt.js for “pt” => [“name” => “Português”, “dir” => “ltr”],.
  • Translate all the values on the language file to the new language. (Incomplete translations will not be accepted).

License

This project is licensed under the GNU General Public License, Version 3 - see the LICENSE.md file for details.

Why GPLv3?

I chose the GNU General Public License version 3 (GPLv3) for this project because it ensures that the software remains open source and freely available to the community. GPLv3 mandates that any derivative works or modifications must also be released under the same license, promoting the principles of software freedom.

I strongly believe in the importance of open source software and the collaborative nature of development, and I invite contributors to help improve this project.

评论

暂无评论