Skip to content
/ press Public

Modern preprint server for web-native research. Format freedom (Typst, Quarto, MyST, Jupyter), instant publication, permanent URLs. Fully community-owned.

License

Notifications You must be signed in to change notification settings

aris-pub/press

Repository files navigation

Scroll Press

License: MIT Python 3.11+ Code style: ruff CI PRs Welcome

A modern HTML-native preprint server for academic research documents. Built with FastAPI, Scroll Press accepts research from any authoring tool that produces HTML—Typst, Quarto, MyST, Jupyter, or handwritten HTML. Format freedom, instant publication, permanent URLs.

Governance: Press is fully community-owned—open source, community contributions accepted, roadmap driven by community needs, forever free. Supported by community donations and academic grants.

Features

  • HTML-native publishing: Upload complete HTML documents with embedded CSS and JavaScript
  • Session-based authentication: Secure user registration and login system with email verification
  • Email verification: Token-based email verification with password reset functionality
  • GDPR compliance: Data export endpoint for user data portability (Article 20)
  • Subject categorization: Organize research by academic disciplines
  • Draft and publish workflow: Save drafts and publish when ready
  • Scroll cards: Browse recent submissions with rich metadata
  • Responsive design: Clean, academic-focused UI with HTMX interactions
  • Performance optimized: Static file caching with CDN-ready headers

Quick Start

Prerequisites

  • Python 3.11+
  • PostgreSQL database
  • uv package manager
  • just to run common commands

Installation

  1. Clone the repository

    git clone <repository-url>
    cd press
  2. Set up environment

    cp .env.example .env
    # Edit .env with your database URL, port, and email service credentials

    Required environment variables:

    • DATABASE_URL: PostgreSQL connection string
    • PORT: Server port (default: 7999)
    • RESEND_API_KEY: API key for Resend email service (for email verification)
    • FROM_EMAIL: Email address to send from (default: noreply@updates.aris.pub)
    • BASE_URL: Base URL for email links (defaults to https://127.0.0.1:{PORT})
  3. Install dependencies and setup

    just init
  4. Start the development server

    just dev

Visit https://localhost:7999 to access Scroll Press (HTTPS with self-signed certificate).

Development

Project Structure

app/
├── auth/               # Session-based authentication and token management
│   ├── session.py      # Session handling
│   └── tokens.py       # Email verification and password reset tokens
├── emails/             # Email service integration
│   ├── service.py      # Resend email service
│   └── templates.py    # Email HTML templates
├── models/             # SQLAlchemy database models
│   ├── user.py         # User model with email verification
│   ├── token.py        # Token model for verification/reset
│   ├── scroll.py       # Research manuscript model
│   └── subject.py      # Academic subject categorization
├── routes/             # FastAPI route handlers
├── templates/          # Jinja2 templates with component macros
│   └── auth/           # Authentication templates (login, register, verify, reset)
└── database.py         # Async database configuration

static/
├── css/               # Stylesheet
└── images/            # Static assets

tests/                 # Comprehensive test suite

Architecture

  • Backend: FastAPI with async/await patterns
  • Database: PostgreSQL with SQLAlchemy 2.0 async
  • Authentication: Session-based with in-memory storage and token-based email verification
  • Email Service: Resend API for transactional emails (verification, password reset)
  • Frontend: Jinja2 templates with HTMX for dynamic interactions
  • Security: HTTPS-only development with self-signed certificates
  • Testing: pytest with asyncio support, parallel execution, and Playwright e2e tests

Documentation

Contributing

  1. Run all checks: just check (includes lint, unit tests, and e2e tests)
  2. Follow existing patterns: Session-based auth, macro components, async/await
  3. Write tests: All new features should include test coverage
  4. Read the docs: See Testing Guide for testing best practices

Contributions are welcome! Please open an issue to discuss major changes before submitting a PR.

License

This project is licensed under the MIT License - see the LICENSE file for details.

Support

For issues and questions, please use the GitHub issue tracker.

About

Modern preprint server for web-native research. Format freedom (Typst, Quarto, MyST, Jupyter), instant publication, permanent URLs. Fully community-owned.

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 2

  •  
  •