Skip to main content

working demo

LeVibes

Generate motivational social media posts with AI and LeBron James

Stars Watchers

Features

  • Generate beautiful motivational images with AI-powered captions
  • Upload images as draft slideshows to TikTok
  • Cloudflare R2 integration for image hosting
  • Interactive CLI interface

Installation

# Clone the repository
git clone https://github.com/makors/levibes
cd levibes

# Install dependencies using uv
uv sync

# Or with pip
pip install -e .

Configuration

Create a .env file in the project root with the following variables:

Complete Example .env File

# OpenAI Configuration
OPENAI_API_KEY=your_openai_api_key_here

# TikTok API Configuration
TIKTOK_CLIENT_ID=your_tiktok_client_id
TIKTOK_CLIENT_SECRET=your_tiktok_client_secret

# Cloudflare R2 Configuration
CLOUDFLARE_R2_ENDPOINT_URL=https://abc123def456.r2.cloudflarestorage.com
CLOUDFLARE_R2_ACCESS_KEY_ID=your_r2_access_key_id
CLOUDFLARE_R2_SECRET_ACCESS_KEY=your_r2_secret_access_key
CLOUDFLARE_R2_BUCKET_NAME=my-levibes-bucket

# R2 Public URL (r2.dev subdomain - recommended)
CLOUDFLARE_R2_PUBLIC_URL_BASE=https://my-levibes-bucket.r2.dev

Environment Variables Breakdown

OpenAI Configuration

OPENAI_API_KEY=your_openai_api_key_here

TikTok API Configuration

TIKTOK_CLIENT_ID=your_tiktok_client_id
TIKTOK_CLIENT_SECRET=your_tiktok_client_secret

Cloudflare R2 Configuration

# Required R2 variables
CLOUDFLARE_R2_ENDPOINT_URL=https://your-account-id.r2.cloudflarestorage.com
CLOUDFLARE_R2_ACCESS_KEY_ID=your_r2_access_key_id
CLOUDFLARE_R2_SECRET_ACCESS_KEY=your_r2_secret_access_key
CLOUDFLARE_R2_BUCKET_NAME=your_r2_bucket_name

# Optional: Public URL base for accessing files
# Use r2.dev subdomain: https://your-bucket-name.r2.dev
# Or custom domain: https://your-custom-domain.com
CLOUDFLARE_R2_PUBLIC_URL_BASE=https://your-bucket-name.r2.dev

Setting up Cloudflare R2

  1. Create a Cloudflare R2 Bucket:

    • Go to Cloudflare Dashboard
    • Navigate to R2 Object Storage
    • Create a new bucket with a unique name
    • Note the bucket name for your .env file
  2. Create R2 API Token:

    • Go to "Manage R2 API Tokens"
    • Create a new API token with read/write permissions
    • Note the Access Key ID and Secret Access Key
  3. Configure Public Access:

    • In your bucket settings, enable public access
    • This will give you an r2.dev subdomain: https://your-bucket-name.r2.dev
    • Set CLOUDFLARE_R2_PUBLIC_URL_BASE=https://your-bucket-name.r2.dev
    • Alternatively, configure a custom domain if desired

💡 Using r2.dev Subdomain

If you're using an r2.dev subdomain (like https://my-bucket.r2.dev), this is the recommended and simplest approach:

  1. Enable public access on your R2 bucket
  2. Use the provided r2.dev URL as your CLOUDFLARE_R2_PUBLIC_URL_BASE
  3. The app will upload via the R2 API and serve files via the r2.dev subdomain

Example configuration:

CLOUDFLARE_R2_PUBLIC_URL_BASE=https://my-levibes-bucket.r2.dev
  1. Set R2 Endpoint URL:
    • Format: https://your-account-id.r2.cloudflarestorage.com
    • Replace your-account-id with your actual Cloudflare account ID
    • This is used for uploads via API, not for public access

Setting up TikTok API

  1. Create TikTok Developer Account:

  2. Configure App Settings:

    • Set redirect URI to: https://tiktoklocal.com:8080/callback
    • Enable the following scopes:
      • user.info.basic
      • user.info.profile
      • video.upload
    • Note the Client ID and Client Secret
  3. Domain Configuration:

    • Add tiktoklocal.com to your hosts file pointing to 127.0.0.1
    • On macOS/Linux: echo "127.0.0.1 tiktoklocal.com" | sudo tee -a /etc/hosts
    • On Windows: Add to C:\Windows\System32\drivers\etc\hosts

Usage

Basic Usage

# Run the application
python main.py

# Or use the CLI directly
levibes

Command Line Options

# Generate images only
python main.py --no-upload

# Upload existing images
python main.py --upload-only

# Specify custom output directory
python main.py --output-dir ./my-images

# Set custom caption
python main.py --caption "Follow for more motivation!"

TikTok Upload Process

  1. Authentication:

    • The app will open a browser for TikTok OAuth
    • You may see a security warning (SSL certificate)
    • Click "Advanced" and "Proceed to tiktoklocal.com"
    • Authorize the app
  2. Image Upload:

    • Images are first uploaded to Cloudflare R2
    • R2 URLs are then used to create TikTok draft
    • Draft appears in your TikTok app inbox
  3. Publishing:

    • Open TikTok app on your phone
    • Go to inbox and find the draft
    • Edit and publish as desired

File Structure

levibes/
├── src/levibes/
│   ├── caption_generation.py  # AI caption generation
│   ├── generate_images.py     # Image creation
│   ├── upload.py             # TikTok/R2 upload
│   ├── cli.py                # Command line interface
│   └── config.py             # Configuration management
├── output/                   # Generated images
├── main.py                   # Entry point
└── .env                      # Environment variables

API Limits

  • TikTok API: 6 requests per minute per user
  • R2 Storage: Check your Cloudflare plan limits
  • OpenAI API: Based on your plan and usage

Troubleshooting

Common Issues

  1. "Missing required environment variables"

    • Ensure all required variables are set in .env
    • Check for typos in variable names
  2. "Authorization failed"

    • Verify TikTok Client ID and Secret
    • Check that redirect URI is correctly configured
    • Ensure tiktoklocal.com is in your hosts file
  3. "Failed to upload to R2"

    • Verify R2 credentials and bucket name
    • Check bucket permissions
    • Ensure endpoint URL is correct
    • If using r2.dev subdomain, make sure public access is enabled on the bucket
  4. SSL Certificate Warning

    • This is normal for local development
    • Click "Advanced" and "Proceed to tiktoklocal.com"

Debug Mode

Set DEBUG=1 in your .env file for detailed logging:

DEBUG=1

Contributing

  1. Fork the repository
  2. Create a feature branch
  3. Make your changes
  4. Test thoroughly
  5. Submit a pull request

License

MIT License - see LICENSE file for details.

Metadata

Release files for levibes 0.1.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for levibes 0.1.1
File Size Uploaded
levibes-0.1.1.tar.gz 22.6 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for levibes 0.1.1
File Interpreter ABI Platform
levibes-0.1.1-py3-none-any.whl Python 3 none any Details

Total release size: 46.2 kB

Release files / levibes-0.1.1.tar.gz

Download URL levibes-0.1.1.tar.gz
Size 22.6 kB
Tags Source
SHA-256 checksum
How to use checksums
e0a7d0993784ac963a94d062df3f3051ede059b0ac2a227e3ac24520b5c5e2d3
BLAKE2b-256 checksum
How to use checksums
f59167f2c59b7af6fd5a8b9fe76f45259da4341e32332771472539c73bf5a194
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.7.19

Release files / levibes-0.1.1-py3-none-any.whl

Download URL levibes-0.1.1-py3-none-any.whl
Size 23.6 kB
Tags Python 3
SHA-256 checksum
How to use checksums
7b66a8378950104337ae62ff7757dec3a1b1bf129d41ffbd666ac435ead8fa8a
BLAKE2b-256 checksum
How to use checksums
1ad49d08b86c6b235326ac126e4cff2ba32d38c52af82c05163550b5a39a5bbe
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.7.19

Release history Release notifications | RSS feed

This release

0.1.1 This release

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page