PlusBet is a Streamlit-based sports betting analysis app built for the Danish market. It combines odds aggregation, value detection, news context, bankroll tracking, saved picks, leaderboard mechanics, Google sign-in, and Stripe-based premium flows.
This repository is the main PlusBet app. The Stripe webhook/backend can live in a separate repository such as plusbet-webhook.
Private GitHub repository
-> Public Streamlit Community Cloud app
-> plusbet.dk handles brand, content and Stripe entry points
-> Optional separate webhook/backend service for subscription status
That setup gives you:
- private source code on GitHub
- a public app URL for Streamlit Community Cloud
- Stripe subscription handling from plusbet.dk
- a cleaner split between frontend app and backend subscription logic
PlusBet is designed to make betting signals easier to understand and easier to act on.
- value picks based on weighted bookmaker probabilities
- odds, edge, and implied probability breakdowns
- news and injury context around events
- bankroll tracking and portfolio management
- saved picks and settled pick statistics
- Top 10 / leaderboard direction
- Google login via Streamlit OIDC
- Stripe-powered premium flows
- webhook/backend support for secure subscription state
- athlete-first search and broader sports matching
- local embedded reference data for athlete and source hints
plusbet/
├─ .github/
│ └─ FUNDING.yml
├─ .streamlit/
│ └─ config.toml
├─ docs/
│ └─ sponsor.html
├─ app.py
├─ CHANGELOG.md
├─ DEPLOY_NOTES.txt
├─ LICENSE
├─ README.md
├─ SETUP_GUIDE.md
├─ plusbet_mockup_readme.svg
├─ plusbet_stripe_webhook.py
├─ railway.env.example
├─ requirements.txt
├─ streamlit_secrets.example.toml
└─ webhook_env_example.txt
User
├─ plusbet.dk
│ ├─ marketing / landing pages
│ ├─ Stripe checkout entry points
│ └─ links into the Streamlit app
│
├─ Streamlit app
│ ├─ UI and betting workflows
│ ├─ Google login
│ ├─ odds / news / OpenAI integrations
│ ├─ bankroll and portfolio features
│ └─ premium status checks
│
└─ Webhook/backend service
├─ receives Stripe webhook events
├─ verifies signatures
├─ stores subscription state
└─ exposes subscription status endpoint
- Python
- Streamlit
- Pandas
- Requests
- Altair
- OpenAI API
- Odds API
- News API
- Stripe
- SQLite in the current build
- FastAPI for the webhook service
pip install -r requirements.txtmkdir -p .streamlit
cp streamlit_secrets.example.toml .streamlit/secrets.tomlFill in the required secrets before running the app.
streamlit run app.pyThis repository is suited for:
- private GitHub repo
- public Streamlit app
The app can still read from a private repo during deployment, while the deployed Streamlit URL stays public.
plusbet-> main app repoplusbet-webhook-> webhook/backend repo
Do not commit real secrets or production databases.
Keep these out of Git:
.streamlit/secrets.toml- Stripe secret keys
- OAuth client secrets
- webhook secrets
- local databases
- any premium-user or internal export files
Use:
- Streamlit Secrets for app configuration
- Railway or your backend host for webhook environment variables
- a managed database later if the product grows beyond SQLite
This setup keeps the code private while allowing the app itself to be public. That means users can open the Streamlit app, but they cannot browse the GitHub source repository.
Stripe can continue to be handled from plusbet.dk. The Streamlit app can read premium status from a webhook/backend endpoint or from allow-listed emails during development.
Top 10 is based on internal PlusBet saved picks and settled outcomes. It is a product feature, not proof that a bet was placed externally.
SQLite is good for local testing and early deployment, but a more durable hosted database is recommended for larger scale, shared user data, or production-grade subscription logic.
SETUP_GUIDE.md-> deployment and configuration guideDEPLOY_NOTES.txt-> shorter operational notesstreamlit_secrets.example.toml-> example Streamlit secretsrailway.env.example-> example backend env varswebhook_env_example.txt-> simplified webhook env example
This repository is provided under a proprietary, all-rights-reserved license unless you explicitly replace it with an open-source license.
See LICENSE for the exact terms.