Skip to main content

A Python web framework inspired by Next.js with file-based routing, SSR, and SSG and more

Project description

๐Ÿš€ NextPy Framework

A RAHIMSTUDIOS Product | The Python web framework with exact Next.js syntax! Build modern web applications with file-based routing, True JSX components, React-like hooks, server-side rendering (SSR), static site generation (SSG), and more - all with the same developer experience as Next.js but in Python!


๐Ÿข About RAHIMSTUDIOS

NextPy is proudly developed and maintained by RAHIMSTUDIOS - a cutting-edge technology company dedicated to creating innovative developer tools and frameworks. Our mission is to bridge the gap between Python's simplicity and modern web development paradigms.

๐ŸŽฏ Why RAHIMSTUDIOS Built NextPy:

  • ๐Ÿ Python-First Philosophy - Leverage Python's simplicity for web development
  • โšก Performance Focus - Blazing fast SSR and SSG capabilities
  • ๐ŸŽจ Developer Experience - Tooling that makes development joyful
  • ๐Ÿ”ง Enterprise Ready - Production-grade features and reliability
  • ๐ŸŒ Community Driven - Open-source with professional backing

๐Ÿš€ Quick Start

Installation

# Install NextPy
pip install nextpy-framework

# Create new project
nextpy create my-app

# Navigate to project
cd my-app

# Start development server
nextpy dev

Your First NextPy App with PSX

Create pages/index.psx:

# Import all React-like features from NextPy
from nextpy import (
    component, psx, useState, useEffect, useCallback, useMemo,
    create_onclick, create_onchange, create_onsubmit
)

# Import components like in React
from components.Button import Button

@component
def Home(props=None):
    # Python-style array destructuring for hooks
    [name, setName] = useState('rahim')
    [count, setCount] = useState(0)
    [loading, setLoading] = useState(false)
    
    # Server-side props
    props = props or {}
    title = props.get("title", "Welcome to NextPy")
    message = props.get("message", "Your Python-powered web framework with True JSX")
    
    # Event handlers with create utilities
    handleClick = create_onclick(lambda e: setName(name.upper()))
    handleIncrement = create_onclick(lambda e: setCount(count + 1))
    
    # Client-side data fetching
    def fetch_data():
        setLoading(true)
        # Simulate API call
        setLoading(false)
    
    useEffect(fetch_data, [])
    
    return (
        <div className={clsx('flex', 'items-center', 'justify-center', 'min-h-screen', 'bg-gradient-to-br', 'from-blue-500', 'to-purple-600')}>
            <div className={clsx('text-center', 'text-white', 'max-w-4xl', 'mx-auto', 'p-8')}>
                <h1 className={clsx('mb-4', 'text-5xl', 'font-bold')}>{title}</h1>
                <p className={clsx('text-xl', 'mb-8')}>{message} {name}</p>
                
                {/* Interactive Section */}
                <div className={clsx('mb-8', 'bg-white', 'bg-opacity-10', 'backdrop-blur-sm', 'rounded-lg', 'p-6')}>
                    <h2 className={clsx('text-2xl', 'font-bold', 'mb-4')}>Interactive Demo</h2>
                    <p className="mb-4">Count: {count}</p>
                    
                    <div className={clsx('flex', 'flex-wrap', 'gap-4', 'justify-center')}>
                        <Button onclick={handleIncrement} variant="primary" size="lg">
                            Increment: {count}
                        </Button>
                        
                        <Button onclick={handleClick} variant="secondary" size="lg">
                            Uppercase Name
                        </Button>
                        
                        <Button onclick={lambda e: setCount(0)} variant="danger" size="lg">
                            Reset
                        </Button>
                    </div>
                </div>
                
                {/* Component Nesting Demo */}
                <div className={clsx('mb-8', 'bg-white', 'bg-opacity-10', 'backdrop-blur-sm', 'rounded-lg', 'p-6')}>
                    <h2 className={clsx('text-2xl', 'font-bold', 'mb-4')}>Component Nesting</h2>
                    <Button variant="success" onclick={lambda e: console.log("Nested button clicked!")}>
                        Nested Button Component
                    </Button>
                </div>
                
                {/* Python Logic Demo */}
                <div className={clsx('mb-8', 'bg-white', 'bg-opacity-10', 'backdrop-blur-sm', 'rounded-lg', 'p-6')}>
                    <h2 className={clsx('text-2xl', 'font-bold', 'mb-4')}>Python Logic in JSX</h2>
                    
                    {/* Conditional rendering */}
                    {if len(name) > 5:
                        <p className="text-green-300">โœ… Long name detected!</p>
                    {else:
                        <p className="text-yellow-300">โš ๏ธ Short name</p>
                    {/if}}
                    
                    {/* For loop */}
                    <div className="mt-4">
                        {for i in range(3):
                            <div key={i} className={clsx('mb-2', 'p-2', 'bg-white', 'bg-opacity-20', 'rounded')}>
                                Item {i}: {name} {i + 1}
                            </div>
                        {/for}
                    </div>
                </div>
                
                {/* Navigation */}
                <div className={clsx('flex', 'flex-wrap', 'gap-4', 'justify-center')}>
                    <a href="/about" className={clsx('inline-block', 'px-6', 'py-3', 'font-semibold', 'text-blue-600', 'transition-all', 'duration-300', 'transform', 'bg-white', 'rounded-lg', 'shadow-lg', 'hover:bg-gray-100', 'hover:text-blue-700', 'hover:scale-105')}>
                        Learn More
                    </a>
                    
                    <a href="/blog" className={clsx('inline-block', 'px-6', 'py-3', 'font-semibold', 'text-purple-600', 'transition-all', 'duration-300', 'transform', 'bg-white', 'rounded-lg', 'shadow-lg', 'hover:bg-gray-100', 'hover:text-purple-700', 'hover:scale-105')}>
                        View Blog
                    </a>
                </div>
            </div>
        </div>
    )

# Server-side props (Next.js style)
def getServerSideProps(context):
    return {
        "props": {
            "title": "Welcome to NextPy by RAHIMSTUDIOS",
            "message": "Your Python-powered web framework with True JSX"
        }
    }

default = Home

Visit http://localhost:8000 to see your app!


๐ŸŽฏ Why Choose NextPy by RAHIMSTUDIOS?

โœ… Complete React Experience in Python

  • โœ… True JSX Syntax - Write exact Next.js JSX syntax in Python
  • โœ… All React Hooks - useState, useEffect, useCallback, useMemo, useRef, useContext, useReducer
  • โœ… Python-Style Destructuring - [name, setName] = useState('rahim')
  • โœ… Event Utilities - create_onclick, create_onchange, create_onsubmit
  • โœ… Custom Hooks - useCounter, useToggle, useLocalStorage, useFetch
  • โœ… Component Nesting - Full component composition and props passing

โœ… Next.js Features in Python

  • โœ… File-Based Routing - Automatic route discovery like Next.js
  • โœ… PSX Files - .psx extension for Python JSX components
  • โœ… Server-Side Rendering - Full SSR support with getServerSideProps
  • โœ… Static Site Generation - Build static sites with getStaticProps
  • โœ… Dynamic Routes - [slug].psx, [id].psx with full params support
  • โœ… API Routes - Python API endpoints in pages/api/
  • โœ… Middleware - Authentication, logging, custom middleware
  • โœ… Component Imports - from components.Button import Button

โœ… Developer Experience

  • โœ… Hot Reload - Instant development feedback
  • โœ… VS Code Extension - Dedicated extension for syntax highlighting
  • โœ… Language Server - Auto-completion, IntelliSense, error checking
  • โœ… TypeScript Support - Full type definitions and IntelliSense
  • โœ… Debug Tools - Built-in debugging with detailed error pages
  • โœ… Plugin System - Extensible architecture

โœ… Production Ready

  • โœ… Template System - Jinja2 templates with PSX content injection
  • โœ… Tailwind CSS - Automatic compilation and optimization
  • โœ… Error Handling - Comprehensive error pages and debugging
  • โœ… Performance - Optimized rendering and caching
  • โœ… Security - Built-in security headers and protections
  • โœ… Deployment - Docker, Vercel, Heroku, AWS support

๐Ÿ›ฃ๏ธ Routing System

File-Based Routing with PSX

NextPy uses file-based routing just like Next.js, with full .psx support:

pages/
โ”œโ”€โ”€ index.psx             # โ†’ /
โ”œโ”€โ”€ about.psx             # โ†’ /about
โ”œโ”€โ”€ contact.psx           # โ†’ /contact
โ”œโ”€โ”€ blog/
โ”‚   โ”œโ”€โ”€ index.psx         # โ†’ /blog
โ”‚   โ”œโ”€โ”€ post.psx          # โ†’ /blog/post
โ”‚   โ””โ”€โ”€ [slug].psx       # โ†’ /blog/:slug
โ”œโ”€โ”€ users/
โ”‚   โ”œโ”€โ”€ [id].psx         # โ†’ /users/:id
โ”‚   โ””โ”€โ”€ [...all].psx     # โ†’ /users/*
โ””โ”€โ”€ api/
    โ”œโ”€โ”€ hello.psx         # โ†’ /api/hello
    โ””โ”€โ”€ users/
        โ””โ”€โ”€ [id].psx     # โ†’ /api/users/:id

Dynamic Routes with PSX

# pages/blog/[slug].psx
from nextpy import component, psx, useState, useEffect

@component
def BlogPost(props=None):
    slug = props.get("params", {}).get("slug", "")
    [post, setPost] = useState({})
    [loading, setLoading] = useState(true)
    
    def fetch_post():
        # Simulate API call
        setPost({
            "title": f"Blog Post: {slug}",
            "content": f"This is the content for {slug}",
            "date": "2024-03-26"
        })
        setLoading(false)
    
    useEffect(fetch_post, [slug])
    
    return (
        <div className={clsx('container', 'mx-auto', 'p-8')}>
            {loading and (
                <div className={clsx('text-center', 'py-12')}>
                    <div className={clsx('animate-spin', 'rounded-full', 'h-12', 'w-12', 'border-b-2', 'border-blue-600', 'mx-auto')}></div>
                    <p className={clsx('mt-4', 'text-gray-600')}>Loading post...</p>
                </div>
            )}
            
            {post and not loading and (
                <article className={clsx('max-w-4xl', 'mx-auto')}>
                    <header className="mb-8">
                        <h1 className={clsx('text-4xl', 'font-bold', 'mb-4')}>{post.get('title')}</h1>
                        <time className="text-gray-600">{post.get('date')}</time>
                    </header>
                    
                    <div className={clsx('prose', 'prose-lg', 'max-w-none')}>
                        <div>{post.get('content')}</div>
                    </div>
                </article>
            )}
        </div>
    )

def getServerSideProps(context):
    slug = context.get("params", {}).get("slug", "")
    
    # Pre-fetch data on server
    return {
        "props": {
            "params": {"slug": slug}
        }
    }

default = BlogPost

API Routes

# pages/api/users.psx
from nextpy.server.app import JSONResponse

async def get(request):
    """GET /api/users - Fetch all users"""
    import requests
    response = requests.get("https://jsonplaceholder.typicode.com/users")
    users = response.json()
    
    return JSONResponse({
        "success": True,
        "data": users,
        "count": len(users)
    })

async def post(request):
    """POST /api/users - Create new user"""
    data = await request.json()
    
    # Validate required fields
    required_fields = ["name", "email"]
    for field in required_fields:
        if field not in data:
            return JSONResponse({
                "success": False,
                "error": f"Missing required field: {field}"
            }, status_code=400)
    
    # Create new user (in real app, save to database)
    new_user = {
        "id": len(requests.get("https://jsonplaceholder.typicode.com/users").json()) + 1,
        **data
    }
    
    return JSONResponse({
        "success": True,
        "data": new_user,
        "message": "User created successfully"
    }, status_code=201)

๐Ÿ”ง Data Fetching & State Management

Server-Side Rendering (SSR)

# pages/dashboard.psx
from nextpy import component, psx, useState, useEffect
from nextpy.psx import useFetch

@component
def Dashboard(props=None):
    # Server-rendered data
    initial_data = props.get("data", {})
    
    # Client-side state
    [users, setUsers] = useState(initial_data.get("users", []))
    [posts, setPosts] = useState([])
    [loading, setLoading] = useState(false)
    
    # Custom hook for data fetching
    [data, loading_data, error_data] = useFetch("https://jsonplaceholder.typicode.com/posts?_limit=5")
    
    def fetch_posts():
        setLoading(true)
        try:
            import requests
            response = requests.get("https://jsonplaceholder.typicode.com/posts?_limit=10")
            if response.status_code == 200:
                setPosts(response.json())
        except Exception as e:
            print(f"Error fetching posts: {e}")
        finally:
            setLoading(false)
    
    # Initial data fetch
    useEffect(lambda: {
        if data:
            setPosts(data)
        fetch_posts()
    }, [data])
    
    return (
        <div className={clsx('min-h-screen', 'bg-gray-100')}>
            <div className={clsx('container', 'mx-auto', 'p-8')}>
                <header className="mb-8">
                    <h1 className={clsx('text-4xl', 'font-bold', 'text-gray-800', 'mb-4')}>Dashboard</h1>
                    <p className="text-gray-600">Real-time data fetching with PSX</p>
                </header>
                
                <div className={clsx('grid', 'grid-cols-1', 'lg:grid-cols-2', 'gap-8')}>
                    {/* Users Section */}
                    <section className={clsx('bg-white', 'rounded-lg', 'shadow', 'p-6')}>
                        <h2 className={clsx('text-2xl', 'font-bold', 'mb-4')}>Users ({len(users)})</h2>
                        
                        {loading_data and (
                            <div className={clsx('text-center', 'py-8')}>
                                <div className={clsx('animate-spin', 'rounded-full', 'h-8', 'w-8', 'border-b-2', 'border-blue-600', 'mx-auto')}></div>
                            </div>
                        )}
                        
                        {not loading_data and users and (
                            <div className="space-y-3">
                                {for user in users[:5]:
                                    <div key={user.get('id')} className={clsx('border-b', 'pb-3')}>
                                        <div className={clsx('flex', 'items-center', 'justify-between')}>
                                            <div>
                                                <h3 className="font-semibold">{user.get('name')}</h3>
                                                <p className={clsx('text-sm', 'text-gray-600')}>{user.get('email')}</p>
                                            </div>
                                            <span className={clsx('text-xs', 'bg-blue-100', 'text-blue-800', 'px-2', 'py-1', 'rounded')}>
                                                {user.get('company', {}).get('name', 'N/A')}
                                            </span>
                                        </div>
                                    </div>
                                {/for}}
                            </div>
                        )}
                    </section>
                    
                    {/* Posts Section */}
                    <section className={clsx('bg-white', 'rounded-lg', 'shadow', 'p-6')}>
                        <h2 className={clsx('text-2xl', 'font-bold', 'mb-4')}>Latest Posts ({len(posts)})</h2>
                        
                        {loading and (
                            <div className={clsx('text-center', 'py-8')}>
                                <div className={clsx('animate-spin', 'rounded-full', 'h-8', 'w-8', 'border-b-2', 'border-green-600', 'mx-auto')}></div>
                            </div>
                        )}
                        
                        {not loading and posts and (
                            <div className="space-y-4">
                                {for post in posts:
                                    <div key={post.get('id')} className={clsx('border-l-4', 'border-blue-500', 'pl-4')}>
                                        <h3 className={clsx('font-semibold', 'mb-1')}>{post.get('title')}</h3>
                                        <p className={clsx('text-sm', 'text-gray-600', 'line-clamp-2')}>{post.get('body')}</p>
                                    </div>
                                {/for}}
                            </div>
                        )}
                    </section>
                </div>
                
                {/* Statistics */}
                <section className={clsx('mt-8', 'bg-white', 'rounded-lg', 'shadow', 'p-6')}>
                    <h2 className={clsx('text-2xl', 'font-bold', 'mb-4')}>Statistics</h2>
                    <div className={clsx('grid', 'grid-cols-1', 'md:grid-cols-3', 'gap-6')}>
                        <div className="text-center">
                            <div className={clsx('text-3xl', 'font-bold', 'text-blue-600')}>{len(users)}</div>
                            <div className="text-gray-600">Total Users</div>
                        </div>
                        <div className="text-center">
                            <div className={clsx('text-3xl', 'font-bold', 'text-green-600')}>{len(posts)}</div>
                            <div className="text-gray-600">Total Posts</div>
                        </div>
                        <div className="text-center">
                            <div className={clsx('text-3xl', 'font-bold', 'text-purple-600')}>
                                {len([u for u in users if u.get('company', {}).get('name')])}
                            </div>
                            <div className="text-gray-600">Companies</div>
                        </div>
                    </div>
                </section>
            </div>
        </div>
    )

def getServerSideProps(context):
    """Server-side data fetching"""
    try:
        import requests
        response = requests.get("https://jsonplaceholder.typicode.com/users")
        users = response.json()
        
        return {
            "props": {
                "data": {
                    "users": users[:10],  # First 10 users
                    "userCount": len(users)
                }
            }
        }
    except Exception as e:
        return {
            "props": {
                "data": {
                    "users": [],
                    "error": str(e)
                }
            }
        }

default = Dashboard

๐ŸŽจ Component System

Reusable Components

# components/Button.psx
from nextpy import component, psx

@component
def Button(props=None):
    props = props or {}
    onclick = props.get("onclick", lambda e: None)
    children = props.get("children", "Button")
    variant = props.get("variant", "primary")
    size = props.get("size", "md")
    disabled = props.get("disabled", false)
    
    # Variant styles
    variant_styles = {
        "primary": "bg-blue-500 hover:bg-blue-600 text-white shadow-lg hover:shadow-xl",
        "secondary": "bg-gray-200 hover:bg-gray-300 text-gray-800",
        "danger": "bg-red-500 hover:bg-red-600 text-white",
        "success": "bg-green-500 hover:bg-green-600 text-white",
        "outline": "border-2 border-blue-500 text-blue-500 hover:bg-blue-50"
    }
    
    # Size styles
    size_styles = {
        "sm": "px-3 py-1.5 text-sm",
        "md": "px-4 py-2 text-base",
        "lg": "px-6 py-3 text-lg"
    }
    
    button_class = f"{variant_styles.get(variant, variant_styles['primary'])} {size_styles.get(size, size_styles['md'])} font-medium transition-all duration-200 transform rounded"
    
    return (
        <button 
            onclick={onclick}
            disabled={disabled}
            className={button_class + (disabled and " opacity-50 cursor-not-allowed" or " hover:scale-105 active:scale-95")}
        >
            {children}
        </button>
    )

default = Button

Component Nesting

# components/Card.psx
from nextpy import component, psx
from Button import Button

@component
def Card(props=None):
    props = props or {}
    title = props.get("title", "Card Title")
    content = props.get("content", "Card content")
    show_button = props.get("showButton", True)
    
    def handle_card_click():
        print(f"Card '{title}' button clicked!")
    
    return (
        <div className={clsx('bg-white', 'rounded-lg', 'shadow-lg', 'p-6', 'max-w-md')}>
            <h2 className={clsx('text-xl', 'font-bold', 'mb-4')}>{title}</h2>
            <p className={clsx('text-gray-600', 'mb-6')}>{content}</p>
            
            {show_button and (
                <div className={clsx('flex', 'space-x-4')}>
                    <Button 
                        onclick={handle_card_click}
                        variant="primary"
                        size="md"
                    >
                        Learn More
                    </Button>
                    
                    <Button 
                        onclick={lambda e: print("Secondary button clicked!")}
                        variant="secondary"
                        size="md"
                    >
                        Cancel
                    </Button>
                </div>
            )}
        </div>
    )

default = Card

๐ŸŽฏ All React Hooks Available

Core Hooks

from nextpy import (
    useState, useEffect, useCallback, useMemo, useRef,
    useContext, useReducer, useImperativeHandle, useLayoutEffect,
    useDebugValue, useTransition, useDeferredValue, useId
)

@component
def HooksDemo(props=None):
    # State hooks
    [count, setCount] = useState(0)
    [name, setName] = useState('NextPy')
    [isVisible, setIsVisible] = useState(true)
    
    # Ref hooks
    inputRef = useRef(None)
    
    # Reducer hook
    def reducer(state, action):
        if action['type'] == 'increment':
            return {'count': state['count'] + 1}
        elif action['type'] == 'decrement':
            return {'count': state['count'] - 1}
        return state
    
    [reducerState, dispatch] = useReducer(reducer, {'count': 0})
    
    # Memoized callback
    handleClick = useCallback(lambda e: setCount(count + 1), [count])
    
    # Memoized value
    expensiveValue = useMemo(lambda: sum(range(count + 1)), [count])
    
    # Effect hook
    def effect():
        print(f"Component updated: count={count}, name={name}")
    
    useEffect(effect, [count, name])
    
    return (
        <div className={clsx('p-6', 'bg-white', 'rounded-lg', 'shadow')}>
            <h2 className={clsx('text-2xl', 'font-bold', 'mb-4')}>React Hooks Demo</h2>
            
            <div className="space-y-4">
                <div>
                    <p>Count: {count}</p>
                    <p>Expensive Value: {expensiveValue}</p>
                    <p>Reducer Count: {reducerState['count']}</p>
                </div>
                
                <div className={clsx('flex', 'space-x-4')}>
                    <Button onclick={handleClick} variant="primary">
                        Increment
                    </Button>
                    
                    <Button onclick={lambda e: dispatch({'type': 'increment'})} variant="secondary">
                        Reducer Increment
                    </Button>
                    
                    <Button onclick={lambda e: setIsVisible(!isVisible)} variant="outline">
                        Toggle Visibility
                    </Button>
                </div>
                
                {isVisible and (
                    <div className={clsx('mt-4', 'p-4', 'bg-gray-50', 'rounded')}>
                        <input 
                            ref={inputRef}
                            value={name}
                            onchange={lambda e: setName(e.target.value)}
                            className={clsx('px-3', 'py-2', 'border', 'rounded')}
                            placeholder="Enter name"
                        />
                        <p className="mt-2">Hello, {name}!</p>
                    </div>
                )}
            </div>
        </div>
    )

default = HooksDemo

๐Ÿ› ๏ธ CLI Commands

Project Management

# Create new project
nextpy create my-app

# Start development server
nextpy dev

# Build for production
nextpy build

# Start production server
nextpy start

# Export static site
nextpy export

# Show available routes
nextpy routes

# Show version info
nextpy version

# Show project info
nextpy info

Development Tools

# Generate TypeScript definitions
nextpy generate types

# Run tests
nextpy test

# Lint code
nextpy lint

# Format code
nextpy format

๐Ÿ“ฆ Project Structure

my-app/
โ”œโ”€โ”€ pages/                    # Route pages (.py and .psx)
โ”‚   โ”œโ”€โ”€ index.psx             # Home page
โ”‚   โ”œโ”€โ”€ about.psx             # About page
โ”‚   โ”œโ”€โ”€ blog/
โ”‚   โ”‚   โ”œโ”€โ”€ index.psx         # Blog index
โ”‚   โ”‚   โ””โ”€โ”€ [slug].psx      # Dynamic blog posts
โ”‚   โ””โ”€โ”€ api/                # API routes
โ”‚       โ”œโ”€โ”€ hello.psx         # Hello API
โ”‚       โ””โ”€โ”€ users/
โ”‚           โ””โ”€โ”€ [id].psx     # User API
โ”œโ”€โ”€ components/              # Reusable components
โ”‚   โ”œโ”€โ”€ Button.psx           # Button component
โ”‚   โ”œโ”€โ”€ Card.psx             # Card component
โ”‚   โ””โ”€โ”€ Layout.psx           # Layout component
โ”œโ”€โ”€ hooks/                   # Custom hooks
โ”‚   โ”œโ”€โ”€ useCounter.py        # Counter hook
โ”‚   โ”œโ”€โ”€ useToggle.py         # Toggle hook
โ”‚   โ””โ”€โ”€ useLocalStorage.py  # Local storage hook
โ”œโ”€โ”€ styles/                 # CSS files
โ”‚   โ”œโ”€โ”€ global.css          # Global styles
โ”‚   โ””โ”€โ”€ components.css      # Component styles
โ”œโ”€โ”€ public/                 # Static assets
โ”‚   โ”œโ”€โ”€ images/            # Images
โ”‚   โ”œโ”€โ”€ fonts/             # Fonts
โ”‚   โ””โ”€โ”€ favicon.ico        # Favicon
โ”œโ”€โ”€ templates/              # HTML templates (optional)
โ”‚   โ”œโ”€โ”€ _page.html         # Base page template
โ”‚   โ””โ”€โ”€ _404.html         # 404 page template
โ”œโ”€โ”€ .nextpy/               # NextPy configuration
โ”‚   โ”œโ”€โ”€ config.js          # Configuration file
โ”‚   โ””โ”€โ”€ plugins/          # Plugin configurations
โ”œโ”€โ”€ .vscode/               # VS Code settings
โ”‚   โ”œโ”€โ”€ settings.json       # Editor settings
โ”‚   โ”œโ”€โ”€ extensions.json     # Recommended extensions
โ”‚   โ””โ”€โ”€ launch.json        # Debug configuration
โ”œโ”€โ”€ main.py                # Application entry point
โ”œโ”€โ”€ requirements.txt        # Python dependencies
โ”œโ”€โ”€ package.json           # Node.js dependencies (for VS Code extension)
โ””โ”€โ”€ README.md              # Project documentation

๐Ÿš€ Deployment

Production Build

# Build optimized production bundle
nextpy build

# Start production server
nextpy start

# Export static site
nextpy export

Docker Deployment

# Dockerfile
FROM python:3.11-slim

WORKDIR /app

COPY requirements.txt .
RUN pip install -r requirements.txt

COPY . .

EXPOSE 8000

CMD ["nextpy", "start"]

๐ŸŽฏ Why RAHIMSTUDIOS?

๐Ÿข Professional Development

  • Enterprise-Grade: Built for production environments
  • Expert Support: Professional backing and maintenance
  • Regular Updates: Continuous improvements and new features
  • Security First: Built with security as a top priority

๐ŸŒŸ Innovation Leadership

  • Cutting-Edge Technology: Latest web development paradigms
  • Python Ecosystem: Leveraging Python's vast ecosystem
  • Developer-Focused: Tools that make developers productive
  • Community-Driven: Open-source with professional oversight

๐Ÿš€ Performance & Scale

  • Optimized Rendering: Blazing fast SSR and SSG
  • Scalable Architecture: Built for applications of all sizes
  • Modern Tooling: Latest development tools and practices
  • Production Ready: Battle-tested in real-world applications

๐Ÿ“š Documentation & Support

๐Ÿ“– Comprehensive Docs

๐Ÿค Community

๐Ÿ’ผ Enterprise Support


๐ŸŽ‰ Get Started Today!

# Install NextPy by RAHIMSTUDIOS
pip install nextpy-framework

# Create your first project
nextpy create my-awesome-app

# Start building amazing web applications with Python!
cd my-awesome-app && nextpy dev

NextPy - Where Python meets modern web development
A RAHIMSTUDIOS Product - Building the future of Python web frameworks


ยฉ 2026 RAHIMSTUDIOS. All rights reserved. NextPy is a trademark of RAHIMSTUDIOS.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

nextpy_framework-3.7.2.tar.gz (285.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

nextpy_framework-3.7.2-py3-none-any.whl (329.9 kB view details)

Uploaded Python 3

File details

Details for the file nextpy_framework-3.7.2.tar.gz.

File metadata

  • Download URL: nextpy_framework-3.7.2.tar.gz
  • Upload date:
  • Size: 285.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for nextpy_framework-3.7.2.tar.gz
Algorithm Hash digest
SHA256 f19b9ac8e670f557256fe3ffea690cf51597ed59ae9a7ff52f4a9374d65d4666
MD5 48d1d238d7d96ebb6310ff7ffda583f6
BLAKE2b-256 38b8892e87650f615d19eab1c1ccbaa37f662ff13dd27001bb67e139ee5b2090

See more details on using hashes here.

File details

Details for the file nextpy_framework-3.7.2-py3-none-any.whl.

File metadata

File hashes

Hashes for nextpy_framework-3.7.2-py3-none-any.whl
Algorithm Hash digest
SHA256 1b93d60a52324772639d1bd21d7ec99f4d68b00946514774de03f92ecf23a4c2
MD5 6f9e71cd7adac594e94f31238285ecc9
BLAKE2b-256 718e1720828bc2c77c835b885b5d1b6b5959450c576e29604ad90d3e9876d4cf

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page