Luna is a tool for artists and creative technologists which automates the creation, management, and syndication of art and personal projects across various channels. It streamlines the process of maintaining consistent organization of your work across different platforms.
Luna simplifies your creative workflow through a command-line interface that:
- Creates standardized local project directories for work-in-progress files and media
- Sets up GitHub repositories with proper structure and documentation
- Generates consistent metadata across all your projects
- Optionally integrates with Things 3 for task management (macOS only)
When you're ready to share your work, Luna facilitates publication through various channels:
- Portfolio website (designed for Jekyll-based sites)
- GitHub repositories
- PDF generation for exhibition submissions and open calls
- Raw file exports for other purposes
- Single Source of Truth: Maintain all project information in one place to eliminate redundancy
- Standardized Structure: Consistent project organization for easier navigation and management
- Multi-Channel Publishing:
- Website: Generate Jekyll-compatible posts and media files
- GitHub: Create repositories and update README files
- PDF: Format project documentation for submissions with customizable options
- Raw: Export organized files for other platforms
- Optional Integrations:
- Things 3 on macOS for task management
- Clone the repository:
git clone [email protected]:yourusername/luna.git
cd luna
- Create and activate a virtual environment:
python -m venv .venv
source .venv/bin/activate # On Windows: .venv\Scripts\activate
- Install dependencies:
pip install -r src/requirements.txt
- Create your environment file:
cp src/.env.example .env
# Edit .env with your values
- Set up your personal info:
cp src/personal-info.yml.example src/personal-info.yml
# Edit with your information
Edit the .env
file with your specific settings:
PROJECT_BASE_DIR
: Path where you want to create and manage projectsFIRST_NAME
andLAST_NAME
: Your name for documentationWEBSITE_DOMAIN
: The domain where your Jekyll website is hostedWEBSITE_DIR
: Path to your website directoryWEBSITE_POSTS
: Relative path to posts directory (e.g., "_posts")WEBSITE_MEDIA
: Relative path to media directory (e.g., "_media")WEBSITE_PAGES
: Relative path to pages directory (e.g., "_pages")
GITHUB_USERNAME
andGITHUB_TOKEN
: For GitHub integrationENABLE_THINGS3
: Set to "true" to enable Things 3 integrationTHINGS3_AREA
: Area in Things 3 where projects should be created
All commands are run using the main script:
python -m src.script.main create
This interactive command will:
- Prompt for a project display name
- Create a standardized directory structure
- Initialize basic metadata files
- Optionally create a GitHub repository
- Optionally create a Things 3 project (if enabled)
python -m src.script.main list
# Sort by different criteria
python -m src.script.main list --sort-by date
python -m src.script.main list --sort-by priority
python -m src.script.main list --sort-by status
# Filter by status
python -m src.script.main list --status in_progress
python -m src.script.main rename
This updates the project locally and across all integration channels.
python -m src.script.main delete
# or
python -m src.script.main delete --projects project-name
# Publish specific projects to all channels
python -m src.script.main publish --projects project1 project2 --all-channels
# Publish all projects to specific channels
python -m src.script.main publish --all-projects --channels github web
# Publish specific projects to specific channels
python -m src.script.main publish --projects project1 --channels pdf
# Generate PDF with images collated in the same document
python -m src.script.main publish --projects project1 --channels pdf --collate-images
# Generate PDF with separate image files and specific dimensions
python -m src.script.main publish --projects project1 --channels pdf --max-width 1200 --max-height 800
# Add a prefix to exported filenames
python -m src.script.main publish --projects project1 --channels pdf --filename-prepend "Exhibition-2023-"
# Specify submission name for PDF
python -m src.script.main publish --projects project1 --channels pdf --submission-name "Gallery-Open-Call-2023"
# Stage (generate README.md without pushing)
python -m src.script.main stage --projects project1 --channels github
# Publish with commit message
python -m src.script.main publish --projects project1 --channels github --commit-message "Updated project documentation"
# Stage website content (project status must be "complete")
python -m src.script.main stage --projects project1 --channels web
# Publish to website
python -m src.script.main publish --projects project1 --channels web
# Export files to output folder
python -m src.script.main publish --projects project1 --channels raw
Each project is created with the following structure:
project-name/
βββ src/ # Source code for the project
βββ media/ # Media files for publication
β βββ images/ # Image files
β βββ videos/ # Video files
β βββ audio/ # Audio files
β βββ models/ # 3D model files
β βββ docs/ # Document files
β βββ embeds/ # Embed content
βββ media-internal/ # Working/draft media files (not published)
β βββ images/
β βββ videos/
β βββ audio/
β βββ models/
β βββ docs/
βββ content/ # Project content and metadata
β βββ content.md # Main content markdown
β βββ metadata.yml # Project metadata
β βββ README.md # Project README
The media-internal
directory is intended for work-in-progress assets that won't be committed to GitHub. When files are ready for publication, move them to the corresponding subdirectory in the media
folder.
luna/
βββ src/ # Source code
β βββ script/ # Main script modules
β β βββ channels/ # Publication channel handlers
β β βββ templates/ # Templates for various outputs
β β βββ utils.py # Utility functions
β βββ requirements.txt # Project dependencies
β βββ .env.example # Environment variable template
βββ tests/ # Test suite (see testing strategy)
- Create a new handler file in the
src/script/channels/
directory - Create any necessary templates in the
src/script/templates/
directory - Add your channel to the channel registry in
src/script/main.py
- Implement the required channel interface methods (stage, publish, etc.)
See the Testing Strategy document for details on how to run and create tests for Luna.
Contributions are welcome! Please feel free to submit a Pull Request.
- Fork the repository
- Create your feature branch (
git checkout -b feature/amazing-feature
) - Commit your changes (
git commit -m 'Add some amazing feature'
) - Push to the branch (
git push origin feature/amazing-feature
) - Open a Pull Request
This project is licensed under the MIT License - see the LICENSE file for details.