A Plotly Dash wrapper for FullCalendar with premium (Scheduler) plugins bundled
Project description
skinnycal
A lightweight Plotly Dash wrapper around @fullcalendar/react, with the FullCalendar Premium (Scheduler) plugins statically bundled so resource views work out of the box.
Forked from dash-fullcalendar. See PREMIUM_FORK_CHANGES.md for the full rationale and diff notes.
Installation
pip install skinnycal
PyPI distribution and Python import name are both skinnycal.
Quick start
from dash import Dash, html
import skinnycal as dcal
app = Dash(__name__)
app.layout = html.Div([
dcal.FullCalendar(
id="cal",
initialView="dayGridMonth",
editable=True,
selectable=True,
events=[
{"title": "Audit", "date": "2025-08-01"},
{"title": "Go-Live", "date": "2025-08-10"},
],
)
])
if __name__ == "__main__":
app.run(debug=True)
Open http://127.0.0.1:8050 in your browser.
Premium (Scheduler) views
Pass a valid schedulerLicenseKey and request a resource view — the premium plugins are already in the bundle, no async chunk fetch:
dcal.FullCalendar(
id="cal",
schedulerLicenseKey="GPL-My-Project-Is-Open-Source", # or your commercial key
plugins=["resourceTimeline", "interaction"],
initialView="resourceTimelineWeek",
resources=[{"id": "a", "title": "Room A"}, {"id": "b", "title": "Room B"}],
events=[{"resourceId": "a", "title": "Kickoff", "start": "2025-08-01"}],
)
Repository layout
| Path | Purpose |
|---|---|
skinnycal/ |
Python package published to PyPI. Contains generated Dash component classes and pre-compiled JS assets (_js_dist). |
src/ |
Raw React source for the wrapper. |
package.json, webpack.config.js |
JS build pipeline (npm run build). |
usage.py |
Minimal Dash demo. |
tests/ |
Integration tests with dash[testing] & pytest. |
.github/workflows/ |
CI workflow that builds and publishes to PyPI on push to main. |
Development
-
Clone and install dependencies
git clone https://github.com/PepijnWissing/skinnyCal.git cd skinnyCal npm install python -m venv .venv && . .venv/Scripts/activate # POSIX: source .venv/bin/activate pip install -r requirements.txt
-
Build and run the example
npm run build # webpack + dash-generate-components pip install -e . python usage.py # open http://localhost:8050
-
Run tests
pytest -q
Releasing
Publishing is automated: any push to main triggers .github/workflows/publish.yml, which builds an sdist + wheel and uploads to PyPI via Trusted Publishing (OIDC). Pushes that don't bump the version are no-ops (skip-existing: true).
To cut a release, bump the version in all three places (they must stay in sync — __version__ is read from package-info.json at import time):
pyproject.toml→[project].versionskinnycal/package-info.json→versionpackage.json→version
Then commit and push to main.
License
MIT © Scott Kilgore (upstream wrapper). Bundled @fullcalendar premium plugin code is governed by FullCalendar's own license — commercial production use requires a purchased Scheduler license.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file skinnycal-0.1.7.tar.gz.
File metadata
- Download URL: skinnycal-0.1.7.tar.gz
- Upload date:
- Size: 501.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5294c285a19d1662a72f8ce3c52dc65afb97b3c9684f45c756f986f0a4486a68
|
|
| MD5 |
3724e833e175000e61d3339d2462fa6b
|
|
| BLAKE2b-256 |
12e6aab91f43973c6c4ff462231eacba8aee9d34445367d6d0c884e8fc1396ca
|
Provenance
The following attestation bundles were made for skinnycal-0.1.7.tar.gz:
Publisher:
publish.yml on PepijnWissing/skinnyCal
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
skinnycal-0.1.7.tar.gz -
Subject digest:
5294c285a19d1662a72f8ce3c52dc65afb97b3c9684f45c756f986f0a4486a68 - Sigstore transparency entry: 2047182580
- Sigstore integration time:
-
Permalink:
PepijnWissing/skinnyCal@39fb83e8521094c1fd3194bef4d8ea634a3895f9 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/PepijnWissing
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@39fb83e8521094c1fd3194bef4d8ea634a3895f9 -
Trigger Event:
push
-
Statement type:
File details
Details for the file skinnycal-0.1.7-py3-none-any.whl.
File metadata
- Download URL: skinnycal-0.1.7-py3-none-any.whl
- Upload date:
- Size: 504.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e7d54d50ddedf0a7e752bcf84046c0e552b4cd17d7f24307e5f2a124f9a20851
|
|
| MD5 |
c615cdde9bc51f18e5a0b06e38b2579e
|
|
| BLAKE2b-256 |
fd167335e6c68dad464a7f3d6cb92135c6222b1330ecff80a2b1eb37f56674c3
|
Provenance
The following attestation bundles were made for skinnycal-0.1.7-py3-none-any.whl:
Publisher:
publish.yml on PepijnWissing/skinnyCal
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
skinnycal-0.1.7-py3-none-any.whl -
Subject digest:
e7d54d50ddedf0a7e752bcf84046c0e552b4cd17d7f24307e5f2a124f9a20851 - Sigstore transparency entry: 2047182684
- Sigstore integration time:
-
Permalink:
PepijnWissing/skinnyCal@39fb83e8521094c1fd3194bef4d8ea634a3895f9 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/PepijnWissing
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@39fb83e8521094c1fd3194bef4d8ea634a3895f9 -
Trigger Event:
push
-
Statement type: