pallets/flask

The Python micro framework for building web applications.

25
Hotness score
44
Reliability score
71,981
Stars
over 16 years
Age
0
Published reviews
0
Questions

Scores

Hotness and reliability

The two headline scores, measured daily, with 30, 90, and 180 day views.

Hotness score

Jul 19, 2026

Current25

Previous34

Weekly average

100500
Full metrics details

Derived only from GitHub GraphQL starredAt events after daily star totals are reconciled.

180 observed daily rows. Missing days are not fabricated.

Hotness formula

40% Hot today + 40% Hot this week + 20% Breakout.

  • 40% Hot today: 20
  • 40% Hot this week: 37
  • 20% Breakout: 1
  • Stars gained: 1d: 6
  • Stars gained: 7d: 64
  • Stars gained: 14d: 90
  • Stars gained: 30d: 301
  • Stars gained: 90d: 552

Per-day formula: 0.40 × Hot today + 0.40 × Hot week + 0.20 × Breakout.

  • Same-day multiplier = stars 1d ÷ max(1, stars 7d ÷ 7)
  • Weekly multiplier = stars 7d ÷ max(1, stars 30d ÷ 30 × 7)
  • Fortnight multiplier = stars 14d ÷ max(1, stars 90d ÷ 90 × 14)
  • Hot today = clamp(70 × log-scale(stars 1d, 1000) + 30 × breakout-scale(same-day, 4))
  • Hot week = clamp(75 × log-scale(stars 7d, 5000) + 25 × breakout-scale(weekly, 3))
  • Breakout = clamp(35 × breakout-scale(same-day, 4) + 40 × breakout-scale(weekly, 3) + 25 × breakout-scale(fortnight, 2.5))
DateStarsStars 1dStars 7dStars 14dStars 30dStars 90dSame-day multiplierWeekly multiplierFortnight multiplierHot todayHot weekBreakoutStored score

Reliability score

Jul 19, 2026

Current44

Previous45

Weekly average

100500
Full metrics details

Derived from the displayed continuity, closure, shipping, liveness, and support-burden components.

180 observed daily rows. Missing days are not fabricated.

Reliability formula

30% Continuity + 30% Closure + 20% Shipping + 10% Liveness + 10% Support burden.

  • 30% Continuity: 45
  • 30% Closure: 39
  • 20% Shipping: 4
  • 10% Liveness: 73
  • 10% Support burden: 100

Per-day formula: 0.30 × Continuity + 0.30 × Closure + 0.20 × Shipping + 0.10 × Liveness + 0.10 × Support burden.

  • Continuity = 35% active ratio 90d + 20% active ratio 30d + 15% PR efficiency 90d + 10% PR efficiency 30d + 10% liveness + 10% observed-history coverage
  • Closure = 55% PR merge efficiency 90d + 45% issue close efficiency 90d
  • Shipping = 100 × (20% × release ratio 30d + 30% × release ratio 90d + 50% × release ratio 180d); ratios are releases ÷ 2, 6, and 12, capped at 1
  • Support burden = 100 − 2 × open issues per 1,000 stars
  • Liveness = 100 × exp(−pushed days ago ÷ 120)

Stars, issues, pull requests, and releases are daily observations. Pushed-days and license are repository snapshot-derived inputs and are not independent historical GitHub events.

DateIssues openedIssues closedPRs openedPRs mergedReleasesStarsOpen issuesPushed days agoContinuityClosureShippingLivenessSupport burdenLicenseObserved daysMissing daysNeeds healingStored score

Reliability breakdown

What drives the reliability score

Component scores measured daily from GitHub activity (2026-07-18).

Continuity30% of headline45

Activity on 48 of 90 tracked days in the last 90 and 19 of 30 in the last 30.

Closure30% of headline39

Merged 1 of 59 PRs opened and closed 18 of 21 issues opened over the last 90 tracked days — PR flow carries 55% of this component, issue flow 45%.

Shipping20% of headline4

1 releases in the last 180 days, 0 in the last 90 and 0 in the last 30 — a steady cadence scores highest.

Liveness10% of headline73

Last push 40 days ago — freshness decays as pushes age (roughly halves every 83 days without a push).

Support burden10% of headline100

3 open issues against 71,981 stars — about 0 open issues per 1,000 stars. Lighter backlogs score higher.

Adoption confidence51

Modeled — how confidently teams are adopting this repo. Stargazers

Maintenance quality45

Modeled from PR/issue responsiveness and upkeep signals. Activity pulse

Risk score38

Modeled — lower is better; adoption and continuity risk. Repository

Stays active (30d)44%

Modeled chance the repo stays active over 30 days. Activity pulse

Stays active (90d)47%

Modeled chance the repo stays active over 90 days. Activity pulse

Release rhythm (180d)4

Regularity of releases over the last 180 days. Releases

Maintainer bus risk (90d)50%

Modeled — lower is better; concentration of commits in few maintainers. Contributors graph

Measured history

Project metrics

Weekly GitHub totals with 30, 90, and 180 day views.

Weekly star gains

Jul 19, 2026

Current36

Previous73

Weekly star gains

20341-121
Full metrics details

GitHub GraphQL current stargazer cohort, reconstructed from starredAt events and totalCount retrieved in one stable pagination walk. GitHub does not expose historical unstar events, so this is not an exact ledger of past star counts.

180 observed daily rows. Missing days are not fabricated.

DateValue

Cumulative stars

Jul 19, 2026

Current71,975

Previous71,939

Cumulative total

71,97535,9880
Full metrics details

Running total of the GitHub GraphQL stargazer count over time (not weekly deltas), reconstructed from starredAt events and totalCount in one stable pagination walk. GitHub does not expose historical unstar events, so this is not an exact ledger of past star counts.

180 observed daily rows. Missing days are not fabricated.

DateValue

Issues opened

Jul 12, 2026

Current1

Previous2

Weekly total

1050
Full metrics details

GitHub API observation. Historical values render only when the source provides a real observation for that day.

178 observed daily rows. Missing days are not fabricated.

DateValue

Issues closed

Jul 12, 2026

Current1

Previous1

Weekly total

1050
Full metrics details

GitHub Search issue totals queried for exact UTC days; rolling values are sums of proven daily counts.

178 observed daily rows. Missing days are not fabricated.

DateValue

Pull requests opened

Jul 12, 2026

Current8

Previous13

Weekly total

1370
Full metrics details

GitHub API observation. Historical values render only when the source provides a real observation for that day.

178 observed daily rows. Missing days are not fabricated.

DateValue

Pull requests closed

Jul 12, 2026

Current8

Previous13

Weekly total

1370
Full metrics details

GitHub Search pull-request totals queried for exact UTC days; rolling values are sums of proven daily counts.

178 observed daily rows. Missing days are not fabricated.

DateValue

Pull requests merged

Jul 12, 2026

Current0

Previous0

Weekly total

210
Full metrics details

GitHub API observation. Historical values render only when the source provides a real observation for that day.

178 observed daily rows. Missing days are not fabricated.

DateValue

Issue close ratio (daily)

Jul 13, 2026

Current0.00

Previous1.00

Daily ratio — a gap means nothing was opened that day

How this works: each day's value is issues closed that day ÷ issues opened that day. Days when nothing was opened render as gaps — never a rolling average or a made-up zero. Values above 1 mean the project closed more issues than arrived that day.

1.500.750.00
Full metrics details

GitHub Search issue totals queried for exact UTC days; rolling values are sums of proven daily counts.

35 observed daily rows. Missing days are not fabricated.

Per-day formula: issues closed that day ÷ issues opened that day; blank when nothing was opened (a gap, not a zero).

DateIssues openedIssues closedStored score

Pull request close ratio (daily)

Jul 16, 2026

Current0.00

Previous0.33

Daily ratio — a gap means nothing was opened that day

How this works: each day's value is pull requests closed that day ÷ pull requests opened that day. Days when nothing was opened render as gaps — never a rolling average or a made-up zero. Values above 1 mean the project closed more pull requests than arrived that day.

3.001.500.00
Full metrics details

GitHub Search pull-request totals queried for exact UTC days; rolling values are sums of proven daily counts.

71 observed daily rows. Missing days are not fabricated.

Per-day formula: pull requests closed that day ÷ pull requests opened that day; blank when nothing was opened (a gap, not a zero).

DatePRs openedPRs closedStored score

Releases

Jul 19, 2026

Current0

Previous0

Weekly total

110
Full metrics details

GitHub release published_at events bucketed by UTC day; drafts are excluded.

180 observed daily rows. Missing days are not fabricated.

DateValue

Project Overview

Introduction

Flask is a lightweight Python WSGI framework from the Pallets project, created on April 6, 2010, and released under the BSD-3-Clause license. You get a small core that is fast to learn, then you choose how much structure to add as your codebase grows. That design is why Flask is still a practical option when you need to move from a prototype to a production service without rewriting everything.

You can use Flask for REST APIs, internal tooling, dashboard-style web apps, webhook receivers, and thin orchestration layers in front of existing systems. If your team wants explicit control over routing, request handling, configuration, and dependency choices, Flask gives you that control without forcing a fixed project template.

As of February 22, 2026, the repository metrics in your data show 71,252 stars and 16,725 forks. Over the last 90 days (November 24, 2025 to February 22, 2026), stars increased by 614. Over the last ~6 months, stars increased by 3,095. That is a steady growth signal rather than a stagnant maintenance pattern.

Key Challenges You Can Address

Flask is useful when you need to solve common backend problems without adopting a large, opinionated stack first.

  • You can ship a small service quickly because the core API surface is compact: route declaration, request parsing, response creation, and template rendering.
  • You can avoid lock-in to one ORM, one background queue, or one auth strategy, because Flask does not enforce those choices.
  • You can keep architectural boundaries explicit, which matters when your team splits a monolith into service-oriented components over time.
  • You can test request handlers with minimal overhead and isolate failures in route-level units.
  • You can run small apps with very low operational complexity and still keep a path to larger deployments behind a production WSGI server.

You may find this especially valuable if your team has mixed requirements across services. One service might stay simple and only return JSON, while another needs server-rendered pages and session management. Flask lets you keep both under one familiar programming model instead of forcing an all-or-nothing framework migration.

Features and Use Cases

Flask centers on practical primitives, and each primitive maps to a concrete engineering workflow.

  • Routing with decorators gives you readable endpoint definitions close to business logic.
  • Request and response objects let you handle headers, query params, bodies, cookies, and status codes directly.
  • Built-in development server and CLI support let you iterate quickly in local environments.
  • Template rendering works well for server-side HTML when your team prefers thin frontend stacks.
  • Blueprints give you modular boundaries for larger apps.
  • Config objects and environment-based settings help you separate local, staging, and production behavior.

A minimal API endpoint can stay extremely small:

from flask import Flask, jsonify

app = Flask(__name__)

@app.get("/health")
def health_check():
    return jsonify(status="ok"), 200

That simplicity helps when you are building operational endpoints such as /health, /ready, or /metrics-proxy and you want clean behavior with little indirection.

For internal tooling, you can use Flask to build administrative UIs backed by existing databases or APIs. You keep business rules in Python and render forms or tables server-side, which can reduce frontend complexity for teams that do not need a full SPA architecture. For API gateways or orchestration layers, Flask can sit in front of downstream services, normalize request formats, and enforce authentication or rate-limiting policies through middleware-style hooks.

Flask is also practical when your team needs gradual modernization. You can start with one service, define reusable patterns for logging, validation, and error handling, then replicate those patterns across additional services. Because Flask does not hide HTTP concepts behind heavy abstractions, debugging production behavior is usually straightforward: you inspect the incoming request, the route function, and the response path.

You can structure larger applications with an app factory and blueprints:

from flask import Flask, Blueprint

api = Blueprint("api", __name__)

@api.get("/v1/ping")
def ping():
    return {"message": "pong"}

def create_app() -> Flask:
    app = Flask(__name__)
    app.register_blueprint(api)
    return app

This pattern helps your team isolate features, keep import boundaries clean, and inject environment-specific configuration during app creation. If your team uses CI pipelines, factory-based initialization also simplifies integration tests because you can instantiate app variants with test settings.

For SEO and accessibility-sensitive web pages, Flask can render semantic HTML from templates while your team controls caching headers, compression setup in the serving layer, and structured metadata generation. You can generate JSON-LD payloads in routes and render them into templates, ensuring search engines receive explicit structured data while screen readers still get fully semantic markup.

When you need speed in both development and runtime behavior, Flask offers a balanced path: low ceremony for small endpoints, and enough extension points for larger systems that need authentication, persistence, and observability.

Ecosystem and Dependencies

Flask began as a wrapper around Werkzeug and Jinja, and you still benefit from that separation of concerns.

Werkzeug handles core WSGI and HTTP utilities, including request/response abstractions and routing internals. Jinja gives you a mature templating engine for server-rendered pages. That split keeps the core understandable: HTTP mechanics in one layer, presentation templating in another.

You can build around Flask with community extensions, but you are not required to accept a monolithic extension bundle. In practice, that means your team can choose only what it needs for authentication, database integration, migrations, or background job integration. If an extension no longer fits, replacing it is usually less disruptive than in frameworks where major subsystems are tightly coupled.

Community resources are strong and easy to navigate. The official documentation is extensive, the changelog is detailed, and the repository issue tracker is active with current issue and PR movement in your metrics data. If your team values transparent maintenance signals, that documentation and issue hygiene reduce adoption risk.

Architectural Overview

Flask uses a WSGI-centered architecture. You define an application object, register route handlers, and return response data directly from Python functions. Request data enters through WSGI, Flask maps the URL and HTTP method to a view function, and the return value is converted into a response object.

A typical request lifecycle looks like this:

  1. A WSGI server receives an HTTP request and forwards it to your Flask app.
  2. Flask matches the route and method, then prepares request context objects.
  3. Your handler executes business logic and returns data, a tuple, or a response object.
  4. Flask finalizes headers and status code, then returns the response to the WSGI server.

You can insert hooks before and after requests to handle logging, timing, security checks, and transaction boundaries. You can also register error handlers to ensure consistent JSON or HTML error responses across endpoints.

Blueprints give you a modular architecture layer that scales better than a single-file app. You can group routes by bounded context such as billing, reporting, or identity, then register each blueprint in the app factory. Your team gets a cleaner dependency graph and fewer import cycles.

Flask can serve multiple styles in one codebase:

  • API-first services returning JSON.
  • Server-rendered pages for operational dashboards.
  • Hybrid apps where templates and API endpoints coexist.

If you need asynchronous workloads or real-time sockets, you can still use Flask at the edge and delegate async-heavy components to separate services. That separation keeps your Flask service focused on request orchestration and stable HTTP behavior.

Development Activity and Maintenance Signals

Your metrics provide a concrete maintenance snapshot as of February 22, 2026.

  • 90-day stars moved from 70,638 to 71,252 (+614).
  • ~6-month stars moved from 68,157 to 71,252 (+3,095).
  • 90-day forks moved from 16,708 to 16,725 (+17).
  • Latest weekly issues opened/closed: 4/4.
  • Latest weekly pull requests opened/merged: 10/2.
  • Releases in the last 30 days: 0.

You can interpret this as a mature project with steady inbound interest and ongoing repository activity, not a fast-churning release train. The absence of a release in the last 30 days is not automatically a risk for a stable framework; it often means maintainers are batching changes or operating on a cadence that favors compatibility.

You also have historical metadata showing the repository was updated on January 24, 2024 in the provided snapshot, with the latest push on January 23, 2024 and a low open-issue count in that snapshot. Combined with current 2026 issue and PR flow, you get a picture of active stewardship rather than abandonment.

Pros and Cons

Pros

If you want precise control over architecture, Flask gives you flexibility without forcing early commitments. You can start with a minimal app and only add modules that your team actually needs. That lowers complexity in the first sprint and avoids carrying unused subsystems in production.

You can keep debugging time low because request handling stays explicit. Route function signatures are simple, and HTTP details are visible instead of deeply abstracted. In production incidents, this can reduce mean time to resolution because your team can trace request-to-response flow quickly.

Flask also works well for mixed workloads. You can keep a JSON API and a server-rendered admin interface in one service when that topology reduces deployment overhead. Blueprint-based composition gives you enough structure for larger codebases without moving to a framework that prescribes every architectural decision.

The ecosystem is another practical advantage. You can adopt extensions incrementally and switch components with less friction than tightly coupled stacks. That makes Flask a strong fit when your requirements evolve faster than your platform standards.

Cons

You must define more conventions yourself. If your team is new to web architecture, the lack of enforced structure can lead to inconsistent folder layouts, duplicated patterns, and drift in error handling standards across services.

You also need to be deliberate about non-functional concerns. Authentication, authorization, schema validation, and database patterns are not fully standardized by default. You can solve each concern cleanly, but your team needs discipline and technical leadership to keep those solutions coherent.

For API-first organizations that want automatic schema generation and strict typed request models from day one, Flask may require more custom wiring than frameworks built around typed contracts. You can implement equivalent behavior, but you spend engineering time assembling and documenting your approach.

At high organizational scale, onboarding can be slower if each Flask service uses different extension choices. Without internal templates or platform guardrails, service-to-service consistency becomes an operational challenge.

Comparison and Alternatives

If you are comparing Flask to other Python web frameworks, you usually care about six dimensions: startup speed, runtime model, built-in components, typing ergonomics, architectural flexibility, and long-term maintainability. Flask remains strong when you want explicit HTTP control and incremental architecture. The alternatives below each optimize a different default.

Django

You can pick Django when you want an integrated framework with ORM, admin interface, authentication primitives, migrations, and a strong convention set out of the box. Compared with Flask, this reduces assembly work for teams that prefer a cohesive, batteries-included platform.

You may deliver faster in domains that benefit from built-in models and admin tooling, such as content-heavy systems and CRUD-centric internal platforms. In exchange, you accept a larger abstraction surface and stricter framework patterns. Flask gives you more freedom at the cost of building more conventions yourself.

For long-lived products with many contributors, Django can improve consistency because architectural decisions are already encoded in framework defaults. If your team needs deep customization around non-standard data flows or lightweight service boundaries, Flask often feels less rigid.

FastAPI

FastAPI is a strong choice when you want API-first development with type hints, automatic validation, and generated OpenAPI documentation. You can move quickly on contract-driven APIs because endpoint types directly define request parsing and response schemas.

Compared with Flask, you usually write less custom validation and documentation plumbing. If your team relies heavily on client SDK generation, strict schemas, and async-first handlers, FastAPI gives you that behavior as a default instead of an add-on.

Flask still wins where you need a minimal core that blends HTML rendering, classic WSGI deployment, and selective extension usage without committing to a typed API framework model. For pure API programs with strong typing requirements, FastAPI often reduces platform effort.

Bottle

You can choose Bottle when you want extreme minimalism, including a single-file framework and very small dependency footprint. It is useful for tiny services, embedded tools, or constrained deployments where simplicity is the highest priority.

Against Flask, Bottle can feel even lighter, but you get a smaller ecosystem and fewer standardized patterns for larger application growth. Flask gives you a broader middle ground: still lightweight, but with more common team conventions and wider extension support.

If your service is expected to remain very small, Bottle can be enough. If your roadmap includes modular growth, multiple contributors, and stricter operational controls, Flask usually provides a smoother scaling path.

Pyramid

Pyramid targets flexibility across both small and large applications with explicit configuration and composable components. You can apply it when you want fine-grained control and a framework philosophy that supports many architectural styles.

Compared with Flask, Pyramid may give you stronger configuration patterns in complex deployments, especially if your team prefers declarative setup and deep framework customization. Flask tends to feel more straightforward for teams that want quick route-to-function development with minimal ceremony.

You might prefer Pyramid for sophisticated enterprise-style applications that demand layered configuration and explicit traversal/routing choices. Flask remains easier to onboard for teams that prioritize readability and short feedback loops.

Tornado

Tornado combines a web framework with an asynchronous networking library designed for long-lived connections. You can use it for workloads like WebSockets, streaming, and systems that keep many concurrent connections open.

Compared with Flask, Tornado has a different operational center of gravity. Flask is typically simpler when your core workload is request/response APIs or server-rendered pages behind standard WSGI deployment. Tornado is stronger when connection lifecycle and async network behavior are primary concerns.

If your team does not need persistent connection patterns, Flask is often faster to standardize and maintain. If your product requires high-concurrency real-time channels at the application layer, Tornado can reduce infrastructure complexity.

Falcon

Falcon is focused on API and microservice workloads with a minimalist, performance-oriented design. You can use it when you want explicit HTTP handling with very little framework overhead and a narrow focus on backend APIs.

Relative to Flask, Falcon may feel lower-level and more specialized. Flask gives you a broader general-purpose experience that can serve both APIs and templated pages with less context switching. Falcon is strong when you want tight control for API-only services.

If your platform standard prioritizes developer ergonomics across varied workloads, Flask is usually easier to adopt widely. If your environment is API-only and you want a stripped-down, HTTP-centric framework model, Falcon is a strong option.

FastAPI stands out as the best overall alternative in most situations when you want a modern Python API stack with typed contracts, automatic schema generation, and strong performance defaults.

Conclusion.

Flask remains a practical framework when you want a lightweight Python web foundation with explicit control over architecture and dependencies. You can start quickly, scale by adding structure only where needed, and keep operational behavior understandable across API and server-rendered workloads.

For official resources, the Flask documentation gives you core concepts and deployment guidance, the changelog tracks version-level behavior changes, the PyPI release page shows package distribution details, and the source repository plus issue tracker show ongoing maintenance and discussion. If your team wants synchronous community support, the Pallets Discord is active.

Join the conversation

Reviews · Questions · Posts

Share what you know about flask — write a review from your real experience, ask an implementation question, or publish a post about how you use it.

Share your experience

Write or update your review

Explain what worked, what broke down, and what another team should know before adopting flask.

Write your review now — it saves locally and publishes automatically after you sign in.

Rating
Positive attributes
Negative attributes

Project Q&A

Questions and answers

Browse implementation threads tied directly to pallets/flask. Each question links through to the full answer page.

Q&A No threads yet

Be the first to ask how teams run flask in production. Every question you post becomes a durable, searchable answer page other developers can find.

Ask the first question

Related posts

Posts tagged with the same topics

These posts come from the same topic surface as this repo, so readers can move from project evaluation into practical writeups and migration notes without leaving context.

Posts No topic-linked posts yet

Share how your team uses flask — a migration note, an architecture writeup, or a comparison. Your post reaches everyone browsing these same topics.

Write the first post
Get a weekly email with the hottest new projects in the Framework Infrastructure and Core Web Frameworks world.
No Spam. Unsubscribe easily at any time.

Copyright 2018-2026 Awesome Open Source.  All rights reserved.