[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-72099":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":16,"subscribersCount":16,"size":16,"stars1d":17,"stars7d":18,"stars30d":19,"stars90d":16,"forks30d":16,"starsTrendScore":20,"compositeScore":21,"rankGlobal":10,"rankLanguage":10,"license":22,"archived":23,"fork":23,"defaultBranch":24,"hasWiki":25,"hasPages":23,"topics":26,"createdAt":10,"pushedAt":10,"updatedAt":39,"readmeContent":40,"aiSummary":41,"trendingCount":16,"starSnapshotCount":16,"syncStatus":42,"lastSyncTime":43,"discoverSource":44},72099,"RedInk","HisMax\u002FRedInk","HisMax","Red Ink - A one-stop Xiaohongshu image-and-text generator based on the 🍌Nano Banana Pro🍌, \"One Sentence, One Image: Generate Xiaohongshu Text and Images.\"","https:\u002F\u002Fredink.top",null,"Python",5318,1015,23,14,0,13,24,85,39,105.52,"Other",false,"main",true,[27,28,29,30,31,32,33,34,35,36,37,38],"ai","aigc","content-generator","docker","flask","gemini","nano-banana-pro","python","social-media","text-to-image","vue","xiaohongshu","2026-06-12 04:01:03","\u003Cdiv align=\"center\">\n\n**[中文](.\u002FREADME_zh.md) | English**\n\n[![GitHub Stars](https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fstars\u002FHisMax\u002FRedInk?style=flat&logo=github)](https:\u002F\u002Fgithub.com\u002FHisMax\u002FRedInk)\n[![License](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Flicense-CC%20BY--NC--SA%204.0-blue)](https:\u002F\u002Fcreativecommons.org\u002Flicenses\u002Fby-nc-sa\u002F4.0\u002F)\n[![Docker Pulls](https:\u002F\u002Fimg.shields.io\u002Fdocker\u002Fpulls\u002Fhistonemax\u002Fredink)](https:\u002F\u002Fhub.docker.com\u002Fr\u002Fhistonemax\u002Fredink)\n[![GitHub Release](https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fv\u002Frelease\u002FHisMax\u002FRedInk?include_prereleases)](https:\u002F\u002Fgithub.com\u002FHisMax\u002FRedInk\u002Freleases)\n\n\u003Cimg src=\"images\u002F2_en.png\" alt=\"RedInk - Inspiration at Your Fingertips, Making Creation Effortless\" width=\"600\"\u002F>\n\n#### [Official Site → Redink.top](https:\u002F\u002Fredink.top)\n\n\u003Cimg src=\"images\u002Fshowcase-grid-en.png\" alt=\"Various social media covers generated with RedInk\" width=\"700\" style=\"border-radius: 12px; box-shadow: 0 8px 24px rgba(0,0,0,0.12);\"\u002F>\n\n\u003Csub>*Various social media covers generated with RedInk - AI-powered, consistent style, accurate text*\u003C\u002Fsub>\n\n\u003C\u002Fdiv>\n\n---\n\n## ✨ Showcase\n\n### Type One Sentence, Get Complete Image & Text Posts\n\n\u003Cdetails open>\n\u003Csummary>\u003Cb>Step 1: Smart Outline Generation\u003C\u002Fb>\u003C\u002Fsummary>\n\n\u003Cbr>\n\n![Outline Example](.\u002Fimages\u002Fexample-2.png)\n\n**Features:**\n- ✏️ Edit content for each page\n- 🔄 Reorder pages (not recommended)\n- ✨ Custom description per page (highly recommended)\n\n\u003C\u002Fdetails>\n\n\u003Cdetails open>\n\u003Csummary>\u003Cb>🎨 Step 2: Cover Page Generation\u003C\u002Fb>\u003C\u002Fsummary>\n\n\u003Cbr>\n\n![Cover Example](.\u002Fimages\u002Fexample-3.png)\n\n**Cover Highlights:**\n- 🎯 Matches your personal style\n- 📝 Accurate text rendering\n- 🌈 Visually consistent and coordinated\n\n\u003C\u002Fdetails>\n\n\u003Cdetails open>\n\u003Csummary>\u003Cb>📚 Step 3: Batch Content Page Generation\u003C\u002Fb>\u003C\u002Fsummary>\n\n\u003Cbr>\n\n![Content Page Example](.\u002Fimages\u002Fexample-4.png)\n\n**Generation Notes:**\n- ⚡ Concurrent generation for all pages (up to 15 by default)\n- ⚠️ Disable high concurrency in settings if your API doesn't support it\n- 🔧 Regenerate individual pages you're not satisfied with\n\n\u003C\u002Fdetails>\n\n---\n\n## 🏗️ Tech Stack\n\n\u003Ctable>\n\u003Ctr>\n\u003Ctd width=\"50%\" valign=\"top\">\n\n### 🔧 Backend\n\n| Technology | Description |\n|------|------|\n| **Language** | Python 3.11+ |\n| **Framework** | Flask |\n| **Package Manager** | uv |\n| **Text AI** | Gemini 3 |\n| **Image AI** | 🍌 Nano Banana Pro |\n\n\u003C\u002Ftd>\n\u003Ctd width=\"50%\" valign=\"top\">\n\n### 🎨 Frontend\n\n| Technology | Description |\n|------|------|\n| **Framework** | Vue 3 + TypeScript |\n| **Build Tool** | Vite |\n| **State Management** | Pinia |\n| **Styling** | Modern CSS |\n\n\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftable>\n\n---\n\n## 📦 Deployment\n\n### Option 1: Docker (Recommended)\n\n**The simplest way — one command to start:**\n\n```bash\ndocker run -d -p 12398:12398 -v .\u002Fhistory:\u002Fapp\u002Fhistory -v .\u002Foutput:\u002Fapp\u002Foutput histonemax\u002Fredink:latest\n```\n\nVisit http:\u002F\u002Flocalhost:12398 and configure your API Key in the **Settings** page.\n\n**Using docker-compose (optional):**\n\nDownload [docker-compose.yml](https:\u002F\u002Fgithub.com\u002FHisMax\u002FRedInk\u002Fblob\u002Fmain\u002Fdocker-compose.yml), then:\n\n```bash\ndocker-compose up -d\n```\n\n**Docker Notes:**\n- The container does not include any API Keys — configure them in the web UI\n- Use `-v .\u002Fhistory:\u002Fapp\u002Fhistory` to persist history\n- Use `-v .\u002Foutput:\u002Fapp\u002Foutput` to persist generated images\n- Optional: mount custom config `-v .\u002Ftext_providers.yaml:\u002Fapp\u002Ftext_providers.yaml`\n\n---\n\n### Option 2: Local Development\n\n**Prerequisites:**\n- Python 3.11+\n- Node.js 18+\n- pnpm\n- uv\n\n### 1. Clone the Repository\n```bash\ngit clone https:\u002F\u002Fgithub.com\u002FHisMax\u002FRedInk.git\ncd RedInk\n```\n\n### 2. Configure API Services\n\nCopy the config templates:\n```bash\ncp text_providers.yaml.example text_providers.yaml\ncp image_providers.yaml.example image_providers.yaml\n```\n\nEdit the config files with your API Key and service settings, or configure them later via the **Settings** page in the web UI.\n\n### 3. Install Backend Dependencies\n```bash\nuv sync\n```\n\n### 4. Install Frontend Dependencies\n```bash\ncd frontend\npnpm install\n```\n\n### 5. Start the Services\n\n#### One-Click Start (Recommended)\n\nRun the start script to automatically install dependencies and launch both frontend and backend:\n\n- **macOS**: `start.sh` or double-click `scripts\u002Fstart-macos.command`\n- **Linux**: `.\u002Fstart.sh`\n- **Windows**: Double-click `start.bat`\n\nThe browser will automatically open at http:\u002F\u002Flocalhost:5173\n\n#### Manual Start\n\n**Start Backend:**\n```bash\nuv run python -m backend.app\n```\nVisit: http:\u002F\u002Flocalhost:12398\n\n**Start Frontend:**\n```bash\ncd frontend\npnpm dev\n```\nVisit: http:\u002F\u002Flocalhost:5173\n\n---\n\n## 🔧 Configuration\n\n### Configuration Methods\n\nThe project supports two configuration methods:\n\n1. **Web UI (Recommended)**: Visual configuration via the Settings page after starting the service\n2. **YAML Files**: Edit config files directly\n\n### Text Generation Config\n\nConfig file: `text_providers.yaml`\n\n```yaml\n# Active provider\nactive_provider: openai\n\nproviders:\n  # OpenAI or compatible API\n  openai:\n    type: openai_compatible\n    api_key: sk-xxxxxxxxxxxxxxxxxxxx\n    base_url: https:\u002F\u002Fapi.openai.com\u002Fv1\n    model: gpt-4o\n\n  # Google Gemini (native API)\n  gemini:\n    type: google_gemini\n    api_key: AIzaxxxxxxxxxxxxxxxxxxxxxxxxx\n    model: gemini-2.0-flash\n```\n\n### Image Generation Config\n\nConfig file: `image_providers.yaml`\n\n```yaml\n# Active provider\nactive_provider: gemini\n\nproviders:\n  # Google Gemini image generation\n  gemini:\n    type: google_genai\n    api_key: AIzaxxxxxxxxxxxxxxxxxxxxxxxxx\n    model: gemini-3-pro-image-preview\n    high_concurrency: false\n\n  # OpenAI compatible API\n  openai_image:\n    type: image_api\n    api_key: sk-xxxxxxxxxxxxxxxxxxxx\n    base_url: https:\u002F\u002Fyour-api-endpoint.com\n    model: dall-e-3\n    high_concurrency: false\n```\n\n### High Concurrency Mode\n\n- **Off (default)**: Images generated one by one — suitable for GCP $300 trial accounts or rate-limited APIs\n- **On**: Images generated in parallel (up to 15 simultaneously) — faster but requires API support for high concurrency\n\n⚠️ **Not recommended for GCP $300 trial accounts** — may trigger rate limits and cause generation failures.\n\n---\n\n## ⚠️ Notes\n\n1. **API Quota Limits**:\n   - Be aware of Gemini and image generation API call quotas\n   - GCP trial accounts should keep high concurrency disabled\n\n2. **Generation Time**:\n   - Image generation takes time — please be patient (don't leave the page)\n\n---\n\n## 🤝 Contributing\n\nIssues and Pull Requests are welcome!\n\nIf this project helps you, please give it a Star ⭐\n\n---\n\n## Changelog\n\n### v1.4.2 (2026-03-15)\n- ✨ Added English README as default with language toggle (中文\u002FEnglish)\n- ✨ Added AI-generated English banner and showcase grid images\n- ✨ Added Claude Opus 4.5 to acknowledgments\n- ✨ Added shields.io badges (Stars, License, Docker Pulls, Release)\n- ✨ Added GitHub Issue\u002FPR templates for standardized contributions\n- ✨ Added CONTRIBUTING.md and SECURITY.md\n- 🐛 Fixed `rstrip('\u002Fv1')` incorrectly stripping URL characters (e.g. `api.openai.com` → `api.openai.co`) — 5 occurrences across backend\n- 🐛 Fixed image API test connection failing for chat-based endpoints (Doubao\u002FVolcengine) by using configured endpoint_type instead of hardcoded `\u002Fv1\u002Fmodels`\n- 🐛 Fixed bare `except:` clause replaced with `except Exception:` in history service\n- 🐛 Fixed SSE stream reader not released on error in frontend API layer (resource leak)\n- 🐛 Fixed 5 uncleared `setTimeout` calls in ContentDisplay component (memory leak)\n- 🐛 Fixed duplicate image regeneration requests by tracking in-progress indices\n- 🐛 Fixed GenerateView redirect timer not cleared on component unmount\n\n### v1.4.1 (2025-12-29)\n- ✨ Added one-click start scripts for macOS\u002FLinux\u002FWindows\n- ✨ Added copywriting generation: auto-generate titles, body text, and tags\n- 🔧 Fixed history saving: immediate save after outline generation, auto-save on edit (300ms debounce)\n- 🔧 Optimized navigation: force-save unsaved changes before clicking \"Start Generation\"\n- 🔧 Unified startup script port display to 12398\n- 🔧 Cleaned up unused retry decorator code in backend generators\n- 🔧 Fixed frontend CSS variable reference issues\n- 🔧 Optimized checkHistoryExists API performance with dedicated endpoint\n- 🔧 Standardized recordId assignment using setRecordId() method\n\n### v1.4.0 (2025-11-30)\n- 🏗️ Backend refactored: split monolithic routes into modular blueprints (history, images, generation, outline, config)\n- 🏗️ Frontend refactored: extracted reusable components (ImageGalleryModal, OutlineModal, ShowcaseBackground, etc.)\n- ✨ Optimized homepage design, removed redundant content blocks\n- ✨ Background image preloading with fade-in animation for better loading experience\n- ✨ History persistence support (Docker deployment)\n- 🔧 Fixed history preview and outline viewing\n- 🔧 Optimized Modal component visibility control\n- 🧪 Added 65 backend unit tests\n\n### v1.3.0 (2025-11-26)\n- ✨ Added Docker support for one-click deployment\n- ✨ Published official Docker image to Docker Hub: `histonemax\u002Fredink`\n- 🔧 Flask auto-detects frontend build artifacts for single-container deployment\n- 🔧 Docker image includes blank config templates to protect API Key security\n- 📝 Updated README with Docker deployment instructions\n\n### v1.2.0 (2025-11-26)\n- ✨ Added copyright info display on all pages\n- ✨ Improved image regeneration with single image redraw support\n- ✨ Regenerated images maintain style consistency with full context (cover, outline, user input)\n- ✨ Fixed image cache issues — regenerated images refresh immediately\n- ✨ Unified text generation client supporting Google Gemini and OpenAI-compatible APIs with auto-switching\n- ✨ Added web UI configuration for visual API provider management\n- ✨ Added high concurrency mode toggle for different API quotas\n- ✨ API Key masking for security\n- ✨ Auto-save configuration with instant effect\n- 🔧 Adjusted default max_output_tokens to 8000 for broader model compatibility\n- 🔧 Optimized frontend routing and page layout for better UX\n- 🔧 Simplified config file structure, removed redundant parameters\n- 🔧 Optimized history image display with thumbnails to save bandwidth\n- 🔧 History regeneration auto-loads cover image from filesystem as reference\n- 🐛 Fixed missing `store.updateImage` method causing regeneration failure\n- 🐛 Fixed image URL concatenation error during history loading\n- 🐛 Fixed raw image parameter handling in download function\n- 🐛 Fixed image loading 500 error\n\n---\n\n## Community & Support\n\n- **GitHub Issues**: [https:\u002F\u002Fgithub.com\u002FHisMax\u002FRedInk\u002Fissues](https:\u002F\u002Fgithub.com\u002FHisMax\u002FRedInk\u002Fissues)\n\n### Contact the Author\n\n- **Email**: histonemax@gmail.com\n- **WeChat**: Histone2024 (please state your purpose)\n- **GitHub**: [@HisMax](https:\u002F\u002Fgithub.com\u002FHisMax)\n\n### Support the Project\n\n\u003Cimg src=\"images\u002Fcoffee.jpg\" alt=\"Buy me a coffee\" width=\"300\"\u002F>\n\n## Star History\n\n[![Star History Chart](https:\u002F\u002Fapi.star-history.com\u002Fsvg?repos=HisMax\u002FRedInk&type=Date)](https:\u002F\u002Fstar-history.com\u002F#HisMax\u002FRedInk&Date)\n\n---\n\n## 📄 License\n\n### Personal Use - CC BY-NC-SA 4.0\n\nThis project is licensed under [CC BY-NC-SA 4.0](https:\u002F\u002Fcreativecommons.org\u002Flicenses\u002Fby-nc-sa\u002F4.0\u002F)\n\n**You are free to:**\n- ✅ **Personal Use** — for learning, research, and personal projects\n- ✅ **Share** — copy and redistribute the material in any medium or format\n- ✅ **Adapt** — remix, transform, and build upon the material\n\n**Under the following terms:**\n- 📝 **Attribution** — You must give appropriate credit, provide a link to the license, and indicate if changes were made\n- 🚫 **NonCommercial** — You may not use the material for commercial purposes\n- 🔄 **ShareAlike** — If you remix, transform, or build upon the material, you must distribute your contributions under the same license\n\n### Commercial License\n\nIf you wish to use this project for **commercial purposes** (including but not limited to):\n- Providing paid services\n- Integrating into commercial products\n- Operating as a SaaS service\n- Other for-profit uses\n\n**Please contact the author for a commercial license:**\n- 📧 Email: histonemax@gmail.com\n- 💬 WeChat: Histone2024 (please note \"Commercial License Inquiry\")\n\nThe author will provide flexible commercial licensing options based on your specific use case.\n\n---\n\n### Disclaimer\n\nThis software is provided \"as is\", without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose, and noninfringement. In no event shall the authors or copyright holders be liable for any claim, damages, or other liability.\n\n---\n\n## 🙏 Acknowledgments\n\n- [Google Gemini](https:\u002F\u002Fai.google.dev\u002F) — Powerful text generation capabilities\n- [Claude Opus 4.5](https:\u002F\u002Fwww.anthropic.com\u002F) — Intelligent code assistance and development support\n- Image generation service providers — Stunning image generation\n- [Linux.do](https:\u002F\u002Flinux.do\u002F) — Excellent developer community\n\n---\n\n## 👨‍💻 Author\n\n**Mozi (Histone)** - AI Entrepreneur\n\n- 🏠 Location: Hangzhou, China\n- 🚀 Status: Startup in progress\n- 📧 Email: histonemax@gmail.com\n- 💬 WeChat: Histone2024 (personal WeChat — no tech support)\n- 🐙 GitHub: [@HisMax](https:\u002F\u002Fgithub.com\u002FHisMax)\n\n*\"Let AI do the creative work for us\"*\n\n---\n\n**If this project helped you, share it with others!** ⭐\n\nQuestions or suggestions? Feel free to open an Issue!\n","RedInk 是一个基于 Nano Banana Pro 的一站式小红书图文生成器，能够实现“一句话生成一篇图文”的功能。该项目利用 Gemini 3 和 Nano Banana Pro 分别处理文本和图像的智能生成，通过 Flask 框架构建后端服务，并采用 Vue 3 + TypeScript 构建前端界面，支持 Docker 快速部署。用户只需输入一句描述，即可自动生成包含封面图、内容页等元素的小红书风格帖子，适用于需要快速创作高质量社交平台内容的个人或团队。",2,"2026-06-11 03:40:21","high_star"]