Notification System
Run ID: 69cb73f461b1021a29a892712026-03-31Development
PantheraHive BOS
BOS Dashboard

This document outlines the comprehensive, detailed, and professional output for the "Notification System" generation step. This deliverable provides a robust, production-ready codebase designed for scalability, flexibility, and maintainability.


Notification System: Code Generation Deliverable

1. Introduction

This deliverable provides a foundational codebase for a versatile Notification System. This system is designed to handle various notification channels (e.g., Email, SMS, In-App, Push), manage user preferences, and process notifications asynchronously to ensure a responsive user experience. The architecture emphasizes modularity, making it easy to extend with new notification types or integrate with different external sending services.

2. System Overview

The Notification System is built using Python with Flask for the API, SQLAlchemy for database interactions, and Celery for asynchronous task processing. Redis is used as the message broker for Celery and as a potential cache. PostgreSQL serves as the primary database.

Key Architectural Principles:

High-Level Architecture Diagram:

text • 1,410 chars
+-------------------+     +---------------------+
|   Client/Service  | --> |     Flask API       |
| (Triggers Notif)  |     | (Notification Microservice) |
+-------------------+     +---------------------+
                                   |
                                   | (Triggers Celery Task)
                                   V
+-------------------+     +---------------------+     +---------------------+
|   Redis (Broker)  |<--->|    Celery Worker    | --> | Notification Manager|
|  (Message Queue)  |     | (Async Processing)  |     |  (Core Logic)       |
+-------------------+     +---------------------+     +---------------------+
        ^                                                      |
        |                                                      | (Reads/Writes)
        V                                                      V
+-------------------+     +---------------------+     +---------------------+
| PostgreSQL DB     |<--->| SQLAlchemy ORM      |<--->| External Senders    |
| (Notifications,   |     | (Models: Notif,     |     | (Email, SMS, Push   |
|  Templates, Prefs)|     |  Template, Prefs)   |     |   APIs - e.g.,      |
+-------------------+     +---------------------+     |   SendGrid, Twilio, |
                                                      |   FCM)              |
                                                      +---------------------+
Sandboxed live preview

Notification System Architecture Study Plan

Project Goal: To equip you with the comprehensive knowledge and practical skills required to design, architect, and troubleshoot a robust, scalable, and reliable notification system. This study plan focuses on the architectural considerations, design patterns, and technology choices essential for building a modern notification platform.

Target Audience: Software Engineers, Architects, Technical Leads, and anyone interested in mastering the intricacies of distributed notification systems.

Duration: 8 Weeks


1. Introduction & Overall Learning Goal

In today's interconnected world, effective communication with users is paramount. A well-designed notification system is the backbone of user engagement, delivering timely and relevant information across various channels. This study plan is meticulously crafted to guide you through the architectural landscape of notification systems, from fundamental concepts to advanced considerations like scalability, reliability, and security.

Upon successful completion of this plan, you will be able to:

  • Understand the core components and interaction patterns of a modern, distributed notification system.
  • Evaluate and select appropriate messaging queues and delivery mechanisms based on specific system requirements.
  • Design and implement architectural solutions addressing scalability, reliability, fault tolerance, and security for notification delivery.
  • Integrate with various external delivery providers (e.g., email, SMS, push notifications) and manage their complexities.
  • Develop strategies for user preference management, notification history, and advanced features like batching and internationalization.
  • Lead the architectural design and implementation of a production-grade notification service.

2. Prerequisites

To get the most out of this study plan, a foundational understanding in the following areas is recommended:

  • Programming Skills: Intermediate proficiency in at least one modern programming language (e.g., Python, Java, Go, C#).
  • Web Services: Familiarity with RESTful APIs, HTTP protocols, and basic client-server communication.
  • Database Concepts: Understanding of relational (SQL) and non-relational (NoSQL) databases and their use cases.
  • Cloud Computing: Basic conceptual knowledge of cloud platforms (AWS, GCP, Azure) and their core services.
  • Software Design Principles: Awareness of common design patterns and SOLID principles.

3. Weekly Schedule

This 8-week schedule provides a structured path through the architectural components of a notification system. Each week includes key topics and suggested activities.

Week 1: Fundamentals of Notification Systems & Core Concepts

  • Topics:

* What is a Notification System? Role and importance.

* Types of Notifications: Email, SMS, Push (Mobile/Web), In-App, Webhooks.

* Delivery Models: Push vs. Pull, Real-time vs. Batch.

* Basic Architectural Components: Producer, Notification Service, Delivery Agent, Consumer.

* Introduction to Asynchronous Communication and the need for Message Queues.

* Key Architectural Goals: Scalability, Reliability, Latency, Extensibility.

  • Suggested Activities:

* Read introductory articles on different notification types and their use cases.

* Research real-world examples of notification system architectures (e.g., from major tech companies).

* Sketch a high-level block diagram of a basic notification system.

Week 2: Messaging & Queuing Architectures

  • Topics:

* Deep Dive into Message Brokers/Queues: Apache Kafka, RabbitMQ, AWS SQS/SNS, Google Pub/Sub.

* Messaging Patterns: Publish/Subscribe, Point-to-Point, Request/Reply.

* Key Concepts: Topics, Queues, Producers, Consumers, Brokers, Partitions, Consumer Groups, Dead Letter Queues (DLQs).

* Message Persistence, Ordering Guarantees, At-Least-Once Delivery, Idempotency.

* Trade-offs between different message queue technologies.

  • Suggested Activities:

* Set up a local instance of Kafka or RabbitMQ.

* Implement a simple producer and consumer application using your chosen message broker.

* Explore the AWS SQS/SNS or Google Pub/Sub console and documentation.

Week 3: Notification Processing & Routing Logic

  • Topics:

* Designing the Notification Processing Service: Microservices approach vs. Monolithic.

* Business Logic: User preferences lookup, channel prioritization, notification filtering.

* Content Templating Engines: Handlebars, Jinja2, etc., for dynamic content generation.

* Routing Logic: Determining the correct delivery channel(s) based on rules.

* Rate Limiting and Throttling: Preventing abuse and managing external provider limits.

* Design Patterns: Fan-out, Retry mechanisms, Circuit Breakers.

  • Suggested Activities:

* Design a data model for storing notification templates.

* Implement a basic templating service that can generate personalized messages.

* Outline the flow of a notification message through a processing service, including decision points for routing.

Week 4: Delivery Channels & External Integrations

  • Topics:

* Integrating with Email Service Providers: SendGrid, Mailgun, AWS SES.

* Integrating with SMS Gateways: Twilio, Nexmo.

* Mobile Push Notifications: Firebase Cloud Messaging (FCM), Apple Push Notification Service (APNS).

* In-App

python

notification_system/models.py

from datetime import datetime

from flask_sqlalchemy import SQLAlchemy

from sqlalchemy.dialects.postgresql import JSONB

from sqlalchemy.schema import UniqueConstraint

db = SQLAlchemy()

class Notification(db.Model):

"""

Represents a single notification event, storing its details and status.

"""

__tablename__ = 'notifications'

id = db.Column(db.Integer, primary_key=True)

user_id = db.Column(db.Integer, nullable=False, index=True) # ID of the recipient user

# Could be 'email', 'sms', 'push', 'in-app'

channel = db.Column(db.String(50), nullable=False)

# Subject for email, title for push, etc.

subject = db.Column(db.String(255), nullable=True)

body = db.Column(db.Text, nullable=False) # Rendered content of the notification

# 'pending', 'sent', 'failed', 'read', 'delivered'

status = db.Column(db.String(50), default='pending', nullable=False)

# Optional: store metadata or error details

metadata_ = db.Column(JSONB, default={}, nullable=False, name='metadata')

created_at = db.Column(db.DateTime, default=datetime.utcnow, nullable=False)

sent_at = db.Column(db.DateTime, nullable=True)

read_at = db.Column(db.DateTime, nullable=True)

def __repr__(self):

return f"<Notification {self.id} (User: {self.user_id}, Channel: {self.channel}, Status: {self.status})>"

def to_dict(self):

return {

'id': self.id,

'user_id': self.user_id,

'channel': self.channel,

'subject': self.subject,

'body': self.body,

'status': self.status,

'metadata': self.metadata_,

'created_at': self.created_at.isoformat() if self.created_at else None,

'sent_at': self.sent_at.isoformat() if self.sent_at else None,

'read_at': self.read_at.isoformat() if self.read_at else None,

}

class NotificationTemplate(db.Model):

"""

Stores reusable templates for different types of notifications.

The 'body' field supports Jinja2 templating.

"""

__tablename__ = 'notification_templates'

id = db.Column(db.Integer, primary_key=True)

name = db.Column(db.String(100), unique=True, nullable=False) # e.g., 'welcome_email', 'password_reset_sms'

# Could be 'email', 'sms', 'push', 'in-app'

channel = db.Column(db.String(50), nullable=False)

subject_template = db.Column(db.String(255), nullable=True) # Jinja2 template for subject

body_template = db.Column(db.Text, nullable=False) # Jinja2 template for body

# Default channels if not overridden by user preferences

# Stored as a JSONB array, e.g., ['email', 'in-app']

default_channels = db.Column(JSONB, default=[], nullable=False)

created_at = db.Column(db.DateTime, default=datetime.utcnow, nullable=False)

updated_at = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow, nullable=False)

__table_args__ = (UniqueConstraint('name', 'channel', name='_name_channel_uc'),)

def __repr__(self):

return f"<NotificationTemplate {self.name} (Channel: {self.channel

gemini Output

Notification System: Comprehensive Deliverable & Documentation Review

This document provides a comprehensive overview and detailed documentation for the proposed Notification System. This deliverable outlines the system's architecture, key features, operational considerations, and future roadmap, serving as a foundational reference for all stakeholders.


1. Executive Summary

The Notification System is designed to provide a robust, flexible, and scalable solution for delivering timely and relevant information to users across various platforms and channels. Its primary goal is to enhance user engagement, improve critical communication delivery, and provide administrators with powerful tools for managing and monitoring notification flows. This system is engineered for high availability, security, and ease of integration with existing and future applications.


2. System Architecture Overview

The Notification System is built on a modular, microservices-oriented architecture to ensure scalability, resilience, and maintainability.

2.1 Core Components:

  • Notification API Gateway: The central entry point for all notification requests from internal services and external applications. Handles authentication, authorization, and request routing.
  • Notification Service: The core logic engine responsible for processing notification requests, applying business rules, and interacting with other services.
  • User Preference Service: Manages user-specific notification settings, channel preferences, and opt-in/opt-out statuses.
  • Template Management Service: Stores and manages notification templates (e.g., email, SMS, push) allowing for dynamic content generation and localization.
  • Channel Dispatcher Service: Responsible for routing notifications to the appropriate channel-specific adapter (e.g., Email Sender, SMS Gateway, Push Notification Provider).
  • Channel Adapters: Interfaces with third-party providers (e.g., SendGrid, Twilio, Firebase Cloud Messaging) for actual message delivery.
  • Notification Queue (e.g., Kafka/RabbitMQ): Asynchronously processes notification requests, ensuring high throughput and decoupling of services.
  • Database (e.g., PostgreSQL/MongoDB): Stores notification logs, user preferences, templates, and system configuration.
  • Monitoring & Logging Service: Collects metrics and logs across all components for operational visibility, alerting, and debugging.

2.2 Data Flow:

  1. An application or service sends a notification request to the Notification API Gateway.
  2. The Gateway authenticates the request and forwards it to the Notification Service.
  3. The Notification Service retrieves user preferences from the User Preference Service and template content from the Template Management Service.
  4. Based on preferences and rules, the Notification Service constructs the final message and places it onto the Notification Queue.
  5. The Channel Dispatcher Service consumes messages from the queue.
  6. The Channel Dispatcher selects the appropriate Channel Adapter based on the notification type and user preferences.
  7. The Channel Adapter sends the notification to the external provider (e.g., email service, SMS gateway).
  8. Delivery status and system events are logged by the Monitoring & Logging Service.

3. Key Features and Functionality

The Notification System offers a rich set of features designed for flexibility and control:

  • Multi-Channel Delivery: Support for various notification channels including Email, SMS, Push Notifications (Mobile/Web), and In-App messages.
  • Template-Based Messaging:

* Centralized management of reusable notification templates.

* Support for dynamic content placeholders for personalization.

* Version control for templates.

  • User Preference Management:

* Users can configure their preferred notification channels for different types of alerts.

* Granular control over specific notification categories (e.g., marketing, transactional, security alerts).

* Easy opt-in/opt-out mechanisms.

  • Notification Prioritization: Ability to assign priority levels (e.g., critical, high, medium, low) to notifications, influencing delivery speed and fallback mechanisms.
  • Delivery Guarantees & Retries: Configurable retry policies for failed deliveries, ensuring higher success rates.
  • Auditing and Logging: Comprehensive logs for all notification attempts, statuses (sent, failed, delivered, opened), and user interactions.
  • Rate Limiting: Protects external providers and ensures fair usage by limiting the number of notifications sent within a specific timeframe.
  • Fallback Mechanisms: Define alternative channels if a primary channel fails or is unavailable for a user (e.g., if push fails, send SMS).
  • Scheduled Notifications: Ability to schedule notifications for future delivery.
  • Localization Support: Templates and messages can be localized to support multiple languages.
  • API-Driven: All functionalities exposed via a secure, well-documented RESTful API for seamless integration.

4. Notification Channels Supported

The system is designed to support a wide array of communication channels:

  • Email:

* Integration with leading SMTP providers (e.g., SendGrid, Mailgun, AWS SES).

* HTML and plain-text email support.

* Tracking of delivery, opens, and clicks (where supported by provider).

  • SMS:

* Integration with SMS gateways (e.g., Twilio, Nexmo).

* Support for long SMS and international messaging.

* Delivery receipt tracking.

  • Push Notifications (Mobile & Web):

* Mobile: Integration with Firebase Cloud Messaging (FCM) for Android and Apple Push Notification Service (APNS) for iOS.

* Web: Integration with Web Push API for browser-based notifications.

* Rich notification content support (images, actions).

  • In-App Notifications:

* Directly delivered within the application UI (e.g., notification center, banners).

* Requires front-end integration with the Notification API.


5. User Management & Preferences

User preferences are central to the system's effectiveness:

  • User Profile Integration: The system integrates with existing user management systems to fetch user IDs and contact information (email, phone number, device tokens).
  • Preference Portal: A user-facing interface (to be integrated into existing user settings) where users can:

* View all notification categories.

* Toggle specific categories on/off.

* Select preferred channels for each category.

* Manage contact details used for notifications.

  • API for Preference Updates: Allows administrators or integrated applications to programmatically update user preferences based on business logic (e.g., mandatory security alerts).

6. Scalability, Reliability & Performance Considerations

The system is designed with enterprise-grade considerations:

  • Horizontal Scalability: Microservices architecture allows independent scaling of components based on load.
  • Asynchronous Processing: Message queues ensure high throughput and resilience against temporary failures of downstream services.
  • High Availability: Redundant deployments of all services and database replication to minimize downtime.
  • Disaster Recovery: Backup and recovery strategies for critical data.
  • Performance Monitoring: Continuous monitoring of latency, error rates, and resource utilization across all components.
  • Load Testing: Regular load testing to identify bottlenecks and ensure performance under peak conditions.

7. Security Considerations

Security is paramount for a communication system:

  • Authentication & Authorization:

* API requests secured using industry-standard protocols (e.g., OAuth2, API Keys).

* Role-based access control (RBAC) for administrative functions.

  • Data Encryption:

* Data at rest encrypted (e.g., database encryption).

* Data in transit encrypted using TLS/SSL for all API communications.

  • Input Validation: Strict validation of all incoming data to prevent injection attacks.
  • Secret Management: Secure storage and retrieval of API keys and credentials for third-party providers.
  • Compliance: Designed with considerations for relevant data privacy regulations (e.g., GDPR, CCPA) regarding user preferences and data handling.
  • Auditing: Comprehensive audit trails of all system access and changes.

8. Integration Points

The Notification System is designed for seamless integration:

  • RESTful API: Primary integration method for internal and external services to trigger notifications.
  • Webhooks: Ability to send real-time status updates (e.g., delivery receipts) back to calling applications.
  • User Management System: Integration for fetching user profiles and contact information.
  • Reporting & Analytics Tools: Integration with BI tools for advanced insights into notification performance and user engagement.
  • Monitoring & Alerting Systems: Integration with tools like Prometheus, Grafana, ELK Stack for operational visibility.

9. Future Enhancements (Roadmap)

While the initial system provides a robust foundation, the following features are planned for future iterations:

  • A/B Testing for Notifications: Ability to test different message variations or channels to optimize engagement.
  • Advanced Analytics & Reporting Dashboard: Dedicated dashboard for detailed insights into notification performance, user engagement, and delivery rates.
  • Machine Learning for Optimization:

* Intelligent channel selection based on user behavior and historical data.

* Optimal send time prediction.

  • Segment-Based Targeting: Ability to send notifications to specific user segments defined by demographic or behavioral data.
  • Workflow Engine: A visual tool for defining complex notification sequences and conditional logic.
  • Integrations with Chat Platforms: Support for platforms like Slack, Microsoft Teams, etc.
  • Voice Notifications: Text-to-speech capabilities for critical alerts.

10. Documentation Plan

Comprehensive documentation will be provided and maintained throughout the system's lifecycle:

  • API Documentation: Detailed OpenAPI/Swagger specifications for all exposed endpoints, including request/response examples and error codes.
  • Technical Design Document (TDD): In-depth technical specifications of each service, database schema, and architectural decisions.
  • Deployment Guides: Instructions for deploying, configuring, and scaling the system in various environments.
  • Operational Runbooks: Procedures for monitoring, troubleshooting, and incident response.
  • User Guides: Instructions for managing templates, viewing logs, and configuring preferences (for administrators).
  • Integration Guides: Step-by-step instructions and code examples for integrating with the Notification API.
  • Change Log: A record of all system updates, new features, and bug fixes.

11. Next Steps

To move forward with the implementation and deployment of the Notification System, we propose the following immediate next steps:

  1. Review and Feedback Session: Schedule a dedicated session to walk through this document, address any questions, and gather your feedback on the proposed architecture and features.
  2. Prioritization Workshop: Based on your business needs, we will conduct a workshop to prioritize features for the initial release (Minimum Viable Product - MVP) and subsequent phases.
  3. Detailed Design & Planning: Begin detailed technical design for the prioritized MVP features, including defining specific third-party integrations (e.g., chosen SMS gateway, email provider).
  4. Resource Allocation: Confirm the necessary team members and resources for the development and deployment phases.
  5. Environment Setup: Initiate the setup of development, staging, and production environments.

We are confident that this Notification System will significantly enhance your communication capabilities and user engagement. We look forward to your valuable input as we proceed to the next phase.

notification_system.txt
Download source file
Copy all content
Full output as text
Download ZIP
IDE-ready project ZIP
Copy share link
Permanent URL for this run
Get Embed Code
Embed this result on any website
Print / Save PDF
Use browser print dialog
\n\n\n"); var hasSrcMain=Object.keys(extracted).some(function(k){return k.indexOf("src/main")>=0;}); if(!hasSrcMain) zip.file(folder+"src/main."+ext,"import React from 'react'\nimport ReactDOM from 'react-dom/client'\nimport App from './App'\nimport './index.css'\n\nReactDOM.createRoot(document.getElementById('root')!).render(\n \n \n \n)\n"); var hasSrcApp=Object.keys(extracted).some(function(k){return k==="src/App."+ext||k==="App."+ext;}); if(!hasSrcApp) zip.file(folder+"src/App."+ext,"import React from 'react'\nimport './App.css'\n\nfunction App(){\n return(\n
\n
\n

"+slugTitle(pn)+"

\n

Built with PantheraHive BOS

\n
\n
\n )\n}\nexport default App\n"); zip.file(folder+"src/index.css","*{margin:0;padding:0;box-sizing:border-box}\nbody{font-family:system-ui,-apple-system,sans-serif;background:#f0f2f5;color:#1a1a2e}\n.app{min-height:100vh;display:flex;flex-direction:column}\n.app-header{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:12px;padding:40px}\nh1{font-size:2.5rem;font-weight:700}\n"); zip.file(folder+"src/App.css",""); zip.file(folder+"src/components/.gitkeep",""); zip.file(folder+"src/pages/.gitkeep",""); zip.file(folder+"src/hooks/.gitkeep",""); Object.keys(extracted).forEach(function(p){ var fp=p.startsWith("src/")?p:"src/"+p; zip.file(folder+fp,extracted[p]); }); zip.file(folder+"README.md","# "+slugTitle(pn)+"\n\nGenerated by PantheraHive BOS.\n\n## Setup\n\`\`\`bash\nnpm install\nnpm run dev\n\`\`\`\n\n## Build\n\`\`\`bash\nnpm run build\n\`\`\`\n\n## Open in IDE\nOpen the project folder in VS Code or WebStorm.\n"); zip.file(folder+".gitignore","node_modules/\ndist/\n.env\n.DS_Store\n*.local\n"); } /* --- Vue (Vite + Composition API + TypeScript) --- */ function buildVue(zip,folder,app,code,panelTxt){ var pn=pkgName(app); var C=cc(pn); var extracted=extractCode(panelTxt); zip.file(folder+"package.json",'{\n "name": "'+pn+'",\n "version": "0.0.0",\n "type": "module",\n "scripts": {\n "dev": "vite",\n "build": "vue-tsc -b && vite build",\n "preview": "vite preview"\n },\n "dependencies": {\n "vue": "^3.5.13",\n "vue-router": "^4.4.5",\n "pinia": "^2.3.0",\n "axios": "^1.7.9"\n },\n "devDependencies": {\n "@vitejs/plugin-vue": "^5.2.1",\n "typescript": "~5.7.3",\n "vite": "^6.0.5",\n "vue-tsc": "^2.2.0"\n }\n}\n'); zip.file(folder+"vite.config.ts","import { defineConfig } from 'vite'\nimport vue from '@vitejs/plugin-vue'\nimport { resolve } from 'path'\n\nexport default defineConfig({\n plugins: [vue()],\n resolve: { alias: { '@': resolve(__dirname,'src') } }\n})\n"); zip.file(folder+"tsconfig.json",'{"files":[],"references":[{"path":"./tsconfig.app.json"},{"path":"./tsconfig.node.json"}]}\n'); zip.file(folder+"tsconfig.app.json",'{\n "compilerOptions":{\n "target":"ES2020","useDefineForClassFields":true,"module":"ESNext","lib":["ES2020","DOM","DOM.Iterable"],\n "skipLibCheck":true,"moduleResolution":"bundler","allowImportingTsExtensions":true,\n "isolatedModules":true,"moduleDetection":"force","noEmit":true,"jsxImportSource":"vue",\n "strict":true,"paths":{"@/*":["./src/*"]}\n },\n "include":["src/**/*.ts","src/**/*.d.ts","src/**/*.tsx","src/**/*.vue"]\n}\n'); zip.file(folder+"env.d.ts","/// \n"); zip.file(folder+"index.html","\n\n\n \n \n "+slugTitle(pn)+"\n\n\n
\n \n\n\n"); var hasMain=Object.keys(extracted).some(function(k){return k==="src/main.ts"||k==="main.ts";}); if(!hasMain) zip.file(folder+"src/main.ts","import { createApp } from 'vue'\nimport { createPinia } from 'pinia'\nimport App from './App.vue'\nimport './assets/main.css'\n\nconst app = createApp(App)\napp.use(createPinia())\napp.mount('#app')\n"); var hasApp=Object.keys(extracted).some(function(k){return k.indexOf("App.vue")>=0;}); if(!hasApp) zip.file(folder+"src/App.vue","\n\n\n\n\n"); zip.file(folder+"src/assets/main.css","*{margin:0;padding:0;box-sizing:border-box}body{font-family:system-ui,sans-serif;background:#fff;color:#213547}\n"); zip.file(folder+"src/components/.gitkeep",""); zip.file(folder+"src/views/.gitkeep",""); zip.file(folder+"src/stores/.gitkeep",""); Object.keys(extracted).forEach(function(p){ var fp=p.startsWith("src/")?p:"src/"+p; zip.file(folder+fp,extracted[p]); }); zip.file(folder+"README.md","# "+slugTitle(pn)+"\n\nGenerated by PantheraHive BOS.\n\n## Setup\n\`\`\`bash\nnpm install\nnpm run dev\n\`\`\`\n\n## Build\n\`\`\`bash\nnpm run build\n\`\`\`\n\nOpen in VS Code or WebStorm.\n"); zip.file(folder+".gitignore","node_modules/\ndist/\n.env\n.DS_Store\n*.local\n"); } /* --- Angular (v19 standalone) --- */ function buildAngular(zip,folder,app,code,panelTxt){ var pn=pkgName(app); var C=cc(pn); var sel=pn.replace(/_/g,"-"); var extracted=extractCode(panelTxt); zip.file(folder+"package.json",'{\n "name": "'+pn+'",\n "version": "0.0.0",\n "scripts": {\n "ng": "ng",\n "start": "ng serve",\n "build": "ng build",\n "test": "ng test"\n },\n "dependencies": {\n "@angular/animations": "^19.0.0",\n "@angular/common": "^19.0.0",\n "@angular/compiler": "^19.0.0",\n "@angular/core": "^19.0.0",\n "@angular/forms": "^19.0.0",\n "@angular/platform-browser": "^19.0.0",\n "@angular/platform-browser-dynamic": "^19.0.0",\n "@angular/router": "^19.0.0",\n "rxjs": "~7.8.0",\n "tslib": "^2.3.0",\n "zone.js": "~0.15.0"\n },\n "devDependencies": {\n "@angular-devkit/build-angular": "^19.0.0",\n "@angular/cli": "^19.0.0",\n "@angular/compiler-cli": "^19.0.0",\n "typescript": "~5.6.0"\n }\n}\n'); zip.file(folder+"angular.json",'{\n "$schema": "./node_modules/@angular/cli/lib/config/schema.json",\n "version": 1,\n "newProjectRoot": "projects",\n "projects": {\n "'+pn+'": {\n "projectType": "application",\n "root": "",\n "sourceRoot": "src",\n "prefix": "app",\n "architect": {\n "build": {\n "builder": "@angular-devkit/build-angular:application",\n "options": {\n "outputPath": "dist/'+pn+'",\n "index": "src/index.html",\n "browser": "src/main.ts",\n "tsConfig": "tsconfig.app.json",\n "styles": ["src/styles.css"],\n "scripts": []\n }\n },\n "serve": {"builder":"@angular-devkit/build-angular:dev-server","configurations":{"production":{"buildTarget":"'+pn+':build:production"},"development":{"buildTarget":"'+pn+':build:development"}},"defaultConfiguration":"development"}\n }\n }\n }\n}\n'); zip.file(folder+"tsconfig.json",'{\n "compileOnSave": false,\n "compilerOptions": {"baseUrl":"./","outDir":"./dist/out-tsc","forceConsistentCasingInFileNames":true,"strict":true,"noImplicitOverride":true,"noPropertyAccessFromIndexSignature":true,"noImplicitReturns":true,"noFallthroughCasesInSwitch":true,"paths":{"@/*":["src/*"]},"skipLibCheck":true,"esModuleInterop":true,"sourceMap":true,"declaration":false,"experimentalDecorators":true,"moduleResolution":"bundler","importHelpers":true,"target":"ES2022","module":"ES2022","useDefineForClassFields":false,"lib":["ES2022","dom"]},\n "references":[{"path":"./tsconfig.app.json"}]\n}\n'); zip.file(folder+"tsconfig.app.json",'{\n "extends":"./tsconfig.json",\n "compilerOptions":{"outDir":"./dist/out-tsc","types":[]},\n "files":["src/main.ts"],\n "include":["src/**/*.d.ts"]\n}\n'); zip.file(folder+"src/index.html","\n\n\n \n "+slugTitle(pn)+"\n \n \n \n\n\n \n\n\n"); zip.file(folder+"src/main.ts","import { bootstrapApplication } from '@angular/platform-browser';\nimport { appConfig } from './app/app.config';\nimport { AppComponent } from './app/app.component';\n\nbootstrapApplication(AppComponent, appConfig)\n .catch(err => console.error(err));\n"); zip.file(folder+"src/styles.css","* { margin: 0; padding: 0; box-sizing: border-box; }\nbody { font-family: system-ui, -apple-system, sans-serif; background: #f9fafb; color: #111827; }\n"); var hasComp=Object.keys(extracted).some(function(k){return k.indexOf("app.component")>=0;}); if(!hasComp){ zip.file(folder+"src/app/app.component.ts","import { Component } from '@angular/core';\nimport { RouterOutlet } from '@angular/router';\n\n@Component({\n selector: 'app-root',\n standalone: true,\n imports: [RouterOutlet],\n templateUrl: './app.component.html',\n styleUrl: './app.component.css'\n})\nexport class AppComponent {\n title = '"+pn+"';\n}\n"); zip.file(folder+"src/app/app.component.html","
\n
\n

"+slugTitle(pn)+"

\n

Built with PantheraHive BOS

\n
\n \n
\n"); zip.file(folder+"src/app/app.component.css",".app-header{display:flex;flex-direction:column;align-items:center;justify-content:center;min-height:60vh;gap:16px}h1{font-size:2.5rem;font-weight:700;color:#6366f1}\n"); } zip.file(folder+"src/app/app.config.ts","import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { provideRouter } from '@angular/router';\nimport { routes } from './app.routes';\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n provideRouter(routes)\n ]\n};\n"); zip.file(folder+"src/app/app.routes.ts","import { Routes } from '@angular/router';\n\nexport const routes: Routes = [];\n"); Object.keys(extracted).forEach(function(p){ var fp=p.startsWith("src/")?p:"src/"+p; zip.file(folder+fp,extracted[p]); }); zip.file(folder+"README.md","# "+slugTitle(pn)+"\n\nGenerated by PantheraHive BOS.\n\n## Setup\n\`\`\`bash\nnpm install\nng serve\n# or: npm start\n\`\`\`\n\n## Build\n\`\`\`bash\nng build\n\`\`\`\n\nOpen in VS Code with Angular Language Service extension.\n"); zip.file(folder+".gitignore","node_modules/\ndist/\n.env\n.DS_Store\n*.local\n.angular/\n"); } /* --- Python --- */ function buildPython(zip,folder,app,code){ var title=slugTitle(app); var pn=pkgName(app); var src=code.replace(/^\`\`\`[\w]*\n?/m,"").replace(/\n?\`\`\`$/m,"").trim(); var reqMap={"numpy":"numpy","pandas":"pandas","sklearn":"scikit-learn","tensorflow":"tensorflow","torch":"torch","flask":"flask","fastapi":"fastapi","uvicorn":"uvicorn","requests":"requests","sqlalchemy":"sqlalchemy","pydantic":"pydantic","dotenv":"python-dotenv","PIL":"Pillow","cv2":"opencv-python","matplotlib":"matplotlib","seaborn":"seaborn","scipy":"scipy"}; var reqs=[]; Object.keys(reqMap).forEach(function(k){if(src.indexOf("import "+k)>=0||src.indexOf("from "+k)>=0)reqs.push(reqMap[k]);}); var reqsTxt=reqs.length?reqs.join("\n"):"# add dependencies here\n"; zip.file(folder+"main.py",src||"# "+title+"\n# Generated by PantheraHive BOS\n\nprint(title+\" loaded\")\n"); zip.file(folder+"requirements.txt",reqsTxt); zip.file(folder+".env.example","# Environment variables\n"); zip.file(folder+"README.md","# "+title+"\n\nGenerated by PantheraHive BOS.\n\n## Setup\n\`\`\`bash\npython3 -m venv .venv\nsource .venv/bin/activate\npip install -r requirements.txt\n\`\`\`\n\n## Run\n\`\`\`bash\npython main.py\n\`\`\`\n"); zip.file(folder+".gitignore",".venv/\n__pycache__/\n*.pyc\n.env\n.DS_Store\n"); } /* --- Node.js --- */ function buildNode(zip,folder,app,code){ var title=slugTitle(app); var pn=pkgName(app); var src=code.replace(/^\`\`\`[\w]*\n?/m,"").replace(/\n?\`\`\`$/m,"").trim(); var depMap={"mongoose":"^8.0.0","dotenv":"^16.4.5","axios":"^1.7.9","cors":"^2.8.5","bcryptjs":"^2.4.3","jsonwebtoken":"^9.0.2","socket.io":"^4.7.4","uuid":"^9.0.1","zod":"^3.22.4","express":"^4.18.2"}; var deps={}; Object.keys(depMap).forEach(function(k){if(src.indexOf(k)>=0)deps[k]=depMap[k];}); if(!deps["express"])deps["express"]="^4.18.2"; var pkgJson=JSON.stringify({"name":pn,"version":"1.0.0","main":"src/index.js","scripts":{"start":"node src/index.js","dev":"nodemon src/index.js"},"dependencies":deps,"devDependencies":{"nodemon":"^3.0.3"}},null,2)+"\n"; zip.file(folder+"package.json",pkgJson); var fallback="const express=require(\"express\");\nconst app=express();\napp.use(express.json());\n\napp.get(\"/\",(req,res)=>{\n res.json({message:\""+title+" API\"});\n});\n\nconst PORT=process.env.PORT||3000;\napp.listen(PORT,()=>console.log(\"Server on port \"+PORT));\n"; zip.file(folder+"src/index.js",src||fallback); zip.file(folder+".env.example","PORT=3000\n"); zip.file(folder+".gitignore","node_modules/\n.env\n.DS_Store\n"); zip.file(folder+"README.md","# "+title+"\n\nGenerated by PantheraHive BOS.\n\n## Setup\n\`\`\`bash\nnpm install\n\`\`\`\n\n## Run\n\`\`\`bash\nnpm run dev\n\`\`\`\n"); } /* --- Vanilla HTML --- */ function buildVanillaHtml(zip,folder,app,code){ var title=slugTitle(app); var isFullDoc=code.trim().toLowerCase().indexOf("=0||code.trim().toLowerCase().indexOf("=0; var indexHtml=isFullDoc?code:"\n\n\n\n\n"+title+"\n\n\n\n"+code+"\n\n\n\n"; zip.file(folder+"index.html",indexHtml); zip.file(folder+"style.css","/* "+title+" — styles */\n*{margin:0;padding:0;box-sizing:border-box}\nbody{font-family:system-ui,-apple-system,sans-serif;background:#fff;color:#1a1a2e}\n"); zip.file(folder+"script.js","/* "+title+" — scripts */\n"); zip.file(folder+"assets/.gitkeep",""); zip.file(folder+"README.md","# "+title+"\n\nGenerated by PantheraHive BOS.\n\n## Open\nDouble-click \`index.html\` in your browser.\n\nOr serve locally:\n\`\`\`bash\nnpx serve .\n# or\npython3 -m http.server 3000\n\`\`\`\n"); zip.file(folder+".gitignore",".DS_Store\nnode_modules/\n.env\n"); } /* ===== MAIN ===== */ var sc=document.createElement("script"); sc.src="https://cdnjs.cloudflare.com/ajax/libs/jszip/3.10.1/jszip.min.js"; sc.onerror=function(){ if(lbl)lbl.textContent="Download ZIP"; alert("JSZip load failed — check connection."); }; sc.onload=function(){ var zip=new JSZip(); var base=(_phFname||"output").replace(/\.[^.]+$/,""); var app=base.toLowerCase().replace(/[^a-z0-9]+/g,"_").replace(/^_+|_+$/g,"")||"my_app"; var folder=app+"/"; var vc=document.getElementById("panel-content"); var panelTxt=vc?(vc.innerText||vc.textContent||""):""; var lang=detectLang(_phCode,panelTxt); if(_phIsHtml){ buildVanillaHtml(zip,folder,app,_phCode); } else if(lang==="flutter"){ buildFlutter(zip,folder,app,_phCode,panelTxt); } else if(lang==="react-native"){ buildReactNative(zip,folder,app,_phCode,panelTxt); } else if(lang==="swift"){ buildSwift(zip,folder,app,_phCode,panelTxt); } else if(lang==="kotlin"){ buildKotlin(zip,folder,app,_phCode,panelTxt); } else if(lang==="react"){ buildReact(zip,folder,app,_phCode,panelTxt); } else if(lang==="vue"){ buildVue(zip,folder,app,_phCode,panelTxt); } else if(lang==="angular"){ buildAngular(zip,folder,app,_phCode,panelTxt); } else if(lang==="python"){ buildPython(zip,folder,app,_phCode); } else if(lang==="node"){ buildNode(zip,folder,app,_phCode); } else { /* Document/content workflow */ var title=app.replace(/_/g," "); var md=_phAll||_phCode||panelTxt||"No content"; zip.file(folder+app+".md",md); var h=""+title+""; h+="

"+title+"

"; var hc=md.replace(/&/g,"&").replace(//g,">"); hc=hc.replace(/^### (.+)$/gm,"

$1

"); hc=hc.replace(/^## (.+)$/gm,"

$1

"); hc=hc.replace(/^# (.+)$/gm,"

$1

"); hc=hc.replace(/\*\*(.+?)\*\*/g,"$1"); hc=hc.replace(/\n{2,}/g,"

"); h+="

"+hc+"

Generated by PantheraHive BOS
"; zip.file(folder+app+".html",h); zip.file(folder+"README.md","# "+title+"\n\nGenerated by PantheraHive BOS.\n\nFiles:\n- "+app+".md (Markdown)\n- "+app+".html (styled HTML)\n"); } zip.generateAsync({type:"blob"}).then(function(blob){ var a=document.createElement("a"); a.href=URL.createObjectURL(blob); a.download=app+".zip"; a.click(); URL.revokeObjectURL(a.href); if(lbl)lbl.textContent="Download ZIP"; }); }; document.head.appendChild(sc); } function phShare(){navigator.clipboard.writeText(window.location.href).then(function(){var el=document.getElementById("ph-share-lbl");if(el){el.textContent="Link copied!";setTimeout(function(){el.textContent="Copy share link";},2500);}});}function phEmbed(){var runId=window.location.pathname.split("/").pop().replace(".html","");var embedUrl="https://pantherahive.com/embed/"+runId;var code='';navigator.clipboard.writeText(code).then(function(){var el=document.getElementById("ph-embed-lbl");if(el){el.textContent="Embed code copied!";setTimeout(function(){el.textContent="Get Embed Code";},2500);}});}