Name | HedwigLab JSON |
Version |
0.9.0
JSON |
| download |
home_page | None |
Summary | Research note backup storage that syncs Notion to Git and generates AI summaries |
upload_time | 2025-07-12 00:29:02 |
maintainer | None |
docs_url | None |
author | Hyeshik Chang |
requires_python | >=3.9 |
license | None |
keywords |
|
VCS |
|
bugtrack_url |
|
requirements |
No requirements were recorded.
|
Travis-CI |
No Travis.
|
coveralls test coverage |
No coveralls.
|
# Hedwig
Hedwig is a research note backup storage that synchronizes Notion content to Git repositories and generates AI summaries for team communication. It automates the workflow of tracking research progress, creating summaries, and distributing them through messaging platforms.
## Features
- **Notion Synchronization**: Automatically sync research notes from Notion to a Git repository
- **AI-Powered Summaries**: Generate intelligent summaries of research changes using LLMs
- **Team Overviews**: Create consolidated team overviews with MVP highlights
- **Multi-Platform Messaging**: Distribute summaries through various messaging platforms (currently Slack)
- **Automated Pipeline**: Run the complete workflow with a single command
- **Flexible Configuration**: Customize prompts, models, and behavior through configuration
## Installation
Install Hedwig using pip:
```bash
pip install -e /path/to/Hedwig
```
Or clone and install from source:
```bash
git clone https://github.com/ChangLabSNU/Hedwig
cd Hedwig
pip install -e .
```
## Quick Start
1. **Set up configuration**:
```bash
cp config.yml.example config.yml
# Edit config.yml with your settings
```
2. **Configure API keys and etc**:
```yaml
# In config.yml
api:
notion:
api_key: 'your-notion-api-key'
llm:
key: 'your-gemini-api-key'
messaging:
slack:
token: 'your-slack-bot-token'
```
3. **Check system health** (recommended before first sync):
```bash
hedwig health --config config.yml
```
This verifies that all components are properly configured and accessible.
4. **Sync Notion content**:
```bash
hedwig sync
```
5. **Run the pipeline**:
```bash
hedwig pipeline
```
## Workflow Overview
Hedwig follows a two-stage process:
```
┌─────────────┐
│ STAGE 1 │
│ Data Update │
└─────────────┘
│
▼
┌─────────────┐
│ hedwig sync │ ─── Fetches latest research notes from Notion
└─────────────┘ and commits them to Git repository
│
│ (Run periodically or on-demand)
│
▼
┌─────────────┐
│ STAGE 2 │
│ Pipeline │
└─────────────┘
│
▼
┌──────────────────────────┐
│ hedwig pipeline │ ─── Automated 3-step process:
└──────────────────────────┘
│
├─► generate-change-summary ─── Analyzes Git commits and creates
│ AI summaries of recent changes
│
├─► generate-overview ──────── Consolidates individual summaries
│ into team-focused overview
│
└─► post-summary ───────────── Posts to messaging platform
(e.g., Slack Canvas)
```
**Important**: The `sync` command must be run before the pipeline to ensure the Git repository has the latest Notion content. The sync is NOT part of the pipeline and should be scheduled separately.
## Commands
### `hedwig health`
Checks the health of all Hedwig components and dependencies. **Recommended to run before first sync** to ensure proper setup.
```bash
hedwig health [--config CONFIG] [--quick] [--json] [--quiet]
```
**Options:**
- `--config`: Configuration file path (default: `config.yml`)
- `--quick`: Skip API connectivity tests for faster results
- `--json`: Output results in JSON format for monitoring tools
- `--quiet`: Suppress informational messages
**Health Checks Include:**
- Configuration file validity and required keys
- Git repository status and permissions
- Python package dependencies
- Filesystem permissions and disk space
- API connectivity (Notion, LLM, Slack) unless `--quick` is used
**Exit Codes:**
- `0`: All checks passed (HEALTHY)
- `1`: Some non-critical checks failed (DEGRADED)
- `2`: Critical checks failed (CRITICAL)
**Example Usage:**
```bash
# Full health check before first sync
hedwig health --config config.yml
# Quick check (skip API tests)
hedwig health --quick
# JSON output for monitoring
hedwig health --json | jq '.overall_status'
```
### `hedwig sync`
Synchronizes Notion pages to a Git repository.
```bash
hedwig sync [--config CONFIG] [--quiet] [--verbose]
```
**Options:**
- `--config`: Configuration file path (default: `config.yml`)
- `--quiet`: Suppress progress messages
- `--verbose`: Show detailed debug output
### `hedwig sync-userlist`
Manually syncs user list from Notion and saves to TSV file. This command is typically not needed in regular workflows as it's automatically triggered when unknown users are encountered.
```bash
hedwig sync-userlist [--config CONFIG] [--quiet]
```
**Options:**
- `--config`: Configuration file path (default: `config.yml`)
- `--quiet`: Suppress progress messages
**Output:**
Creates a TSV file at the path specified in `paths.userlist_file` containing:
- `user_id`: Notion user UUID
- `name`: User's display name
**Override Feature:**
If `paths.userlist_override_file` is configured and the file exists, users from this file will override or supplement the Notion user list. This is useful for:
- Correcting names that appear incorrectly in Notion
- Adding custom display names for specific users
- Including users that may not be in the Notion workspace
The override file should have the same TSV format as the output file.
**Note:** With auto-sync enabled (default), this command is automatically run when `generate-change-summary` encounters unknown user IDs.
### `hedwig generate-change-summary`
Analyzes recent Git commits and generates AI-powered summaries.
```bash
hedwig generate-change-summary [--config CONFIG] [--no-write]
```
**Options:**
- `--config`: Configuration file path (default: `config.yml`)
- `--no-write`: Print to stdout instead of saving to file
**Auto User Sync:**
When `change_summary.auto_sync_userlist` is set to `true` (default), the command will automatically run `sync-userlist` if it encounters user IDs not found in the user list. This ensures that new team members are automatically added to the user list. Set to `false` to disable this behavior.
### `hedwig generate-overview`
Creates team-focused overview summaries from individual change summaries.
```bash
hedwig generate-overview [--config CONFIG] [--no-write]
```
**Options:**
- `--config`: Configuration file path (default: `config.yml`)
- `--no-write`: Print to stdout instead of saving to file
### `hedwig post-summary`
Posts summaries to configured messaging platforms.
```bash
hedwig post-summary --summary-file FILE --overview-file FILE --title TITLE [--config CONFIG]
```
**Options:**
- `--summary-file`: Path to the markdown summary file
- `--overview-file`: Path to the overview message file
- `--title`: Title for the posted summary
- `--config`: Configuration file path (default: `config.yml`)
### `hedwig pipeline`
Runs the complete summarization pipeline automatically.
```bash
hedwig pipeline [--config CONFIG]
```
**Options:**
- `--config`: Configuration file path (default: `config.yml`)
**Note**: This command does NOT include syncing from Notion. Run `hedwig sync` separately before the pipeline to ensure the Git repository is up-to-date.
## Configuration
Hedwig uses a YAML configuration file. Copy `config.yml.example` to `config.yml` and customize:
### Essential Settings
```yaml
# Repository paths
paths:
notes_repository: '/path/to/your/notes/repo'
change_summary_output: '/path/to/summary/output'
# API Keys (can be set here OR as environment variables)
notion:
api_key: 'your-notion-api-key' # Alternative: export NOTION_API_KEY=...
api:
llm:
key: 'your-gemini-api-key' # Alternative: export GEMINI_API_KEY=...
url: 'https://generativelanguage.googleapis.com/v1beta/openai/'
messaging:
slack:
token: 'xoxb-your-bot-token' # Alternative: export SLACK_TOKEN=...
```
### Key Configuration Options
- **Sync Settings**: Checkpoint tracking, timezone, lookback days
- **Summary Settings**: Model selection, prompt customization, diff length limits
- **Overview Settings**: Language selection, lab information, weekday configurations
- **Messaging Settings**: Platform selection, channel configuration
- **Pipeline Settings**: Title format customization
See `config.yml.example` for all available options with detailed comments.
## Automated Execution
Set up cron jobs for the two-stage process:
```bash
# Sync from Notion every hour during work hours
0 * * * * /usr/bin/hedwig sync --config /path/to/config.yml
# Run pipeline everyday except Sunday at 8:30 AM
30 8 * * 1-6 /usr/bin/hedwig pipeline --config /path/to/config.yml
```
## Messaging Platforms
### Slack Integration
Hedwig creates Canvas documents in Slack for rich formatting:
1. Create a Slack app with required permissions:
- `channels:read`
- `chat:write`
- `canvases:write`
- `canvases:read`
2. Install the app to your workspace
3. Configure in `config.yml`:
```yaml
messaging:
active: slack
slack:
token: 'xoxb-your-bot-token'
channel_id: 'C12345678'
```
## Advanced Usage
### Custom Prompts
Customize LLM prompts for summaries:
```yaml
api:
llm:
diff_summary_prompt: |
Your custom prompt for analyzing diffs...
overview_prompt_template: |
Your custom overview template with {summary_range} and {forthcoming_range}...
```
### Changing Language
Set overview language and customize instructions:
```yaml
overview:
language: en # Options: ko, en, ja, zh_CN
lab_info: "Your Lab Name and Description"
```
## Troubleshooting
### Common Issues
1. **Configuration problems**: Run `hedwig health` to diagnose configuration issues
2. **No summaries generated**: Check if there are recent commits within the lookback period
3. **Sync failures**: Verify Notion API key and page permissions
4. **LLM errors**: Check API key and rate limits
5. **Messaging failures**: Verify bot token and channel permissions
### First-Time Setup Issues
If you encounter problems during initial setup, run the health check:
```bash
hedwig health --config config.yml
```
This will identify:
- Missing or invalid configuration
- Permission issues
- Missing dependencies
- API connectivity problems
### Debug Mode
Run with verbose output for troubleshooting:
```bash
hedwig pipeline --config config.yml --verbose
```
### Logs
Check application logs for detailed error messages. The location depends on your configuration.
## License
MIT License - see LICENSE.txt for details
## Author
Hyeshik Chang <hyeshik@snu.ac.kr>
Raw data
{
"_id": null,
"home_page": null,
"name": "HedwigLab",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.9",
"maintainer_email": null,
"keywords": null,
"author": "Hyeshik Chang",
"author_email": "Hyeshik Chang <hyeshik@snu.ac.kr>",
"download_url": "https://files.pythonhosted.org/packages/39/37/ec13eed7af00bfdd220b57b5eb3a63dc9183ae198ef189df5a2575ea18e1/hedwiglab-0.9.0.tar.gz",
"platform": null,
"description": "# Hedwig\n\nHedwig is a research note backup storage that synchronizes Notion content to Git repositories and generates AI summaries for team communication. It automates the workflow of tracking research progress, creating summaries, and distributing them through messaging platforms.\n\n## Features\n\n- **Notion Synchronization**: Automatically sync research notes from Notion to a Git repository\n- **AI-Powered Summaries**: Generate intelligent summaries of research changes using LLMs\n- **Team Overviews**: Create consolidated team overviews with MVP highlights\n- **Multi-Platform Messaging**: Distribute summaries through various messaging platforms (currently Slack)\n- **Automated Pipeline**: Run the complete workflow with a single command\n- **Flexible Configuration**: Customize prompts, models, and behavior through configuration\n\n## Installation\n\nInstall Hedwig using pip:\n\n```bash\npip install -e /path/to/Hedwig\n```\n\nOr clone and install from source:\n\n```bash\ngit clone https://github.com/ChangLabSNU/Hedwig\ncd Hedwig\npip install -e .\n```\n\n## Quick Start\n\n1. **Set up configuration**:\n ```bash\n cp config.yml.example config.yml\n # Edit config.yml with your settings\n ```\n\n2. **Configure API keys and etc**:\n ```yaml\n # In config.yml\n api:\n notion:\n api_key: 'your-notion-api-key'\n llm:\n key: 'your-gemini-api-key'\n messaging:\n slack:\n token: 'your-slack-bot-token'\n ```\n\n3. **Check system health** (recommended before first sync):\n ```bash\n hedwig health --config config.yml\n ```\n This verifies that all components are properly configured and accessible.\n\n4. **Sync Notion content**:\n ```bash\n hedwig sync\n ```\n\n5. **Run the pipeline**:\n ```bash\n hedwig pipeline\n ```\n\n## Workflow Overview\n\nHedwig follows a two-stage process:\n\n```\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 STAGE 1 \u2502\n\u2502 Data Update \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n \u2502\n \u25bc\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 hedwig sync \u2502 \u2500\u2500\u2500 Fetches latest research notes from Notion\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 and commits them to Git repository\n \u2502\n \u2502 (Run periodically or on-demand)\n \u2502\n \u25bc\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 STAGE 2 \u2502\n\u2502 Pipeline \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n \u2502\n \u25bc\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 hedwig pipeline \u2502 \u2500\u2500\u2500 Automated 3-step process:\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n \u2502\n \u251c\u2500\u25ba generate-change-summary \u2500\u2500\u2500 Analyzes Git commits and creates\n \u2502 AI summaries of recent changes\n \u2502\n \u251c\u2500\u25ba generate-overview \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Consolidates individual summaries\n \u2502 into team-focused overview\n \u2502\n \u2514\u2500\u25ba post-summary \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Posts to messaging platform\n (e.g., Slack Canvas)\n```\n\n**Important**: The `sync` command must be run before the pipeline to ensure the Git repository has the latest Notion content. The sync is NOT part of the pipeline and should be scheduled separately.\n\n## Commands\n\n### `hedwig health`\nChecks the health of all Hedwig components and dependencies. **Recommended to run before first sync** to ensure proper setup.\n\n```bash\nhedwig health [--config CONFIG] [--quick] [--json] [--quiet]\n```\n\n**Options:**\n- `--config`: Configuration file path (default: `config.yml`)\n- `--quick`: Skip API connectivity tests for faster results\n- `--json`: Output results in JSON format for monitoring tools\n- `--quiet`: Suppress informational messages\n\n**Health Checks Include:**\n- Configuration file validity and required keys\n- Git repository status and permissions\n- Python package dependencies\n- Filesystem permissions and disk space\n- API connectivity (Notion, LLM, Slack) unless `--quick` is used\n\n**Exit Codes:**\n- `0`: All checks passed (HEALTHY)\n- `1`: Some non-critical checks failed (DEGRADED)\n- `2`: Critical checks failed (CRITICAL)\n\n**Example Usage:**\n```bash\n# Full health check before first sync\nhedwig health --config config.yml\n\n# Quick check (skip API tests)\nhedwig health --quick\n\n# JSON output for monitoring\nhedwig health --json | jq '.overall_status'\n```\n\n### `hedwig sync`\nSynchronizes Notion pages to a Git repository.\n\n```bash\nhedwig sync [--config CONFIG] [--quiet] [--verbose]\n```\n\n**Options:**\n- `--config`: Configuration file path (default: `config.yml`)\n- `--quiet`: Suppress progress messages\n- `--verbose`: Show detailed debug output\n\n### `hedwig sync-userlist`\nManually syncs user list from Notion and saves to TSV file. This command is typically not needed in regular workflows as it's automatically triggered when unknown users are encountered.\n\n```bash\nhedwig sync-userlist [--config CONFIG] [--quiet]\n```\n\n**Options:**\n- `--config`: Configuration file path (default: `config.yml`)\n- `--quiet`: Suppress progress messages\n\n**Output:**\nCreates a TSV file at the path specified in `paths.userlist_file` containing:\n- `user_id`: Notion user UUID\n- `name`: User's display name\n\n**Override Feature:**\nIf `paths.userlist_override_file` is configured and the file exists, users from this file will override or supplement the Notion user list. This is useful for:\n- Correcting names that appear incorrectly in Notion\n- Adding custom display names for specific users\n- Including users that may not be in the Notion workspace\n\nThe override file should have the same TSV format as the output file.\n\n**Note:** With auto-sync enabled (default), this command is automatically run when `generate-change-summary` encounters unknown user IDs.\n\n### `hedwig generate-change-summary`\nAnalyzes recent Git commits and generates AI-powered summaries.\n\n```bash\nhedwig generate-change-summary [--config CONFIG] [--no-write]\n```\n\n**Options:**\n- `--config`: Configuration file path (default: `config.yml`)\n- `--no-write`: Print to stdout instead of saving to file\n\n**Auto User Sync:**\nWhen `change_summary.auto_sync_userlist` is set to `true` (default), the command will automatically run `sync-userlist` if it encounters user IDs not found in the user list. This ensures that new team members are automatically added to the user list. Set to `false` to disable this behavior.\n\n### `hedwig generate-overview`\nCreates team-focused overview summaries from individual change summaries.\n\n```bash\nhedwig generate-overview [--config CONFIG] [--no-write]\n```\n\n**Options:**\n- `--config`: Configuration file path (default: `config.yml`)\n- `--no-write`: Print to stdout instead of saving to file\n\n### `hedwig post-summary`\nPosts summaries to configured messaging platforms.\n\n```bash\nhedwig post-summary --summary-file FILE --overview-file FILE --title TITLE [--config CONFIG]\n```\n\n**Options:**\n- `--summary-file`: Path to the markdown summary file\n- `--overview-file`: Path to the overview message file\n- `--title`: Title for the posted summary\n- `--config`: Configuration file path (default: `config.yml`)\n\n### `hedwig pipeline`\nRuns the complete summarization pipeline automatically.\n\n```bash\nhedwig pipeline [--config CONFIG]\n```\n\n**Options:**\n- `--config`: Configuration file path (default: `config.yml`)\n\n**Note**: This command does NOT include syncing from Notion. Run `hedwig sync` separately before the pipeline to ensure the Git repository is up-to-date.\n\n## Configuration\n\nHedwig uses a YAML configuration file. Copy `config.yml.example` to `config.yml` and customize:\n\n### Essential Settings\n\n```yaml\n# Repository paths\npaths:\n notes_repository: '/path/to/your/notes/repo'\n change_summary_output: '/path/to/summary/output'\n\n# API Keys (can be set here OR as environment variables)\nnotion:\n api_key: 'your-notion-api-key' # Alternative: export NOTION_API_KEY=...\n\napi:\n llm:\n key: 'your-gemini-api-key' # Alternative: export GEMINI_API_KEY=...\n url: 'https://generativelanguage.googleapis.com/v1beta/openai/'\n\nmessaging:\n slack:\n token: 'xoxb-your-bot-token' # Alternative: export SLACK_TOKEN=...\n```\n\n### Key Configuration Options\n\n- **Sync Settings**: Checkpoint tracking, timezone, lookback days\n- **Summary Settings**: Model selection, prompt customization, diff length limits\n- **Overview Settings**: Language selection, lab information, weekday configurations\n- **Messaging Settings**: Platform selection, channel configuration\n- **Pipeline Settings**: Title format customization\n\nSee `config.yml.example` for all available options with detailed comments.\n\n## Automated Execution\n\nSet up cron jobs for the two-stage process:\n\n```bash\n# Sync from Notion every hour during work hours\n0 * * * * /usr/bin/hedwig sync --config /path/to/config.yml\n\n# Run pipeline everyday except Sunday at 8:30 AM\n30 8 * * 1-6 /usr/bin/hedwig pipeline --config /path/to/config.yml\n```\n\n## Messaging Platforms\n\n### Slack Integration\n\nHedwig creates Canvas documents in Slack for rich formatting:\n\n1. Create a Slack app with required permissions:\n - `channels:read`\n - `chat:write`\n - `canvases:write`\n - `canvases:read`\n\n2. Install the app to your workspace\n\n3. Configure in `config.yml`:\n ```yaml\n messaging:\n active: slack\n slack:\n token: 'xoxb-your-bot-token'\n channel_id: 'C12345678'\n ```\n\n## Advanced Usage\n\n### Custom Prompts\n\nCustomize LLM prompts for summaries:\n\n```yaml\napi:\n llm:\n diff_summary_prompt: |\n Your custom prompt for analyzing diffs...\n\n overview_prompt_template: |\n Your custom overview template with {summary_range} and {forthcoming_range}...\n```\n\n### Changing Language\n\nSet overview language and customize instructions:\n\n```yaml\noverview:\n language: en # Options: ko, en, ja, zh_CN\n lab_info: \"Your Lab Name and Description\"\n```\n\n## Troubleshooting\n\n### Common Issues\n\n1. **Configuration problems**: Run `hedwig health` to diagnose configuration issues\n2. **No summaries generated**: Check if there are recent commits within the lookback period\n3. **Sync failures**: Verify Notion API key and page permissions\n4. **LLM errors**: Check API key and rate limits\n5. **Messaging failures**: Verify bot token and channel permissions\n\n### First-Time Setup Issues\n\nIf you encounter problems during initial setup, run the health check:\n\n```bash\nhedwig health --config config.yml\n```\n\nThis will identify:\n- Missing or invalid configuration\n- Permission issues\n- Missing dependencies\n- API connectivity problems\n\n### Debug Mode\n\nRun with verbose output for troubleshooting:\n\n```bash\nhedwig pipeline --config config.yml --verbose\n```\n\n### Logs\n\nCheck application logs for detailed error messages. The location depends on your configuration.\n\n## License\n\nMIT License - see LICENSE.txt for details\n\n## Author\n\nHyeshik Chang <hyeshik@snu.ac.kr>\n",
"bugtrack_url": null,
"license": null,
"summary": "Research note backup storage that syncs Notion to Git and generates AI summaries",
"version": "0.9.0",
"project_urls": null,
"split_keywords": [],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "cd3b37ddd499712706dd39614645e4af96e32f4cda309da14378a2e0c57261e0",
"md5": "c559cb2ef4275be9e6362c0ed7bc44d8",
"sha256": "4ab26f178a83afbad1fe0e3a4e779632e1b7bd96f6344108da124e9e6128cddd"
},
"downloads": -1,
"filename": "hedwiglab-0.9.0-py3-none-any.whl",
"has_sig": false,
"md5_digest": "c559cb2ef4275be9e6362c0ed7bc44d8",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.9",
"size": 64942,
"upload_time": "2025-07-12T00:29:00",
"upload_time_iso_8601": "2025-07-12T00:29:00.351132Z",
"url": "https://files.pythonhosted.org/packages/cd/3b/37ddd499712706dd39614645e4af96e32f4cda309da14378a2e0c57261e0/hedwiglab-0.9.0-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "3937ec13eed7af00bfdd220b57b5eb3a63dc9183ae198ef189df5a2575ea18e1",
"md5": "34998077038b45d51ddcc263e701aad2",
"sha256": "c6f60ca89b2730ee9b26d705ea099b0579907ed8f0768b2f9164164b587e78f2"
},
"downloads": -1,
"filename": "hedwiglab-0.9.0.tar.gz",
"has_sig": false,
"md5_digest": "34998077038b45d51ddcc263e701aad2",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.9",
"size": 43478,
"upload_time": "2025-07-12T00:29:02",
"upload_time_iso_8601": "2025-07-12T00:29:02.414271Z",
"url": "https://files.pythonhosted.org/packages/39/37/ec13eed7af00bfdd220b57b5eb3a63dc9183ae198ef189df5a2575ea18e1/hedwiglab-0.9.0.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-07-12 00:29:02",
"github": false,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"lcname": "hedwiglab"
}