Repository files navigation

MiniStudio - Studio Artisan

An AI-powered miniature painting visualization app for tabletop hobbyists. Built with Expo (React Native) for iOS, Android, and Web.

Features

  • Designer Mode: Generate concept art sketches, 3D miniature renders, and studio-quality product shots
  • Painter Mode: Visualize painting styles (Heavy Metal, Grimdark, NMM, etc.) on your unpainted miniatures
  • Camera Capture: Take photos directly from the app
  • Image Library: Import images from your photo library
  • 4K Upscaling: Enhance generated images to high resolution
  • Color Palettes: Select from real hobby paint brands (Citadel, Vallejo, Army Painter)
  • Background Themes: Add Fantasy, Sci-Fi, Modern, or Historical environments

Tech Stack

  • Expo SDK 52 (React Native)
  • Expo Router for file-based navigation
  • NativeWind (Tailwind CSS for React Native)
  • Google Gemini API for AI image generation
  • Supabase for paint color database

Getting Started

Prerequisites

  • Node.js 18+
  • npm or yarn
  • Expo CLI (npm install -g @expo/cli)
  • For iOS development: macOS with Xcode
  • For Android development: Android Studio with SDK

Installation

  1. Install dependencies:

    npm install
  2. Add app icons (required):

    Add the following images to the assets/ folder:

    • icon.png (1024x1024) - Main app icon
    • adaptive-icon.png (1024x1024) - Android adaptive icon
    • splash-icon.png (512x512) - Splash screen icon
    • favicon.png (48x48) - Web favicon
  3. Set up your Gemini API key:

    Get an API key from Google AI Studio and enter it in the app settings.

Running the App

Start the development server:

npm start

Run on specific platforms:

# Web (for development preview)
npm run web
# iOS Simulator
npm run ios
# Android Emulator
npm run android

Building for Production

Using EAS Build (recommended):

# Install EAS CLI
npm install -g eas-cli
# Configure your project
eas build:configure
# Build for iOS
npm run build:ios
# Build for Android
npm run build:android

Project Structure

├── app/ # Expo Router screens
│ ├── _layout.tsx # Root layout
│ ├── index.tsx # Welcome/auth screen
│ ├── camera.tsx # Camera capture screen
│ ├── settings.tsx # Settings screen
│ └── (studio)/ # Main studio screens
│ ├── _layout.tsx
│ └── index.tsx # Main studio interface
├── src/
│ ├── components/ # Reusable components
│ │ └── Icons.tsx # SVG icon components
│ ├── hooks/ # Custom React hooks
│ │ ├── useCamera.ts
│ │ ├── useImagePicker.ts
│ │ └── useMediaSave.ts
│ ├── services/ # API and data services
│ │ ├── geminiService.ts # Gemini AI integration
│ │ ├── paintService.ts # Paint database API
│ │ └── storageService.ts # Secure storage
│ ├── constants.ts # App constants
│ └── types.ts # TypeScript types
├── assets/ # App icons and images
├── app.json # Expo configuration
├── babel.config.js # Babel configuration
├── metro.config.js # Metro bundler configuration
├── tailwind.config.js # Tailwind/NativeWind configuration
└── global.css # Global Tailwind styles

Configuration

Environment Variables

The app uses secure storage for API keys. Users enter their Gemini API key in the app settings, which is stored securely on the device.

Customization

  • Painting Styles: Edit src/constants.ts to add or modify painting style prompts
  • Color Palettes: The app fetches colors from a Supabase database (see src/services/paintService.ts)
  • Theme Colors: Modify tailwind.config.js to customize the app theme

API Requirements

This app requires a paid Google Cloud project with the Gemini API enabled:

  1. Create a Google Cloud project
  2. Enable the Gemini API
  3. Set up billing
  4. Generate an API key
  5. Enter the key in the app settings

See Gemini API Billing Documentation for details.

Platform Notes

iOS

  • Camera permissions are configured in app.json
  • Requires iOS 13.4+

Android

  • Camera and storage permissions are configured in app.json
  • Requires Android API 23+

Web

  • Uses localStorage for secure storage (fallback)
  • Camera API uses browser's getUserMedia
  • Full functionality available in modern browsers

Troubleshooting

TypeScript errors before install: This is expected. Run npm install to install all dependencies and resolve type errors.

Camera not working on web: Ensure you're using HTTPS or localhost, as getUserMedia requires a secure context.

Build errors: Make sure you have the correct version of Node.js (18+) and have run npm install.

License

© 2025 Miniature Logic Systems. All rights reserved.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

MiniStudio - Studio Artisan

An AI-powered miniature painting visualization app for tabletop hobbyists. Built with Expo (React Native) for iOS, Android, and Web.

Features

  • Designer Mode: Generate concept art sketches, 3D miniature renders, and studio-quality product shots
  • Painter Mode: Visualize painting styles (Heavy Metal, Grimdark, NMM, etc.) on your unpainted miniatures
  • Camera Capture: Take photos directly from the app
  • Image Library: Import images from your photo library
  • 4K Upscaling: Enhance generated images to high resolution
  • Color Palettes: Select from real hobby paint brands (Citadel, Vallejo, Army Painter)
  • Background Themes: Add Fantasy, Sci-Fi, Modern, or Historical environments

Tech Stack

  • Expo SDK 52 (React Native)
  • Expo Router for file-based navigation
  • NativeWind (Tailwind CSS for React Native)
  • Google Gemini API for AI image generation
  • Supabase for paint color database

Getting Started

Prerequisites

  • Node.js 18+
  • npm or yarn
  • Expo CLI (npm install -g @expo/cli)
  • For iOS development: macOS with Xcode
  • For Android development: Android Studio with SDK

Installation

  1. Install dependencies:

    npm install
  2. Add app icons (required):

    Add the following images to the assets/ folder:

    • icon.png (1024x1024) - Main app icon
    • adaptive-icon.png (1024x1024) - Android adaptive icon
    • splash-icon.png (512x512) - Splash screen icon
    • favicon.png (48x48) - Web favicon
  3. Set up your Gemini API key:

    Get an API key from Google AI Studio and enter it in the app settings.

Running the App

Start the development server:

npm start

Run on specific platforms:

# Web (for development preview)
npm run web
# iOS Simulator
npm run ios
# Android Emulator
npm run android

Building for Production

Using EAS Build (recommended):

# Install EAS CLI
npm install -g eas-cli
# Configure your project
eas build:configure
# Build for iOS
npm run build:ios
# Build for Android
npm run build:android

Project Structure

├── app/ # Expo Router screens
│ ├── _layout.tsx # Root layout
│ ├── index.tsx # Welcome/auth screen
│ ├── camera.tsx # Camera capture screen
│ ├── settings.tsx # Settings screen
│ └── (studio)/ # Main studio screens
│ ├── _layout.tsx
│ └── index.tsx # Main studio interface
├── src/
│ ├── components/ # Reusable components
│ │ └── Icons.tsx # SVG icon components
│ ├── hooks/ # Custom React hooks
│ │ ├── useCamera.ts
│ │ ├── useImagePicker.ts
│ │ └── useMediaSave.ts
│ ├── services/ # API and data services
│ │ ├── geminiService.ts # Gemini AI integration
│ │ ├── paintService.ts # Paint database API
│ │ └── storageService.ts # Secure storage
│ ├── constants.ts # App constants
│ └── types.ts # TypeScript types
├── assets/ # App icons and images
├── app.json # Expo configuration
├── babel.config.js # Babel configuration
├── metro.config.js # Metro bundler configuration
├── tailwind.config.js # Tailwind/NativeWind configuration
└── global.css # Global Tailwind styles

Configuration

Environment Variables

The app uses secure storage for API keys. Users enter their Gemini API key in the app settings, which is stored securely on the device.

Customization

  • Painting Styles: Edit src/constants.ts to add or modify painting style prompts
  • Color Palettes: The app fetches colors from a Supabase database (see src/services/paintService.ts)
  • Theme Colors: Modify tailwind.config.js to customize the app theme

API Requirements

This app requires a paid Google Cloud project with the Gemini API enabled:

  1. Create a Google Cloud project
  2. Enable the Gemini API
  3. Set up billing
  4. Generate an API key
  5. Enter the key in the app settings

See Gemini API Billing Documentation for details.

Platform Notes

iOS

  • Camera permissions are configured in app.json
  • Requires iOS 13.4+

Android

  • Camera and storage permissions are configured in app.json
  • Requires Android API 23+

Web

  • Uses localStorage for secure storage (fallback)
  • Camera API uses browser's getUserMedia
  • Full functionality available in modern browsers

Troubleshooting

TypeScript errors before install: This is expected. Run npm install to install all dependencies and resolve type errors.

Camera not working on web: Ensure you're using HTTPS or localhost, as getUserMedia requires a secure context.

Build errors: Make sure you have the correct version of Node.js (18+) and have run npm install.

License

© 2025 Miniature Logic Systems. All rights reserved.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

MiniStudio - Studio Artisan

An AI-powered miniature painting visualization app for tabletop hobbyists. Built with Expo (React Native) for iOS, Android, and Web.

Features

  • Designer Mode: Generate concept art sketches, 3D miniature renders, and studio-quality product shots
  • Painter Mode: Visualize painting styles (Heavy Metal, Grimdark, NMM, etc.) on your unpainted miniatures
  • Camera Capture: Take photos directly from the app
  • Image Library: Import images from your photo library
  • 4K Upscaling: Enhance generated images to high resolution
  • Color Palettes: Select from real hobby paint brands (Citadel, Vallejo, Army Painter)
  • Background Themes: Add Fantasy, Sci-Fi, Modern, or Historical environments

Tech Stack

  • Expo SDK 52 (React Native)
  • Expo Router for file-based navigation
  • NativeWind (Tailwind CSS for React Native)
  • Google Gemini API for AI image generation
  • Supabase for paint color database

Getting Started

Prerequisites

  • Node.js 18+
  • npm or yarn
  • Expo CLI (npm install -g @expo/cli)
  • For iOS development: macOS with Xcode
  • For Android development: Android Studio with SDK

Installation

  1. Install dependencies:

    npm install
  2. Add app icons (required):

    Add the following images to the assets/ folder:

    • icon.png (1024x1024) - Main app icon
    • adaptive-icon.png (1024x1024) - Android adaptive icon
    • splash-icon.png (512x512) - Splash screen icon
    • favicon.png (48x48) - Web favicon
  3. Set up your Gemini API key:

    Get an API key from Google AI Studio and enter it in the app settings.

Running the App

Start the development server:

npm start

Run on specific platforms:

# Web (for development preview)
npm run web
# iOS Simulator
npm run ios
# Android Emulator
npm run android

Building for Production

Using EAS Build (recommended):

# Install EAS CLI
npm install -g eas-cli
# Configure your project
eas build:configure
# Build for iOS
npm run build:ios
# Build for Android
npm run build:android

Project Structure

├── app/ # Expo Router screens
│ ├── _layout.tsx # Root layout
│ ├── index.tsx # Welcome/auth screen
│ ├── camera.tsx # Camera capture screen
│ ├── settings.tsx # Settings screen
│ └── (studio)/ # Main studio screens
│ ├── _layout.tsx
│ └── index.tsx # Main studio interface
├── src/
│ ├── components/ # Reusable components
│ │ └── Icons.tsx # SVG icon components
│ ├── hooks/ # Custom React hooks
│ │ ├── useCamera.ts
│ │ ├── useImagePicker.ts
│ │ └── useMediaSave.ts
│ ├── services/ # API and data services
│ │ ├── geminiService.ts # Gemini AI integration
│ │ ├── paintService.ts # Paint database API
│ │ └── storageService.ts # Secure storage
│ ├── constants.ts # App constants
│ └── types.ts # TypeScript types
├── assets/ # App icons and images
├── app.json # Expo configuration
├── babel.config.js # Babel configuration
├── metro.config.js # Metro bundler configuration
├── tailwind.config.js # Tailwind/NativeWind configuration
└── global.css # Global Tailwind styles

Configuration

Environment Variables

The app uses secure storage for API keys. Users enter their Gemini API key in the app settings, which is stored securely on the device.

Customization

  • Painting Styles: Edit src/constants.ts to add or modify painting style prompts
  • Color Palettes: The app fetches colors from a Supabase database (see src/services/paintService.ts)
  • Theme Colors: Modify tailwind.config.js to customize the app theme

API Requirements

This app requires a paid Google Cloud project with the Gemini API enabled:

  1. Create a Google Cloud project
  2. Enable the Gemini API
  3. Set up billing
  4. Generate an API key
  5. Enter the key in the app settings

See Gemini API Billing Documentation for details.

Platform Notes

iOS

  • Camera permissions are configured in app.json
  • Requires iOS 13.4+

Android

  • Camera and storage permissions are configured in app.json
  • Requires Android API 23+

Web

  • Uses localStorage for secure storage (fallback)
  • Camera API uses browser's getUserMedia
  • Full functionality available in modern browsers

Troubleshooting

TypeScript errors before install: This is expected. Run npm install to install all dependencies and resolve type errors.

Camera not working on web: Ensure you're using HTTPS or localhost, as getUserMedia requires a secure context.

Build errors: Make sure you have the correct version of Node.js (18+) and have run npm install.

License

© 2025 Miniature Logic Systems. All rights reserved.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

MiniStudio - Studio Artisan

An AI-powered miniature painting visualization app for tabletop hobbyists. Built with Expo (React Native) for iOS, Android, and Web.

Features

  • Designer Mode: Generate concept art sketches, 3D miniature renders, and studio-quality product shots
  • Painter Mode: Visualize painting styles (Heavy Metal, Grimdark, NMM, etc.) on your unpainted miniatures
  • Camera Capture: Take photos directly from the app
  • Image Library: Import images from your photo library
  • 4K Upscaling: Enhance generated images to high resolution
  • Color Palettes: Select from real hobby paint brands (Citadel, Vallejo, Army Painter)
  • Background Themes: Add Fantasy, Sci-Fi, Modern, or Historical environments

Tech Stack

  • Expo SDK 52 (React Native)
  • Expo Router for file-based navigation
  • NativeWind (Tailwind CSS for React Native)
  • Google Gemini API for AI image generation
  • Supabase for paint color database

Getting Started

Prerequisites

  • Node.js 18+
  • npm or yarn
  • Expo CLI (npm install -g @expo/cli)
  • For iOS development: macOS with Xcode
  • For Android development: Android Studio with SDK

Installation

  1. Install dependencies:

    npm install
  2. Add app icons (required):

    Add the following images to the assets/ folder:

    • icon.png (1024x1024) - Main app icon
    • adaptive-icon.png (1024x1024) - Android adaptive icon
    • splash-icon.png (512x512) - Splash screen icon
    • favicon.png (48x48) - Web favicon
  3. Set up your Gemini API key:

    Get an API key from Google AI Studio and enter it in the app settings.

Running the App

Start the development server:

npm start

Run on specific platforms:

# Web (for development preview)
npm run web
# iOS Simulator
npm run ios
# Android Emulator
npm run android

Building for Production

Using EAS Build (recommended):

# Install EAS CLI
npm install -g eas-cli
# Configure your project
eas build:configure
# Build for iOS
npm run build:ios
# Build for Android
npm run build:android

Project Structure

├── app/ # Expo Router screens
│ ├── _layout.tsx # Root layout
│ ├── index.tsx # Welcome/auth screen
│ ├── camera.tsx # Camera capture screen
│ ├── settings.tsx # Settings screen
│ └── (studio)/ # Main studio screens
│ ├── _layout.tsx
│ └── index.tsx # Main studio interface
├── src/
│ ├── components/ # Reusable components
│ │ └── Icons.tsx # SVG icon components
│ ├── hooks/ # Custom React hooks
│ │ ├── useCamera.ts
│ │ ├── useImagePicker.ts
│ │ └── useMediaSave.ts
│ ├── services/ # API and data services
│ │ ├── geminiService.ts # Gemini AI integration
│ │ ├── paintService.ts # Paint database API
│ │ └── storageService.ts # Secure storage
│ ├── constants.ts # App constants
│ └── types.ts # TypeScript types
├── assets/ # App icons and images
├── app.json # Expo configuration
├── babel.config.js # Babel configuration
├── metro.config.js # Metro bundler configuration
├── tailwind.config.js # Tailwind/NativeWind configuration
└── global.css # Global Tailwind styles

Configuration

Environment Variables

The app uses secure storage for API keys. Users enter their Gemini API key in the app settings, which is stored securely on the device.

Customization

  • Painting Styles: Edit src/constants.ts to add or modify painting style prompts
  • Color Palettes: The app fetches colors from a Supabase database (see src/services/paintService.ts)
  • Theme Colors: Modify tailwind.config.js to customize the app theme

API Requirements

This app requires a paid Google Cloud project with the Gemini API enabled:

  1. Create a Google Cloud project
  2. Enable the Gemini API
  3. Set up billing
  4. Generate an API key
  5. Enter the key in the app settings

See Gemini API Billing Documentation for details.

Platform Notes

iOS

  • Camera permissions are configured in app.json
  • Requires iOS 13.4+

Android

  • Camera and storage permissions are configured in app.json
  • Requires Android API 23+

Web

  • Uses localStorage for secure storage (fallback)
  • Camera API uses browser's getUserMedia
  • Full functionality available in modern browsers

Troubleshooting

TypeScript errors before install: This is expected. Run npm install to install all dependencies and resolve type errors.

Camera not working on web: Ensure you're using HTTPS or localhost, as getUserMedia requires a secure context.

Build errors: Make sure you have the correct version of Node.js (18+) and have run npm install.

License

© 2025 Miniature Logic Systems. All rights reserved.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

MiniStudio - Studio Artisan

An AI-powered miniature painting visualization app for tabletop hobbyists. Built with Expo (React Native) for iOS, Android, and Web.

Features

  • Designer Mode: Generate concept art sketches, 3D miniature renders, and studio-quality product shots
  • Painter Mode: Visualize painting styles (Heavy Metal, Grimdark, NMM, etc.) on your unpainted miniatures
  • Camera Capture: Take photos directly from the app
  • Image Library: Import images from your photo library
  • 4K Upscaling: Enhance generated images to high resolution
  • Color Palettes: Select from real hobby paint brands (Citadel, Vallejo, Army Painter)
  • Background Themes: Add Fantasy, Sci-Fi, Modern, or Historical environments

Tech Stack

  • Expo SDK 52 (React Native)
  • Expo Router for file-based navigation
  • NativeWind (Tailwind CSS for React Native)
  • Google Gemini API for AI image generation
  • Supabase for paint color database

Getting Started

Prerequisites

  • Node.js 18+
  • npm or yarn
  • Expo CLI (npm install -g @expo/cli)
  • For iOS development: macOS with Xcode
  • For Android development: Android Studio with SDK

Installation

  1. Install dependencies:

    npm install
  2. Add app icons (required):

    Add the following images to the assets/ folder:

    • icon.png (1024x1024) - Main app icon
    • adaptive-icon.png (1024x1024) - Android adaptive icon
    • splash-icon.png (512x512) - Splash screen icon
    • favicon.png (48x48) - Web favicon
  3. Set up your Gemini API key:

    Get an API key from Google AI Studio and enter it in the app settings.

Running the App

Start the development server:

npm start

Run on specific platforms:

# Web (for development preview)
npm run web
# iOS Simulator
npm run ios
# Android Emulator
npm run android

Building for Production

Using EAS Build (recommended):

# Install EAS CLI
npm install -g eas-cli
# Configure your project
eas build:configure
# Build for iOS
npm run build:ios
# Build for Android
npm run build:android

Project Structure

├── app/ # Expo Router screens
│ ├── _layout.tsx # Root layout
│ ├── index.tsx # Welcome/auth screen
│ ├── camera.tsx # Camera capture screen
│ ├── settings.tsx # Settings screen
│ └── (studio)/ # Main studio screens
│ ├── _layout.tsx
│ └── index.tsx # Main studio interface
├── src/
│ ├── components/ # Reusable components
│ │ └── Icons.tsx # SVG icon components
│ ├── hooks/ # Custom React hooks
│ │ ├── useCamera.ts
│ │ ├── useImagePicker.ts
│ │ └── useMediaSave.ts
│ ├── services/ # API and data services
│ │ ├── geminiService.ts # Gemini AI integration
│ │ ├── paintService.ts # Paint database API
│ │ └── storageService.ts # Secure storage
│ ├── constants.ts # App constants
│ └── types.ts # TypeScript types
├── assets/ # App icons and images
├── app.json # Expo configuration
├── babel.config.js # Babel configuration
├── metro.config.js # Metro bundler configuration
├── tailwind.config.js # Tailwind/NativeWind configuration
└── global.css # Global Tailwind styles

Configuration

Environment Variables

The app uses secure storage for API keys. Users enter their Gemini API key in the app settings, which is stored securely on the device.

Customization

  • Painting Styles: Edit src/constants.ts to add or modify painting style prompts
  • Color Palettes: The app fetches colors from a Supabase database (see src/services/paintService.ts)
  • Theme Colors: Modify tailwind.config.js to customize the app theme

API Requirements

This app requires a paid Google Cloud project with the Gemini API enabled:

  1. Create a Google Cloud project
  2. Enable the Gemini API
  3. Set up billing
  4. Generate an API key
  5. Enter the key in the app settings

See Gemini API Billing Documentation for details.

Platform Notes

iOS

  • Camera permissions are configured in app.json
  • Requires iOS 13.4+

Android

  • Camera and storage permissions are configured in app.json
  • Requires Android API 23+

Web

  • Uses localStorage for secure storage (fallback)
  • Camera API uses browser's getUserMedia
  • Full functionality available in modern browsers

Troubleshooting

TypeScript errors before install: This is expected. Run npm install to install all dependencies and resolve type errors.

Camera not working on web: Ensure you're using HTTPS or localhost, as getUserMedia requires a secure context.

Build errors: Make sure you have the correct version of Node.js (18+) and have run npm install.

License

© 2025 Miniature Logic Systems. All rights reserved.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

MiniStudio - Studio Artisan

An AI-powered miniature painting visualization app for tabletop hobbyists. Built with Expo (React Native) for iOS, Android, and Web.

Features

  • Designer Mode: Generate concept art sketches, 3D miniature renders, and studio-quality product shots
  • Painter Mode: Visualize painting styles (Heavy Metal, Grimdark, NMM, etc.) on your unpainted miniatures
  • Camera Capture: Take photos directly from the app
  • Image Library: Import images from your photo library
  • 4K Upscaling: Enhance generated images to high resolution
  • Color Palettes: Select from real hobby paint brands (Citadel, Vallejo, Army Painter)
  • Background Themes: Add Fantasy, Sci-Fi, Modern, or Historical environments

Tech Stack

  • Expo SDK 52 (React Native)
  • Expo Router for file-based navigation
  • NativeWind (Tailwind CSS for React Native)
  • Google Gemini API for AI image generation
  • Supabase for paint color database

Getting Started

Prerequisites

  • Node.js 18+
  • npm or yarn
  • Expo CLI (npm install -g @expo/cli)
  • For iOS development: macOS with Xcode
  • For Android development: Android Studio with SDK

Installation

  1. Install dependencies:

    npm install
  2. Add app icons (required):

    Add the following images to the assets/ folder:

    • icon.png (1024x1024) - Main app icon
    • adaptive-icon.png (1024x1024) - Android adaptive icon
    • splash-icon.png (512x512) - Splash screen icon
    • favicon.png (48x48) - Web favicon
  3. Set up your Gemini API key:

    Get an API key from Google AI Studio and enter it in the app settings.

Running the App

Start the development server:

npm start

Run on specific platforms:

# Web (for development preview)
npm run web
# iOS Simulator
npm run ios
# Android Emulator
npm run android

Building for Production

Using EAS Build (recommended):

# Install EAS CLI
npm install -g eas-cli
# Configure your project
eas build:configure
# Build for iOS
npm run build:ios
# Build for Android
npm run build:android

Project Structure

├── app/ # Expo Router screens
│ ├── _layout.tsx # Root layout
│ ├── index.tsx # Welcome/auth screen
│ ├── camera.tsx # Camera capture screen
│ ├── settings.tsx # Settings screen
│ └── (studio)/ # Main studio screens
│ ├── _layout.tsx
│ └── index.tsx # Main studio interface
├── src/
│ ├── components/ # Reusable components
│ │ └── Icons.tsx # SVG icon components
│ ├── hooks/ # Custom React hooks
│ │ ├── useCamera.ts
│ │ ├── useImagePicker.ts
│ │ └── useMediaSave.ts
│ ├── services/ # API and data services
│ │ ├── geminiService.ts # Gemini AI integration
│ │ ├── paintService.ts # Paint database API
│ │ └── storageService.ts # Secure storage
│ ├── constants.ts # App constants
│ └── types.ts # TypeScript types
├── assets/ # App icons and images
├── app.json # Expo configuration
├── babel.config.js # Babel configuration
├── metro.config.js # Metro bundler configuration
├── tailwind.config.js # Tailwind/NativeWind configuration
└── global.css # Global Tailwind styles

Configuration

Environment Variables

The app uses secure storage for API keys. Users enter their Gemini API key in the app settings, which is stored securely on the device.

Customization

  • Painting Styles: Edit src/constants.ts to add or modify painting style prompts
  • Color Palettes: The app fetches colors from a Supabase database (see src/services/paintService.ts)
  • Theme Colors: Modify tailwind.config.js to customize the app theme

API Requirements

This app requires a paid Google Cloud project with the Gemini API enabled:

  1. Create a Google Cloud project
  2. Enable the Gemini API
  3. Set up billing
  4. Generate an API key
  5. Enter the key in the app settings

See Gemini API Billing Documentation for details.

Platform Notes

iOS

  • Camera permissions are configured in app.json
  • Requires iOS 13.4+

Android

  • Camera and storage permissions are configured in app.json
  • Requires Android API 23+

Web

  • Uses localStorage for secure storage (fallback)
  • Camera API uses browser's getUserMedia
  • Full functionality available in modern browsers

Troubleshooting

TypeScript errors before install: This is expected. Run npm install to install all dependencies and resolve type errors.

Camera not working on web: Ensure you're using HTTPS or localhost, as getUserMedia requires a secure context.

Build errors: Make sure you have the correct version of Node.js (18+) and have run npm install.

License

© 2025 Miniature Logic Systems. All rights reserved.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

MiniStudio - Studio Artisan

An AI-powered miniature painting visualization app for tabletop hobbyists. Built with Expo (React Native) for iOS, Android, and Web.

Features

  • Designer Mode: Generate concept art sketches, 3D miniature renders, and studio-quality product shots
  • Painter Mode: Visualize painting styles (Heavy Metal, Grimdark, NMM, etc.) on your unpainted miniatures
  • Camera Capture: Take photos directly from the app
  • Image Library: Import images from your photo library
  • 4K Upscaling: Enhance generated images to high resolution
  • Color Palettes: Select from real hobby paint brands (Citadel, Vallejo, Army Painter)
  • Background Themes: Add Fantasy, Sci-Fi, Modern, or Historical environments

Tech Stack

  • Expo SDK 52 (React Native)
  • Expo Router for file-based navigation
  • NativeWind (Tailwind CSS for React Native)
  • Google Gemini API for AI image generation
  • Supabase for paint color database

Getting Started

Prerequisites

  • Node.js 18+
  • npm or yarn
  • Expo CLI (npm install -g @expo/cli)
  • For iOS development: macOS with Xcode
  • For Android development: Android Studio with SDK

Installation

  1. Install dependencies:

    npm install
  2. Add app icons (required):

    Add the following images to the assets/ folder:

    • icon.png (1024x1024) - Main app icon
    • adaptive-icon.png (1024x1024) - Android adaptive icon
    • splash-icon.png (512x512) - Splash screen icon
    • favicon.png (48x48) - Web favicon
  3. Set up your Gemini API key:

    Get an API key from Google AI Studio and enter it in the app settings.

Running the App

Start the development server:

npm start

Run on specific platforms:

# Web (for development preview)
npm run web
# iOS Simulator
npm run ios
# Android Emulator
npm run android

Building for Production

Using EAS Build (recommended):

# Install EAS CLI
npm install -g eas-cli
# Configure your project
eas build:configure
# Build for iOS
npm run build:ios
# Build for Android
npm run build:android

Project Structure

├── app/ # Expo Router screens
│ ├── _layout.tsx # Root layout
│ ├── index.tsx # Welcome/auth screen
│ ├── camera.tsx # Camera capture screen
│ ├── settings.tsx # Settings screen
│ └── (studio)/ # Main studio screens
│ ├── _layout.tsx
│ └── index.tsx # Main studio interface
├── src/
│ ├── components/ # Reusable components
│ │ └── Icons.tsx # SVG icon components
│ ├── hooks/ # Custom React hooks
│ │ ├── useCamera.ts
│ │ ├── useImagePicker.ts
│ │ └── useMediaSave.ts
│ ├── services/ # API and data services
│ │ ├── geminiService.ts # Gemini AI integration
│ │ ├── paintService.ts # Paint database API
│ │ └── storageService.ts # Secure storage
│ ├── constants.ts # App constants
│ └── types.ts # TypeScript types
├── assets/ # App icons and images
├── app.json # Expo configuration
├── babel.config.js # Babel configuration
├── metro.config.js # Metro bundler configuration
├── tailwind.config.js # Tailwind/NativeWind configuration
└── global.css # Global Tailwind styles

Configuration

Environment Variables

The app uses secure storage for API keys. Users enter their Gemini API key in the app settings, which is stored securely on the device.

Customization

  • Painting Styles: Edit src/constants.ts to add or modify painting style prompts
  • Color Palettes: The app fetches colors from a Supabase database (see src/services/paintService.ts)
  • Theme Colors: Modify tailwind.config.js to customize the app theme

API Requirements

This app requires a paid Google Cloud project with the Gemini API enabled:

  1. Create a Google Cloud project
  2. Enable the Gemini API
  3. Set up billing
  4. Generate an API key
  5. Enter the key in the app settings

See Gemini API Billing Documentation for details.

Platform Notes

iOS

  • Camera permissions are configured in app.json
  • Requires iOS 13.4+

Android

  • Camera and storage permissions are configured in app.json
  • Requires Android API 23+

Web

  • Uses localStorage for secure storage (fallback)
  • Camera API uses browser's getUserMedia
  • Full functionality available in modern browsers

Troubleshooting

TypeScript errors before install: This is expected. Run npm install to install all dependencies and resolve type errors.

Camera not working on web: Ensure you're using HTTPS or localhost, as getUserMedia requires a secure context.

Build errors: Make sure you have the correct version of Node.js (18+) and have run npm install.

License

© 2025 Miniature Logic Systems. All rights reserved.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

MiniStudio - Studio Artisan

An AI-powered miniature painting visualization app for tabletop hobbyists. Built with Expo (React Native) for iOS, Android, and Web.

Features

  • Designer Mode: Generate concept art sketches, 3D miniature renders, and studio-quality product shots
  • Painter Mode: Visualize painting styles (Heavy Metal, Grimdark, NMM, etc.) on your unpainted miniatures
  • Camera Capture: Take photos directly from the app
  • Image Library: Import images from your photo library
  • 4K Upscaling: Enhance generated images to high resolution
  • Color Palettes: Select from real hobby paint brands (Citadel, Vallejo, Army Painter)
  • Background Themes: Add Fantasy, Sci-Fi, Modern, or Historical environments

Tech Stack

  • Expo SDK 52 (React Native)
  • Expo Router for file-based navigation
  • NativeWind (Tailwind CSS for React Native)
  • Google Gemini API for AI image generation
  • Supabase for paint color database

Getting Started

Prerequisites

  • Node.js 18+
  • npm or yarn
  • Expo CLI (npm install -g @expo/cli)
  • For iOS development: macOS with Xcode
  • For Android development: Android Studio with SDK

Installation

  1. Install dependencies:

    npm install
  2. Add app icons (required):

    Add the following images to the assets/ folder:

    • icon.png (1024x1024) - Main app icon
    • adaptive-icon.png (1024x1024) - Android adaptive icon
    • splash-icon.png (512x512) - Splash screen icon
    • favicon.png (48x48) - Web favicon
  3. Set up your Gemini API key:

    Get an API key from Google AI Studio and enter it in the app settings.

Running the App

Start the development server:

npm start

Run on specific platforms:

# Web (for development preview)
npm run web
# iOS Simulator
npm run ios
# Android Emulator
npm run android

Building for Production

Using EAS Build (recommended):

# Install EAS CLI
npm install -g eas-cli
# Configure your project
eas build:configure
# Build for iOS
npm run build:ios
# Build for Android
npm run build:android

Project Structure

├── app/ # Expo Router screens
│ ├── _layout.tsx # Root layout
│ ├── index.tsx # Welcome/auth screen
│ ├── camera.tsx # Camera capture screen
│ ├── settings.tsx # Settings screen
│ └── (studio)/ # Main studio screens
│ ├── _layout.tsx
│ └── index.tsx # Main studio interface
├── src/
│ ├── components/ # Reusable components
│ │ └── Icons.tsx # SVG icon components
│ ├── hooks/ # Custom React hooks
│ │ ├── useCamera.ts
│ │ ├── useImagePicker.ts
│ │ └── useMediaSave.ts
│ ├── services/ # API and data services
│ │ ├── geminiService.ts # Gemini AI integration
│ │ ├── paintService.ts # Paint database API
│ │ └── storageService.ts # Secure storage
│ ├── constants.ts # App constants
│ └── types.ts # TypeScript types
├── assets/ # App icons and images
├── app.json # Expo configuration
├── babel.config.js # Babel configuration
├── metro.config.js # Metro bundler configuration
├── tailwind.config.js # Tailwind/NativeWind configuration
└── global.css # Global Tailwind styles

Configuration

Environment Variables

The app uses secure storage for API keys. Users enter their Gemini API key in the app settings, which is stored securely on the device.

Customization

  • Painting Styles: Edit src/constants.ts to add or modify painting style prompts
  • Color Palettes: The app fetches colors from a Supabase database (see src/services/paintService.ts)
  • Theme Colors: Modify tailwind.config.js to customize the app theme

API Requirements

This app requires a paid Google Cloud project with the Gemini API enabled:

  1. Create a Google Cloud project
  2. Enable the Gemini API
  3. Set up billing
  4. Generate an API key
  5. Enter the key in the app settings

See Gemini API Billing Documentation for details.

Platform Notes

iOS

  • Camera permissions are configured in app.json
  • Requires iOS 13.4+

Android

  • Camera and storage permissions are configured in app.json
  • Requires Android API 23+

Web

  • Uses localStorage for secure storage (fallback)
  • Camera API uses browser's getUserMedia
  • Full functionality available in modern browsers

Troubleshooting

TypeScript errors before install: This is expected. Run npm install to install all dependencies and resolve type errors.

Camera not working on web: Ensure you're using HTTPS or localhost, as getUserMedia requires a secure context.

Build errors: Make sure you have the correct version of Node.js (18+) and have run npm install.

License

© 2025 Miniature Logic Systems. All rights reserved.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages