# Sentry For Game Developers

Real-time crash reporting for real gameplay across all platforms, including any game engine on any console, PC, or mobile device. See the right context on crashes and errors across your development and retail builds, so you can fix issues before they bring down the player experience.

[Try Sentry For Free](https://sentry.io/signup/)[Get a Demo](https://sentry.io/demo/)

### works with

[Unity](https://sentry.io/for/unity/)[Unreal](https://docs.sentry.io/platforms/unreal/)[GoDot](https://docs.sentry.io/platforms/godot/)[Xbox](https://docs.sentry.io/platforms/xbox/)[PS5](https://docs.sentry.io/platforms/playstation/)[Switch](https://docs.sentry.io/platforms/nintendo-switch/)[iOS](https://docs.sentry.io/platforms/apple/guides/ios/)[Windows](https://docs.sentry.io/platforms/native/)[Mac](https://docs.sentry.io/platforms/native/)[Rust](https://docs.sentry.io/platforms/rust/)[Linux](https://docs.sentry.io/platforms/native/)[C](https://docs.sentry.io/platforms/native/)[C++](https://docs.sentry.io/platforms/native/)[Objective-C](https://docs.sentry.io/clients/cocoa/)[Objective-C++](https://docs.sentry.io/clients/cocoa/)[WebGL](https://docs.sentry.io/platforms/unity/)[Crashpad](https://docs.sentry.io/platforms/minidump/crashpad/)[Breakpad](https://docs.sentry.io/platforms/minidump/breakpad/)[Meta Quest](https://docs.sentry.io/platforms/android/)[Vision Pro](https://docs.sentry.io/clients/cocoa/)

## Crash Reporting For Gaming Consoles

Crash reporting for Xbox, PlayStation, and Nintendo Switch is now generally available in Sentry, all tightly integrated with the Sentry Unreal, Unity, and Native SDKs. That means you see fatal and non-fatal events (including native crashes) from devkits and retail devices in one place, with the same connected context you get from Sentry on other gaming platforms.

[Learn More](https://blog.sentry.io/error-monitoring-and-crash-reporting-for-gaming-consoles/)

Tolerated by 4 million developers

Riot logo

CcpGamesLogoDark logo

FacepunchStudiosLogo logo

AlderonGamesLogoDark logo

LinearLogo logo

Vercel logo

Disney logo

Github logo

Riot logo

CcpGamesLogoDark logo

FacepunchStudiosLogo logo

AlderonGamesLogoDark logo

LinearLogo logo

Vercel logo

Disney logo

Github logo

Real-time crash reporting

Game engine & console support

Better performing games and releases

## Real-time crash reporting

### Debug crashes and errors faster across all your builds

Your players know immediately when your game has a bug or crashes. So should you.

Sentry gives you a single, unified view of crashes across Unreal, Unity, Godot, and proprietary engines, on any platform including consoles.

[Learn about Error Monitoring](https://sentry.io/product/error-monitoring/)

### Set alerts and see every issue in one place

Triaging and investigating errors across your builds shouldn’t be an endless fetch quest.

Sentry groups similar error events into issues and alerts you to show how frequently a problem is happening and who it’s affecting.

Search and filter your issues by what’s most important and jump into the details to get context at a glance.

[Learn about Issues in Sentry](https://docs.sentry.io/product/issues/)

### Get stack traces, user and device configuration, and more

If your players experience an issue— from your game failing to instantiate specific objects to simply corrupted savegames — you need to know more than ‘it’s broken’.

Sentry gives you context on device type, orientation, battery level, GPU state, CPU info, and everything about the software and OS that your game is running on so you can reproduce the issue and fix it faster.

[Learn about Issue Details in Sentry](https://docs.sentry.io/product/issues/issue-details/)

### Attach screenshots, custom tags, and logs

When players report crashes during a boss fight, the stack trace doesn’t always explain what triggered it.

Sentry gives you screenshots, logs, device, and OS events as breadcrumbs leading up to crashes.

Including fine-grained information on game state in custom tags (like `playerHealth` or `activeWeapon)` or screenshots so you can speedrun your investigation.

[Learn about Breadcrumbs](https://docs.sentry.io/product/issues/issue-details/breadcrumbs/)

## Game engine & console support

### Unity

Capture C# exceptions, native crashes, and unhandled errors across Windows, macOS, Android, iOS, and consoles, from prototype to production—all with minimal overhead.

Get insights into both editor-time and runtime issues, track crash-free sessions, and surface bugs with full context, including device state, logs, and user breadcrumbs. It’s lightweight, powerful debugging, purpose-built for Unity.

[Learn about Sentry's Unity SDK](https://docs.sentry.io/platforms/unity/)

### Unreal Engine

Sentry’s Unreal Engine SDK is built for the demands of C++ debugging in high-performance, visually intensive games.

Capture native crashes, hard faults, and low-level errors across Windows, Linux, mobile, and consoles—plus game state, device info, and breadcrumbs—to keep cinematic game experiences running smoothly.

[Learn about Sentry's Unreal Engine SDK](https://docs.sentry.io/platforms/unreal/)

### Godot

Sentry is the first application monitoring tool to directly support Godot, with comprehensive crash reporting and error tracking built for your Godot projects giving you lightweight, powerful Godot debugging. Capture GDScript errors and native game crashes across Windows, Linux, and macOS to get visibility into Godot projects from local dev builds to live releases.

[Learn about Sentry's Godot SDK](https://docs.sentry.io/platforms/godot/)

### Console support

Sentry supports crash reporting for Nintendo Switch, PlayStation, and Xbox. Here's what you get:

  * **Readable stack traces **to quickly identify what went wrong

  * **Built-in symbol server** so you can** **upload your debug files directly to Sentry, as well as custom symbol server support.

  * **Tags and device context **like console model, build number, region, and device state

[LEARN ABOUT CONSOLE SUPPORT](https://blog.sentry.io/error-monitoring-and-crash-reporting-for-gaming-consoles)

## Better performing games and releases

### Get crash-free rate, user adoption, and new issues associated with releases

Pushing the latest release of your RTS game into the wild shouldn’t feel like a roll of the dice. Instead of wondering whether your users are going to complain, see version adoption, crash-free sessions, failure rate, and any new issues associated with the release.

Then use the context Sentry provides to prioritize the most impactful bugs affecting your players, and ensure overall stability improves with each update.

[Learn about Release Health](https://docs.sentry.io/product/releases/health/)

### Set metric alerts to understand game stability at a glance

Instead of wondering what the player experience looks like, see critical info on the quality and amount of user sessions across your player base.

Set metric alerts so you know the instant the player experience degrades and quickly see where updates introduced problems.

[Learn about Insights](https://docs.sentry.io/product/insights/)

### Pinpoint laggy code slowing your players down

Figuring out what, exactly, is making that one loading screen take forever doesn’t have to be a slog.

Use Sentry to identify errors and latency problems in your development and retail builds. Get a breakdown of requests and operations as they happen in your game to see the exact poor-performing API call making players ragequit or slow database query that tanks your loading screens.

[Learn about Tracing](https://sentry.io/product/tracing/)

### Go from issues to code fixes automatically with AI debugging

Not sure what’s at fault when your skill tree keeps glitching?

Seer, Sentry’s AI agent, identifies the root cause of problems with 94.5% accuracy, generates code fixes and can create pull requests in GitHub to resolve issues faster.

It’s AI that can help fix everything from AAA platformers to your pet project.

[Learn about Seer](https://sentry.io/product/seer/)

Sentry’s crash reporting capabilities were critical to our launch of VALORANT on Xbox Series and PS5 consoles. Building a custom crash collection solution to support all our target platforms at Riot scale would be extremely complicated. Sentry solves that problem, allowing us to focus on making better games for our players.

Daniele Giannetti

Riot Games Inc.

[Read More Riot Games Inc.  testimonial](https://blog.sentry.io/error-monitoring-and-crash-reporting-for-gaming-consoles/)

## More content for game developers

[### Using the Sentry Unity SDK for Error and Crash ReportingIt’s one thing to debug your game during development, but once your game is in production, visibility into errors and failures in real gameplay is har...](https://blog.sentry.io/sentry-unity-sdk-for-error-crash-reporting/)

[### PlayStation, Xbox, Switch, PC, or Mobile — wherever you’ve got bugs to crush, Sentry can helpWith more than 1,500 companies in the gaming industry—including , Epic Games, and even —using Sentry to monitor their products, we continue to expand...](https://blog.sentry.io/playstation-xbox-switch-pc-or-mobile-wherever-youve-got-bugs-to-crush-sentry/)

[### Fixing Elusive Unity ANRs: How Amanotes Used Sentry to Cut Errors by 50%In today’s mobile-first world, users expect apps to launch instantly and respond seamlessly. For game developers, maintaining that buttery-smooth expe...](https://blog.sentry.io/fixing-unity-anrs-with-sentry-amanotes/)

[### Fixing Elusive Unity ANRs: How Amanotes Used Sentry to Cut Errors by 50%In today’s mobile-first world, users expect apps to launch instantly and respond seamlessly. For game developers, maintaining that buttery-smooth expe...](https://blog.sentry.io/fixing-unity-anrs-with-sentry-amanotes/)

[### Using the Sentry Unity SDK for Error and Crash ReportingIt’s one thing to debug your game during development, but once your game is in production, visibility into errors and failures in real gameplay is har...](https://blog.sentry.io/sentry-unity-sdk-for-error-crash-reporting/)

[### PlayStation, Xbox, Switch, PC, or Mobile — wherever you’ve got bugs to crush, Sentry can helpWith more than 1,500 companies in the gaming industry—including , Epic Games, and even —using Sentry to monitor their products, we continue to expand...](https://blog.sentry.io/playstation-xbox-switch-pc-or-mobile-wherever-youve-got-bugs-to-crush-sentry/)

[### Fixing Elusive Unity ANRs: How Amanotes Used Sentry to Cut Errors by 50%In today’s mobile-first world, users expect apps to launch instantly and respond seamlessly. For game developers, maintaining that buttery-smooth expe...](https://blog.sentry.io/fixing-unity-anrs-with-sentry-amanotes/)

[### Fixing Elusive Unity ANRs: How Amanotes Used Sentry to Cut Errors by 50%In today’s mobile-first world, users expect apps to launch instantly and respond seamlessly. For game developers, maintaining that buttery-smooth expe...](https://blog.sentry.io/fixing-unity-anrs-with-sentry-amanotes/)

[### Using the Sentry Unity SDK for Error and Crash ReportingIt’s one thing to debug your game during development, but once your game is in production, visibility into errors and failures in real gameplay is har...](https://blog.sentry.io/sentry-unity-sdk-for-error-crash-reporting/)

[### PlayStation, Xbox, Switch, PC, or Mobile — wherever you’ve got bugs to crush, Sentry can helpWith more than 1,500 companies in the gaming industry—including , Epic Games, and even —using Sentry to monitor their products, we continue to expand...](https://blog.sentry.io/playstation-xbox-switch-pc-or-mobile-wherever-youve-got-bugs-to-crush-sentry/)

[### Fixing Elusive Unity ANRs: How Amanotes Used Sentry to Cut Errors by 50%In today’s mobile-first world, users expect apps to launch instantly and respond seamlessly. For game developers, maintaining that buttery-smooth expe...](https://blog.sentry.io/fixing-unity-anrs-with-sentry-amanotes/)

[### Fixing Elusive Unity ANRs: How Amanotes Used Sentry to Cut Errors by 50%In today’s mobile-first world, users expect apps to launch instantly and respond seamlessly. For game developers, maintaining that buttery-smooth expe...](https://blog.sentry.io/fixing-unity-anrs-with-sentry-amanotes/)

## Fix It

Get started with the only application monitoring platform that empowers developers to fix application problems without compromising on velocity.

[Try Sentry for Free](https://sentry.io/signup/)[Get a Demo](https://sentry.io/demo/)


# Work at Sentry, we have fun

But not too much. This is still work after all.

Go to Openings [ Internships and early careers ](https://sentry.io/careers/internships-and-early-careers/)

## We're Everywhere

Okay, not everywhere. But somewhere.

San Francisco, USA

Vienna, Austria

Toronto, Canada

## Browse our openings

38 open positions across all offices and all teams and all jobs

Filter by locationAll locationsAmsterdam, NetherlandsSan Francisco, CaliforniaToronto, Ontario, CanadaVienna, AustriaSydney, AustraliaNew York City, New York

Filter by teamsAll teamsSales SupportEngineering Marketing G&AProduct DesignCustomer Success

Filter by job typeAll job typesInternshipsNew Grads

Reset

TitleLocation

### Sales

  * [Corporate Account ExecutiveAmsterdam, Netherlands ](https://sentry.io/careers/856ab77a-4583-41f5-ac08-4f274c40caee)

### Support

  * [Developer Support Engineer (Agentic Ops & AI)San Francisco, California ](https://sentry.io/careers/0580bfa2-ee00-41c9-94b8-df3d3b4e7fcc)
  * [Manager, Technical SupportToronto, Ontario, Canada ](https://sentry.io/careers/9101bc55-dca4-4f55-a20b-f3b812806d6c)
  * [Support EngineerVienna, Austria ](https://sentry.io/careers/a4d82b16-50bc-427d-86ff-5967bbdeb292)

### Engineering

  * [Engineering Manager, Event StreamingToronto, Ontario, Canada ](https://sentry.io/careers/0485d7bf-fea3-482d-87ee-3492ac1e3e54)
  * [Engineering Manager, Event StreamingSan Francisco, California ](https://sentry.io/careers/d9b380fd-1e61-4f3b-844d-5a321a364548)
  * [Engineering Manager, Issue WorkflowSan Francisco, California ](https://sentry.io/careers/ec9315af-c49b-4d44-b042-500f72c58438)
  * [Head of Technical Program ManagementSan Francisco, California ](https://sentry.io/careers/c6e2bab1-f69a-4ebc-b6fc-93c69203d931)
  * [Senior Software Engineer, AISan Francisco, California ](https://sentry.io/careers/6eb8d5f2-977e-4ff4-bdbe-fccb8747b5d7)
  * [Senior Software Engineer, AI EvalsSan Francisco, California ](https://sentry.io/careers/95d2eeab-291d-40ad-97a2-86b104f3c7ad)
  * [Senior Software Engineer, Analytics PlatformSan Francisco, California ](https://sentry.io/careers/275fb8ba-073f-425a-9519-ff4437cdca47)
  * [Senior Software Engineer (Android), SDKVienna, Austria ](https://sentry.io/careers/1b4f22c1-3c14-4a47-86aa-fa53a2dee4e7)
  * [Senior Software Engineer (Android), SDKToronto, Ontario, Canada ](https://sentry.io/careers/7235ebae-9c4c-4295-a98f-3fbd9c60953c)
  * [Senior Software Engineer (C/C++), SDKVienna, Austria ](https://sentry.io/careers/7418a0e2-3aa5-4564-be06-9565304814d0)
  * [Senior Software Engineer (iOS), SDKVienna, Austria ](https://sentry.io/careers/fd2082fa-556c-4c7a-97d9-df21f204eeb2)
  * [Senior Software Engineer (iOS), SDKToronto, Ontario, Canada ](https://sentry.io/careers/d2950ee2-8c00-4e1a-bbdb-f717e32de8c6)
  * [Senior Software Engineer, Streaming PlatformSan Francisco, California ](https://sentry.io/careers/725e606d-3299-4aea-a120-d202ffbdc1aa)
  * [Senior Staff Software Engineer, PlatformSan Francisco, California ](https://sentry.io/careers/0850626a-bf08-4c9f-8733-62159b19b0aa)
  * [Software Engineer, IngestVienna, Austria ](https://sentry.io/careers/f129ac00-0d67-43e2-9726-70ae262f5320)
  * [Staff Machine Learning Engineer, AISan Francisco, California ](https://sentry.io/careers/81f09568-da7d-4ed1-8283-614f846c9b00)
  * [Staff Software Engineer, BillingSan Francisco, California ](https://sentry.io/careers/a7c8d934-e638-44b0-bcf6-6897118706fe)
  * [Staff Software Engineer, BillingToronto, Ontario, Canada ](https://sentry.io/careers/0f213e89-d2c5-466f-8b7b-8468eecd1ffc)
  * [Staff Software Engineer, Issue WorkflowSan Francisco, California ](https://sentry.io/careers/c3ed6481-f031-4fe9-a456-775b7b3d2eda)
  * [Staff Software Engineer, Issue WorkflowToronto, Ontario, Canada ](https://sentry.io/careers/68757804-a892-40ed-8ea7-f2d13500f29c)

### Marketing

  * [Enterprise Marketing ManagerSan Francisco, California ](https://sentry.io/careers/d96096f1-f662-4581-8706-2f088bc43211)
  * [Lead Product Marketing Manager, AISan Francisco, California ](https://sentry.io/careers/4298636a-5ef4-4162-adb6-3e52b6f52339)
  * [Senior Developer Experience EngineerSan Francisco, California ](https://sentry.io/careers/7ed2b263-3873-44c6-a730-2ca96100c58f)
  * [Senior Event Marketing ManagerSan Francisco, California ](https://sentry.io/careers/c3ac7bd7-cd17-4cd2-a0be-0ce4517821b2)

### G&A

  * [Executive AssistantSan Francisco, California ](https://sentry.io/careers/dc69dc7e-2ab8-4982-89c9-9ff44ba9db82)
  * [Senior Data ScientistSan Francisco, California ](https://sentry.io/careers/f1db0bd3-d3bc-4e40-b0ae-c22270f2bc3c)

### Product Design

  * [Senior Product DesignerSan Francisco, California ](https://sentry.io/careers/33fa0a52-0af7-4d90-8ad4-a87f47e7e5e2)
  * [Senior Product Designer, Design SystemsSan Francisco, California ](https://sentry.io/careers/7dd36fef-d2a5-4c18-8425-dc6d2073ded4)

### Customer Success

  * [Senior Solutions Engineer Sydney, Australia ](https://sentry.io/careers/c8bb97ce-c9df-4208-8f0a-03ce0e52cc23)
  * [Solutions EngineerSan Francisco, California ](https://sentry.io/careers/9889cf59-cd32-4aff-bff7-645bb1be4e14)
  * [Solutions Engineer, EnterpriseNew York City, New York ](https://sentry.io/careers/4bfc29c8-4965-4f53-a09c-ef05aaa61c01)
  * [Solutions Engineer, Enterprise San Francisco, California ](https://sentry.io/careers/2cdc2ba7-8406-452a-b84f-d94d8e7a09bb)
  * [Technical Customer Success Manager San Francisco, California ](https://sentry.io/careers/c736c27c-406d-43eb-8f88-bc7defb7ff32)
  * [Technical Enablement DirectorSan Francisco, California ](https://sentry.io/careers/ee7542d4-f478-4aa0-8da9-3583845d8269)

## Our values

Pixels matter

We understand that the difference between a good product and a great one is in the finer details. We take extra care to get everything right, down to the last pixel.

For every developer

Sentry is a tool for everyone who codes. We strive to create a product that's accessible (and indispensable) to developers at any level, at companies big, small, and everything beyond and in between.

Feedback is priceless

White lies help no one. We give each other constructive, respectful, and sincere feedback for the best collective outcome and most personal growth. (On our work, that is. We'll keep opinions on your floral-patterned pants to ourselves.)

Work in progress

We know that we don't know everything. Nothing here is set in stone. We're still filling roles and writing rules, as a team. In the meantime, we embrace individual ownership, autonomy, and accountability.

Step by step

We don't expect to get things right the first time around. We do our best work by iterating: making small changes, measuring impact, and trying again (and again, and sometimes again).

Value people

We respect one another. We understand that success comes from a variety of backgrounds, experiences, skills, and opinions — not in spite of it. Even if we disagree on the route, we still push forward to the end.

## What’s so great about working at Sentry, anyway?

### Be more than just another cog

You're more like a sprocket, but with a fridge stocked with a minimum of six different brands of sparkling water. We're a relatively small and moderately fast-growing team, where every person influences the product, brand, culture, and snack closet. So we promise you'll never feel useless. Or hungry.

### Our product is good

We won't tell you that we're changing the world one bug at a time, because that'd be cheesy and a little weird. But our cloud-based error monitoring saves more than 1 million developers at over 150K organizations a lot of time and headaches. Not to mention, it helps developers find software bugs before they cause any trouble, keeping your everyday tech mostly glitch-free.

### Work is cool, benefits are cooler

We know that you have a life outside the office. Or at least we hope so. That's why we offer flexible PTO, commuter benefits, various savings plans, learning & development reimbursement, and health insurance, teeth insurance, eye insurance, life insurance, even more insurance. Insurance insurance. All the insurance you could ever dream of.

## How are we doing?

So well, even we're a bit surprised.

4M+ total users

790B+ events per month

150K+ customers

$217M in funding

## Don't Forget the Benefits and Perks

And no, we didn't count La Croix.

**Competitive Compensation + Equity**

We pay well. Because
you're worth it.

**401k Plan**

Retirement comes sooner
than you think. (US employees only)

**Medical, Dental, Vision Insurance**

Because you can never
be too prepared.

**Commuter Stipend**

You shouldn't have to pay to get to work.

**Professional Development Stipend**

Keep your skills sharp. You'll
need them.

**Health & Wellness Benefits**

Stay healthy, stay happy, do
yoga or something.

**Charitable Matching Program**

You're a good person.
We like that.

**Flexible PTO**

You work, we pay. You take time off,
we still pay.

**Paid Parental Leave**

Get to know the new human
in your life.

Like what you see but don’t see a fit? [ It never hurts to try. ](mailto:jobs@sentry.io?subject=Work%20at%20Sentry)

Sentry is committed to providing equal employment opportunities to its employees and candidates for employment regardless of race, color, ancestry, religion, sex, national origin, sexual orientation, age, citizenship, marital status, disability, gender identity, veteran status, or other legally-protected characteristic. This commitment includes the provision of reasonable accommodations to employees and candidates for employment with physical or mental disabilities who require such accommodations in order to (a) perform the essential functions of their jobs, or (b) seek employment with Sentry. We strive to build a diverse team, with an inclusive culture where every teammate can thrive. Sentry is an open-source company because we believe that everyone, everywhere, should have the ability and tools to make great software. Software should be accessible. That starts with making our industry accessible.

If you need assistance or an accommodation due to a disability, you may contact us at [accommodations@sentry.io](mailto:accommodations@sentry.io).

Want to learn more about how Sentry handles applicant data? Get the details in our [Applicant Privacy Policy](https://sentry.io/careers/applicantprivacy/).


# Pricing plans for dev teams of all sizes

Monthly

Annual

Save with annual

## developer

For solo devs working on small projects

Free

$0

Limited to one user

  * One user

  * Error Monitoring and Tracing

  * Alerts and notifications via email

  * 10 custom dashboards

[start trial](https://sentry.io/signup?plan=am1_f&period=annual)

## team

Everything to monitor your application as it scales

$26/mo

$26/mo

When billed annually with default pre-paid data

Developer features +

  * Unlimited users

  * Third-party integrations

  * 20 custom dashboards

  * Seer: AI debugging agent (subscription required)

  * Additional events ([See pricing](https://docs.sentry.io/pricing/))

[start trial](https://sentry.io/signup/?trial&plan=am1_team_auf&period=annual)

## business

For teams that need more powerful debugging

$80/mo

$80/mo

When billed annually with default pre-paid data

Team features +

  * Insights (90 day lookback)

  * Unlimited custom dashboards

  * Unlimited metric alerts with anomaly detection

  * Advanced quota management

  * SAML + SCIM support ([See pricing](https://docs.sentry.io/pricing/))

[start trial](https://sentry.io/signup/?trial&plan=am1_business_auf&period=annual)

## enterprise

For organizations with advanced needs

Custom

$0

Let's talk and see how we can serve you best.

Business features +

  * Technical account manager

  * Dedicated customer support

[contact sales](https://sentry.io/demo)

[Get Started](https://sentry.io/signup/?trial)

## developer

For solo devs working on small projects

$0

$0

Limited to one user

  * One user

  * Error Monitoring and Tracing

  * Alerts and notifications via email

  * 10 custom dashboards

[start trial](https://sentry.io/signup?plan=am1_f&period=annual)

## team

Everything to monitor your application as it scales

$26/mo

$26/mo

When billed annually with default pre-paid data

Developer features +

  * Unlimited users

  * Third-party integrations

  * 20 custom dashboards

  * Seer: AI debugging agent (subscription required)

  * Additional events ([See pricing](https://docs.sentry.io/pricing/))

[start trial](https://sentry.io/signup/?trial&plan=am1_team_auf&period=annual)

## business

For teams that need more powerful debugging

$80/mo

$80/mo

When billed annually with default pre-paid data

Team features +

  * Insights (90 day lookback)

  * Unlimited custom dashboards

  * Unlimited metric alerts with anomaly detection

  * Advanced quota management

  * SAML + SCIM support ([See pricing](https://docs.sentry.io/pricing/))

[start trial](https://sentry.io/signup/?trial&plan=am1_business_auf&period=annual)

## enterprise

For organizations with advanced needs

$0

$0

Let's talk and see how we can serve you best.

Business features +

  * Technical account manager

  * Dedicated customer support

[contact sales](https://sentry.io/demo)

[Get Started](https://sentry.io/signup/?trial)

## A closer look at each plan

developer

team

business

enterprise

#### monitoring & troubleshooting

#### Users

1 User

Unlimited

Unlimited

Unlimited

#### Projects

Unlimited

Unlimited

Unlimited

Unlimited

#### [Error Monitoring](https://sentry.io/product/error-monitoring/)

5k errors

50k errors

50k errors

Custom

#### [Logs](https://sentry.io/product/logs/)

5GB

+$0.50/GB additional

5GB

+$0.50/GB additional

5GB

+$0.50/GB additional

Custom

#### [Tracing](https://sentry.io/product/tracing/)

5M spans

5M spans

5M spans

Custom

#### [Session Replay](https://sentry.io/product/session-replay/)

50 replays

50 replays

50 replays

Custom

#### [Uptime Monitoring](https://sentry.io/product/uptime-monitoring/)

1 uptime monitor

+$1.00/uptime alert additional

1 uptime monitor

+$1.00/uptime alert additional

1 uptime monitor

+$1.00/uptime alert additional

Custom

#### [Cron Monitoring](https://sentry.io/product/cron-monitoring/)

1 cron monitor

+$0.78/monitor additional

1 cron monitor

+$0.78/monitor additional

1 cron monitor

+$0.78/monitor additional

Custom

#### UI Profiling

Pay-as-you-go required

+$0.25/hr

Pay-as-you-go required

+$0.25/hr

Custom

#### Continuous Profiling

Pay-as-you-go required

+$0.0315/hr

Pay-as-you-go required

+$0.0315/hr

Custom

#### [Attachments](https://docs.sentry.io/platforms/javascript/enriching-events/attachments/)

1GB

1GB

1GB

Custom

#### [User Feedback](https://docs.sentry.io/product/user-feedback/)

#### [Size Analysis](https://docs.sentry.io/product/size-analysis/)

100 builds

100 builds

100 builds

Custom

#### Seer: AI Debugger (at additional cost)

#### Root Cause Analysis

#### Fix Generation

#### Error Prediction and Code Review

#### workflow & alerts

#### [Ownership Rules](https://docs.sentry.io/product/issues/ownership-rules/)

#### [Code Owners](https://docs.sentry.io/product/issues/ownership-rules/#code-owners)

#### [Suspect Commits](https://docs.sentry.io/product/issues/suspect-commits/)

#### [Issue alerts and notifications via email](https://docs.sentry.io/product/alerts/create-alerts/issue-alert-config/)

#### [Issue alerts and notifications via integrated tools](https://docs.sentry.io/product/alerts/create-alerts/issue-alert-config/)

#### [Metric alerts](https://docs.sentry.io/product/alerts/create-alerts/metric-alert-config/)

20

20

Unlimited

Unlimited

#### Anomaly Detection

#### reporting & search

#### [Release Health](https://docs.sentry.io/product/releases/health/)

#### [Custom tags](https://docs.sentry.io/platforms/javascript/enriching-events/tags/)

#### [Span metrics](https://docs.sentry.io/product/explore/trace-explorer/#span-metrics)

#### [Cross-project issues](https://sentry.io/features/cross-project-issues/)

#### [Custom dashboards](https://docs.sentry.io/product/dashboards/custom-dashboards/#create-dashboards-from-templates)

10

20

Unlimited

Unlimited

#### Application Insights

30-day lookback

30-day lookback

90-day lookback

90-day lookback

#### Agent monitoring

#### MCP monitoring

#### integrations

#### [API](https://docs.sentry.io/api/)

#### [Third-party integrations](https://sentry.io/integrations/)

#### Multi Org for GitHub

#### account & data management

#### Spend notifications

#### [Set maximum spend threshold](https://docs.sentry.io/pricing/#prepaid-reserved-capacity)

#### Data retention

30-day lookback

Up to 90-day lookback

Up to 90-day lookback & additional sampled retention

Custom

#### Inbound filtering

#### Advanced inbound filtering

#### admin & compliance

#### Authentication

#### SSO: Google Apps

#### SSO: GitHub Organizations

#### SSO: SAML2

#### SSO: SCIM

#### Manage PII

#### BAA

#### HIPAA Security

#### SOC2

#### ISO 27001

#### Data Residency

#### Relay

#### support

#### Community support via GitHub and Discord

#### Email support

#### Dedicated technical account manager

#### Premium customer success

## Enterprise

Let's talk and see how we can serve you best.

[Contact Sales](https://sentry.io/demo)

## Pay ahead, save money

Each of our plans comes with a defined quota, with the option to process additional events by setting a pay-as-you-go budget. You can also plan ahead and save 20% over the pay-as-you-go rates by reserving events. Either way, it's a classic volume discount: when you use more, you pay less.

Paid Plan Tierteambusiness

Payment FrequencyAnnualMonthly

Plan Base$26

Monthly errors for Error Monitoringⓘ

Errors are sent every time an SDK catches a bug. You can send them manually too, if you want.

+$0

50K100K300K500K1M3M5M10M15M20M25M30M35M40M45M50M

+$0

Monthly spans for Tracingⓘ

A span represents a single operation of work within a trace, making it easy to measure throughput and latency and debug issues across multiple systems.

+$0

5M10M20M50M100M200M300M400M500M600M700M800M900M1B2B3B4B5B6B7B8B9B10B

+$0

Monthly replays for Session Replayⓘ

A replay is a video-like reproduction of a user interaction including page visits, mouse movements, clicks, taps, and scrolls on a site, web app, or mobile app.

+$0

505K10K25K50K75K100K300K500K1M2M3M4M5M6M7M8M9M10M

+$0

Monthly attachments for Error Monitoringⓘ

Attachments are files attached to errors, such as minidumps.

+$0

1 GB25 GB50 GB75 GB100 GB200 GB300 GB400 GB500 GB600 GB700 GB800 GB900 GB1 TB

+$0

#### Seer: AI Debugging Agent

Get unlimited root cause analysis, automated fixes, and code review on connected repos.

Active Contributors:

+$0

$40/active contributor/month

Reserved Pricing$26/mo

Total annual cost: $312/yr

[Start Trial](https://sentry.io/signup/?trial)

#### Pay-as-you-go pricing

The following products can be purchased with your organization's pay-as-you-go budget:

  * Logs: $0.50/GB
  * Cron Monitoring: $0.78/monitor
  * Uptime Monitoring: $1.00/uptime alert
  * Continuous Profiling: $0.0315/hr
  * UI Profiling: $0.25/hr

#### How Seer Subscriptions Work

An "active contributor" is someone who opens at least 2 PRs in a month on any repo connected with Seer. The no. of active contributors will be charged at the end of each month's billing cycle.


# Uptime Monitoring

Detect and resolve outages faster with automated checks, real-time alerts, and integrated issue tracking——so you can fix downtime with all the context you need, without switching between tools.

[ Try Sentry for Free ](https://sentry.io/signup/) [ Get a Demo ](https://sentry.io/demo/)

## Website Monitoring for Developers

### Manage your Site Reliability Effortlessly

Catch any issues causing downtime - from DNS resolution problems to application errors - with HTTP tests on your designated site pages every minute.

[ Read the Docs ](https://docs.sentry.io/product/alerts/uptime-monitoring/)

### Full visibility into system health

Debug your downtime with insights on failed uptime checks alongside traces and related errors.

[ Read the Docs ](https://docs.sentry.io/product/issues/issue-details/uptime-issues/)

### Configure alerts

Customize uptime alerts to match the expected response codes for your website or API, and get instant notifications via Slack if any downtime is detected.

[ Read the Docs ](https://docs.sentry.io/product/alerts/uptime-monitoring/#notifications)

## Getting started with Sentry is simple

We support every technology (except the ones we don't).
Get started with just a few lines of code.

Android.NETGoSwiftJavaScriptPythonReactRubyNext.jsPHPLaravelASP.NET CoreSpring BootVueAngularSolidSvelteAstro

Just run this command to sign up for and install Sentry.

Copied!Click to Copy

    brew install getsentry/tools/sentry-wizard && sentry-wizard -i android

Install the **NuGet** package to add the Sentry dependency:

Copied!Click to Copy

    dotnet add package Sentry

Initialize the SDK as early as possible, like in the `Main` method in `Program.cs/Program.fs`:

Copied!Click to Copy

    using (SentrySdk.Init(o => {
      // Tells which project in Sentry to send events to:
      o.Dsn = "https://<key>@sentry.io/<project>";
      // When configuring for the first time, to see what the SDK is doing:
      o.Debug = true;
      // Set TracesSampleRate to 1.0 to capture 100% of transactions for Tracing.
      // We recommend adjusting this value in production.
      o.TracesSampleRate = 1.0; }))
      // App code goes here - Disposing will flush events out

Grab the [Sentry Go SDK](https://github.com/getsentry/sentry-go):

Copied!Click to Copy

    go get "github.com/getsentry/sentry-go"

Configuration should happen as early as possible in your application's lifecycle:

Copied!Click to Copy

    package main

    import (
        "log"
        "time"

        "github.com/getsentry/sentry-go"
    )

    func main() {
        err := sentry.Init(sentry.ClientOptions{
            Dsn: "https://<key>@sentry.io/<project>",
        EnableTracing: true,
            // Specify a fixed sample rate:
            // We recommend adjusting this value in production
            TracesSampleRate: 1.0,
            // Or provide a custom sample rate:
            TracesSampler: sentry.TracesSampler(func(ctx sentry.SamplingContext) float64 {
                // As an example, this does not send some
                // transactions to Sentry based on their name.
                if ctx.Span.Name == "GET /health" {
                    return 0.0

                return 1.0
            }),
        })
        if err != nil {
            log.Fatalf("sentry.Init: %s", err)
        // Flush buffered events before the program terminates.
        // Set the timeout to the maximum duration the program can afford to wait.
        defer sentry.Flush(2 * time.Second)

To integrate Sentry into your Xcode project, specify it in your `Podfile`, then run `pod install`:

Copied!Click to Copy

    platform :ios, '9.0'
    use_frameworks! # This is important

    target 'YourApp' do
      pod 'Sentry', :git => 'https://github.com/getsentry/sentry-cocoa.git', :tag => '<VERSION>'
    end

Initialize the SDK as soon as possible in your application lifecycle, such as in your AppDelegate `application:didFinishLaunchingWithOptions` method:

Copied!Click to Copy

    import Sentry // Make sure you import Sentry

    func application(_ application: UIApplication,
        didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

        SentrySDK.start { options in
            options.dsn = "https://<key>@sentry.io/<project>"
            options.debug = true // Enabled debug when first installing is always helpful
            // Example uniform sample rate: capture 100% of transactions for Tracing
            options.tracesSampleRate = 1.0

        return true

Grab the [Sentry JavaScript SDK](https://github.com/getsentry/sentry-javascript/):

Copied!Click to Copy

    <script src="https://browser.sentry-cdn.com/<VERSION>/bundle.min.js"></script>

Configure your DSN:

Copied!Click to Copy

    Sentry.init({ dsn: 'https://<key>@sentry.io/<project>',
      // This enables automatic instrumentation (highly recommended),
      // but is not necessary for purely manual usage
      // If you only want to use custom instrumentation:
      // * Remove the BrowserTracing integration
      // * add Sentry.addTracingExtensions() above your Sentry.init() call
      integrations: [Sentry.browserTracingIntegration()],

      // We recommend adjusting this value in production, or using tracesSampler
      // for finer control
      tracesSampleRate: 1.0,

      // Set tracePropagationTargets to control for which URLs distributed tracing should be enabled
      tracePropagationTargets: ['localhost', /^https://yourserver.io/api/],
    });

Grab the [Sentry Python SDK](https://github.com/getsentry/sentry-python):

Copied!Click to Copy

    pip install --upgrade sentry-sdk

Configure your DSN:

Copied!Click to Copy

    import sentry_sdk

    sentry_sdk.init(
        "https://<key>@sentry.io/<project>",

        # Set traces_sample_rate to 1.0 to capture 100%
        # of transactions for Tracing.
        # We recommend adjusting this value in production.
        enable_tracing=True,
        traces_sample_rate=1.0,
    )

Grab the [Sentry React SDK](https://github.com/getsentry/sentry-javascript/):

Copied!Click to Copy

    npm install @sentry/react

We recommend putting the Sentry initialization code into its own file and including that file as the first import in your application entry point as shown in the example below:

Copied!Click to Copy

    import { useEffect } from "react";
    import * as Sentry from "@sentry/react";

    Sentry.init({
      dsn: "https://examplePublicKey@o0.ingest.sentry.io/0",
      integrations: [
      ],
      // Set `tracePropagationTargets` to control for which URLs trace propagation should be enabled
      tracePropagationTargets: [/^\//, /^https:\/\/yourserver\.io\/api/],
    });

Include the Sentry initialization file as the first import statement:

Copied!Click to Copy

    // Sentry initialization should be imported first!
    import "./instrument";
    import App from "./App";
    import { createRoot } from "react-dom/client";

    const container = document.getElementById(“app”);
    const root = createRoot(container);
    root.render(<App />);

Add the `sentry-ruby` gem to your `Gemfile`:

Copied!Click to Copy

    gem "sentry-ruby"

Configure your DSN:

Copied!Click to Copy

    Sentry.init do |config|
      config.dsn = 'https://<key>@sentry.io/<project>'

      # Set a uniform sample rate between 0.0 and 1.0
      # We recommend adjusting the value in production:
      config.traces_sample_rate = 1.0

      # or control sampling dynamically
      config.traces_sampler = lambda do |sampling_context|
        # sampling_context[:transaction_context] contains the information about the transaction
        # sampling_context[:parent_sampled] contains the transaction's parent's sample decision
        true # return value can be a boolean or a float between 0.0 and 1.0
      end
    end

See -- it's really just one command.

Copied!Click to Copy

    npx @sentry/wizard@latest -i nextjs

Install the `sentry/sentry` package with Composer:

Copied!Click to Copy

    composer require sentry/sentry

To capture all errors, even the one during the startup of your application, you should initialize the Sentry PHP SDK as soon as possible.

Copied!Click to Copy

    \Sentry\init(['dsn' => 'https://<key>@sentry.io/<project>',
        // Specify a fixed sample rate:
        'traces_sample_rate' => 0.2,
        // Or provide a custom sampler:
        'traces_sampler' => function (SentryTracingSamplingContext $context): float {
            // return a number between 0 and 1
        }, ]);

Install the `sentry/sentry-laravel` package with Composer:

Copied!Click to Copy

    composer require sentry/sentry-laravel

Add Sentry reporting to `bootstrap/app.php`:

Copied!Click to Copy

    <?php

    use Illuminate\Foundation\Application;
    use Illuminate\Foundation\Configuration\Exceptions;
    use Illuminate\Foundation\Configuration\Middleware;
    use Sentry\Laravel\Integration;

    return Application::configure(basePath: dirname(__DIR__))
        ->withRouting(
            web: __DIR__.'/../routes/web.php',
            commands: __DIR__.'/../routes/console.php',
            health: '/up',
        )
        ->withMiddleware(function (Middleware $middleware) {
        })
        ->withExceptions(function (Exceptions $exceptions) {
            Integration::handles($exceptions);
        })->create();

Enable Sentry Tracing in `config/sentry.php`:

Copied!Click to Copy

    // Specify a fixed sample rate:
    'traces_sample_rate' => 0.2,
    // Or provide a custom sampler:
    'traces_sampler' => function (SentryTracingSamplingContext $context): float {
        // return a number between 0 and 1
    },

Run this `Artisan` command to configure the Sentry DSN:

Copied!Click to Copy

    php artisan sentry:publish --dsn=<paste-your-DSN-here>

Add the Sentry dependency:

Copied!Click to Copy

    dotnet add package Sentry.AspNetCore

Configure Sentry in `appsettings.json`.

Copied!Click to Copy

    "Sentry": {
      "Dsn": "https://examplePublicKey@o0.ingest.sentry.io/0",
      "Debug": true,
    },

Then add the SDK by simply calling `UseSentry`:

Copied!Click to Copy

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
                // Add the following line:
                webBuilder.UseSentry();
            });

Grab the [Sentry Java SDK](https://github.com/getsentry/sentry-java/):

Copied!Click to Copy

    <dependency>
      <groupId>io.sentry</groupId>
      <artifactId>sentry-spring-boot-starter</artifactId>
      <version><VERSION></version>
    </dependency>

Configure your DSN in `application.properties`:

Copied!Click to Copy

    sentry.dsn=https://<key>@sentry.io/<project>
    # Set traces_sample_rate to 1.0 to capture 100%
    # of transactions for performance monitoring.
    # We recommend adjusting this value in production.
    sentry.traces-sample-rate=1.0

Grab the [Sentry Vue SDK](https://github.com/getsentry/sentry-javascript/):

Copied!Click to Copy

    npm install @sentry/vue

Configure your DSN:

Copied!Click to Copy

    import { createApp } from "vue";
    import * as Sentry from "@sentry/vue";

    const app = createApp({
      // ...
    });

    Sentry.init({
      app,
      dsn: "https://<key>@sentry.io/<project>"",
      // This enables automatic instrumentation (highly recommended),
      // but is not necessary for purely manual usage
      // If you only want to use custom instrumentation:
      // * Remove the BrowserTracing integration
      // * add Sentry.addTracingExtensions() above your Sentry.init() call
      integrations: [Sentry.browserTracingIntegration()],

      // We recommend adjusting this value in production, or using tracesSampler
      // for finer control
      tracesSampleRate: 1.0,
      // Set tracePropagationTargets to control for which URLs distributed tracing should be enabled
      tracePropagationTargets: ['localhost', /^https://yourserver.io/api/],
    });

    app.mount("#app");

Get started with just one line of code:

Copied!Click to Copy

    npx @sentry/wizard@latest -i angular

To use the SDK, initialize Sentry in your Solid entry point index.jsx before you render your Solid app:

Copied!Click to Copy

    // index.jsx / index.tsx

    import * as Sentry from "@sentry/solid";
    import { useBeforeLeave, useLocation } from "@solidjs/router";
    import { render } from "solid-js/web";
    import App from "./app";

    // Initialize the Sentry SDK here
    Sentry.init({
      dsn: "__DSN__",
      integrations: [Sentry.browserTracingIntegration()],

      // Performance Monitoring
      tracesSampleRate: 1.0, //  Capture 100% of the transactions
      // Set 'tracePropagationTargets' to control for which URLs trace propagation should be enabled
      tracePropagationTargets: ["localhost", /^https:\/\/yourserver\.io\/api/],
    });

    const app = document.getElementById("app");

    if (!app) throw new Error("No #app element found in the DOM.");

    render(() => <App />, app)

To use the SDK, initialize Sentry in your Svelte entry point main.js before you bootstrap your Svelte app:

Copied!Click to Copy

    // main.js / main.ts

    import App from "./App.svelte";

    import * as Sentry from "@sentry/svelte";
    import { BrowserTracing } from "@sentry/tracing";

    // Initialize the Sentry SDK here
    Sentry.init({
      dsn: "__DSN__",
      release: "my-project-name@2.3.12",
      integrations: [new BrowserTracing()],

      // This enables automatic instrumentation (highly recommended),
      // but is not necessary for purely manual usage
      // If you only want to use custom instrumentation:
      // * Remove the BrowserTracing integration
      // * add Sentry.addTracingExtensions() above your Sentry.init() call
      integrations: [Sentry.browserTracingIntegration()],

      // We recommend adjusting this value in production, or using tracesSampler
      // for finer control
      tracesSampleRate: 1.0,

      // Set tracePropagationTargets to control for which URLs distributed tracing should be enabled
      tracePropagationTargets: ['localhost', /^https://yourserver.io/api/],
    });

    // Then bootstrap your Svelte app
    const app = new App({
      target: document.getElementById("app"),
    });

    export default app;

Just run this command to install and register Sentry's Astro integration.

Copied!Click to Copy

    npx astro add @sentry/astro

And add your DSN and project config to your `astro.config.mjs` file:

Copied!Click to Copy

    import { defineConfig } from "astro/config";
    import sentry from "@sentry/astro";

    export default defineConfig({
      integrations: [
        sentry({
          dsn: "__DSN__",
          sourceMapsUploadOptions: {
            project: "your-project-slug",
            authToken: process.env.SENTRY_AUTH_TOKEN,
          },
          tracesSampleRate: 1.0,
        }),
      ],
    });

That's it. Check out our [documentation](https://sentry.io/platforms) to ensure you have the latest instructions.

[ Create a Sentry Account ](https://sentry.io/signup/) [ See All Platforms ](https://sentry.io/platforms)

## FAQs

What features are available with Uptime Monitoring?

  * **Automated Health Checks: **Monitors URLs every minute, alerting on failures (non-200 status, timeouts, or DNS issues).

    * **Auto-configuration: **Detects and monitors the most common hostname in your error data if you don’t customize.

  * **Customizable alerts: **Set alerts for specific URLs with control over request details (method, headers, body).

  * **Uptime issue created: **Created when a downtime is detected, automatically resolved when back to a healthy state.

  * **Tracing integration: **Links uptime failures to distributed traces for faster debugging.

  * **Check history**: Review past uptime checks to track performance trends.

How much does Uptime Monitoring cost?

1 monitor is included in all Sentry plans. Additional monitors are $1/monitor/month. To purchase, increase your pay-as-you-go volume in subscription settings or learn more in [_docs_](https://docs.sentry.io/pricing/).

How do you set up Uptime Monitoring?

Uptime is [_automatically configured_](https://docs.sentry.io/product/alerts/uptime-monitoring/automatic-detection/) as a new alert for the most frequently encountered hostname in all URLs of your error data, ensuring continuous monitoring of your most critical hostname right out of the box.

You can also [_create uptime monitoring alerts_](https://docs.sentry.io/product/alerts/create-alerts/) for specific URLs. They're fully customizable with request details such as the HTTP method, headers, and body.

## Of course we have more content

[ ### Uptime Monitoring now in Open Beta Uptime Monitoring is now available in early access to help track your website's availability. It automatically detects and monitors your most critical... ](https://changelog.sentry.dev/changelog/uptime-monitoring-now-in-open-beta/)

[ ### Error Monitoring Resolve errors with max efficiency, not max effort. Get actionable insights to resolve issues with the ability to track, debug, and resolve errors acr... ](https://sentry.io/for/error-monitoring)

[ ### Everyone needs to know how to trace With Tracing, developers can get insight into the root cause of issues. Learn what everyone needs to know about tracing & how to get started here. ](https://blog.sentry.io/everyone-needs-to-know-how-to-trace/)

[ ### Uptime Monitoring Documentation Learn how to help maintain uptime for your web services by monitoring relevant URLs with Sentry's Uptime Monitoring. ](https://docs.sentry.io/product/alerts/uptime-monitoring/)

[ ### Cancel the (Issue) Noise At Sentry, we’ve been working on noise-reducing improvements to make your experience that much better. Learn more about our error grouping & alert upd... ](https://blog.sentry.io/cancel-the-issue-noise/)

[ ### Get Insights into backend infrastructure with Caches, Queues, Requests, & Queries View detailed insights into common backend building blocks, including caches, queues, queries & external requests with Insights. Learn how to get star... ](https://blog.sentry.io/backend-insights-with-caches-queues-requests-queries/)

## Get monthly product updates from Sentry

Sign up for our newsletter.

And yes, it really is monthly. Ok, maybe the occasional twice a month, but for sure not like one of those daily ones that you just tune out after a while.

Your Email:

I want to receive the monthly newsletter and other updates from Sentry. You may unsubscribe at any time.

By filling out this form, you agree to our [privacy policy](https://sentry.io/privacy/). This form is protected by reCAPTCHA and Google's [Privacy Policy](https://policies.google.com/privacy) and [Terms of Service](https://policies.google.com/terms) apply.

Subscribe

## Fix It

Get started with the only application monitoring platform that empowers developers to fix application problems without compromising on velocity.

[ Try Sentry for Free ](https://sentry.io/signup/) [ Get a Demo ](https://sentry.io/demo/)


# JavaScript Error and Performance Monitoring

Resolve JavaScript errors with max efficiency, not max effort. Get actionable insights to resolve JavaScript performance issues with the ability to track, debug, and resolve JavaScript errors across platforms.

[Try Sentry For Free](https://sentry.io/signup/)[See the docs](https://docs.sentry.io/platforms/javascript/)

## Getting Started is Simple

JavaScript

React

Next.js

Vue

Angular

Remix

Svelte

Electron

Ember

Astro

Nuxt

Grab the [Sentry JavaScript SDK](https://github.com/getsentry/sentry-javascript/):

Click to Copy

Click to Copy

    <script src="https://browser.sentry-cdn.com/10.46.0/bundle.min.js"></script>

Configure your DSN:

Click to Copy

Click to Copy

    Sentry.init({ dsn: 'https://<key>@sentry.io/<project>',
    // This enables automatic instrumentation (highly recommended),
      // but is not necessary for purely manual usage
      // If you only want to use custom instrumentation:
      // * Remove the BrowserTracing integration
      // * add Sentry.addTracingExtensions() above your Sentry.init() call
      integrations: [Sentry.browserTracingIntegration()],

      // We recommend adjusting this value in production, or using tracesSampler
      // for finer control
      tracesSampleRate: 1.0,

      // Set tracePropagationTargets to control for which URLs distributed tracing should be enabled
      tracePropagationTargets: ['localhost', /^https://yourserver.io/api/],
    });

Check our [documentation](https://docs.sentry.io/platforms/javascript/) for the latest instructions.

[See all platforms](https://sentry.io/platforms/)

### How to install the JavaScript SDK

### JavaScript Performance Monitoring

Quickly identify JavaScript [performance](https://sentry.io/for/performance/) issues before they become downtime. View the entire end-to-end distributed trace to see the exact, poor-performing API call and surface any related errors.

See a Sample Transaction

### JavaScript Error Monitoring with Complete Stack Traces

See the error and JavaScript stack trace previously only visible in your user’s debug console. Apply source maps automatically to convert minified, compiled, or transpiled code back to its original form. Keep your JavaScript source maps private by uploading them directly to Sentry.

See a Sample Stack Trace

### Issues, replayed

Get to the root cause of an error or latency issue faster with context like DOM events, console logs, and network calls within one visual replay on your web application.

[Check out Session Replay](https://sentry.io/for/session-replay/)

### Fill In the Blanks About JavaScript Errors

See what the app was doing when the JavaScript error occurred: user interactions with component names, AJAX requests, console log messages and more. When frontend errors happen, Sentry can prompt users for feedback so you can compare their experiences to the data.

Check out Breadcrumbs

### Understand Where Tests Could Prevent Your JavaScript Regressions

Quickly isolate Code Coverage for JavaScript bugs to see where testing could help fix the bug before release with our Codecov integration.

[Learn More About Codecov by Sentry](https://sentry.io/for/code-coverage)

“We were able to catch errors with Sentry before customers could report them or before they hit our support queue.”

### Debugging Any JavaScript Exception

Record environment and usage details so you can recreate bugs down to the browser version, OS, and query parameters specific to the session.

Sentry’s tag distribution graph also makes it easy to isolate and prioritize any JavaScript error by seeing how often it occurs in context.

Answer the most important questions: Was the bug browser or OS specific? Firefox or Safari?

### You can’t afford to put JavaScript monitoring on the backburner.

Even a one-second delay in loading results in a 7% reduction in conversions.

Forty percent of customers abandon a website that takes longer than three seconds to load.

The average cost of downtime is $5,600 per minute — or $300,000 per hour.

## FAQs

What is the difference between Sentry and traditional logging?

Traditional logging provides you with a trail of events. Some of those events are errors, but many times they’re simply informational. Sentry is fundamentally different because we focus on exceptions, or in other words, we capture application crashes. We discuss in more detail [here](https://sentry.io/vs/logging/) and on our [blog.](https://blog.sentry.io/lets-get-ready-to-monitor)

What frontend languages does Sentry support?

Sentry supports every major frontend language, framework, and library. You can browse each of them [here](https://sentry.io/platforms/).

How much does Sentry cost?

You can get started for free. Pricing depends on the number of monthly events, transactions, and attachments that you send Sentry. For more details, visit our [pricing page](https://sentry.io/pricing/).

How does Sentry impact the performance of my app?

Sentry doesn’t impact a web site’s performance.

If you look at the configuration options for when you initialize Sentry in your code, you’ll see there’s nothing regarding minimizing its impact on your app’s performance. This is because our team of SDK engineers already developed Sentry with this in mind.

Sentry is a listener/handler for errors that asynchronously sends out the error/event to Sentry.io. This is non-blocking. The error/event only goes out if this is an error.

Global handlers have almost no impact as well, as they are native APIs provided by the browsers.

## Supporting Resources

[Frontend Monitoring DocumentationRead](https://docs.sentry.io/product/sentry-basics/guides/integrate-frontend/)

[Eventbrite Customer StoryRead](https://sentry.io/customers/eventbrite/)

## A better experience for your users. An easier life for your developers.

[Try Sentry For Free](https://sentry.io/signup/)[Request a Demo](https://sentry.io/demo/)


# React Error and Performance Monitoring

Detect, understand, and fix errors and performance bottlenecks with clear, actionable debugging context for your React application—across components, state changes, and API requests.

[Try Sentry for Free](https://sentry.io/signup/)[Get a Demo](https://sentry.io/demo/)

Run this command to sign up for and install Sentry.

Click to Copy

Click to Copy

    npm install @sentry/react

## React monitoring for developers

### React error monitoring with complete stack traces

Get detailed stack traces and debugging context for every error.

  * Trace connected issues across components, state updates, and async operations.

  * See exactly what led up to an issue to debug hydration errors, navigation failures, layout shifts, and rage clicks.

### Trace every interaction across your React application

Powered by OpenTelemetry, Trace user interactions, slow component rendering, and API calls in a single trace without having to piece together logs or dashboards for debugging.

  * Track React hooks and effects causing performance degradation

  * Monitor page loads and redirects with [_TanStack_](https://docs.sentry.io/platforms/javascript/guides/react/features/tanstack-router/) or React Router integrations

  * [ _Redux_](https://docs.sentry.io/platforms/javascript/guides/react/features/redux/)Router for state management.

### Find (and fix) slow code impacting your users

Sentry spots the bottlenecks that are impacting real users like:

  * Rendering delays from inefficient hooks and effects

  * Unnecessary re-renders that degrade performance

  * Slow API responses from fetch calls and state updates

  * Blocking middleware increasing response times

  * Bloated [_React_](https://about.codecov.io/product/feature/bundle-analysis/) bundles

### Catch React application bugs before they hit prod

[ _Codecov_](https://about.codecov.io/) gives you clear insights into your React app’s coverage and test performance, helping you spot coverage gaps and fix flaky tests.

  * Identify gaps in component and API test coverage

  * Spot flaky tests causing CI/CD failures

  * Ensure critical functionality like state updates and routing is well-tested

By correlating Sentry issues to our dev cycle, we can spot where problems begin and how to fix the source.

Jim Redmond

Sr. Systems Engineer,

Bitbucket

[Read More Bitbucket testimonial](https://bitbucket.org/)

## Common React Issues Solved

[### Hydration ErrorsWhether it's a flickering UI or missing elements, Sentry's hydration error diff tools make it easy to instantly detect and debug mismatches between server-rendered and client-rendered HTML. ](https://docs.sentry.io/product/issues/issue-details/replay-issues/hydration-error/)

### Component Performance Issues

Monitor React component render times and identify slow updates that impact user experience.

### State Management Debugging

Track Redux actions and state transitions to understand what changed before an issue occurred.

### Prevent Silent Failures in Scheduled Tasks

Missed background syncs or failed API updates can go unnoticed, leading to broken functionality. Ensure your scheduled tasks are running on time and without errors with Sentry’s monitoring tools

[### Detect DowntimeGet real-time alerts when your application is unavailable, so you can respond quickly before it impacts your users. ](https://docs.sentry.io/product/alerts/create-alerts/uptime-alert-config/)

## FAQs

Why logs in Sentry?

When debugging, logs, traces, and errors work better together. Logs provide the granular context—like retries, API failures, and internal state—that spans and errors can miss. But in most tools today, logs live in a separate system, forcing you to switch between tools to piece together the full picture.

With[ logs in Sentry](https://sentry.io/product/logs/), everything is in one place. You can see logs right alongside your errors and traces—no more context switching, just faster debugging.

Do you have log and trace drains?

Yes. Send logs and traces without code changes to Sentry from platforms where you can't use the Sentry SDKs. [Set up log drains](https://docs.sentry.io/product/drains/) to forward logs from your deployments directly to Sentry without code changes. Log drains are available for [Vercel](https://docs.sentry.io/product/drains/integration/vercel/), [Cloudflare](https://docs.sentry.io/product/drains/integration/cloudflare/), [Heroku](https://docs.sentry.io/product/drains/integration/heroku/), [Supabase](https://docs.sentry.io/product/drains/integration/supabase/), and [Shopify Hydrogen](https://docs.sentry.io/product/drains/integration/shopify-hydrogen/).

How much does Sentry cost?

You can get started for free. Pricing depends on the number of monthly events, transactions, and attachments that you send Sentry. For more details, visit our [pricing page](https://sentry.io/pricing/).

How does Sentry impact my app performance?

Sentry doesn’t impact a web site’s performance.

If you look at the configuration options for when you initialize Sentry in your code, you’ll see there’s nothing regarding minimizing its impact on your app’s performance. This is because our team of SDK engineers already developed Sentry with this in mind.

Sentry is a listener/handler for errors that asynchronously sends out the error/event to Sentry.io. This is non-blocking. The error/event only goes out if this is an error.

Global handlers have almost no impact as well, as they are native APIs provided by the browsers.

## Of course we have more content

[### Everyone needs to know how to traceIt’s a bold claim for me to say that every developer can benefit from something , but hear me out. I was among the 40% who didn’t know tracing existed...](https://blog.sentry.io/everyone-needs-to-know-how-to-trace/)

[### How I cut 22.3 seconds off an API Call using Trace ViewAs a developer, few things are more frustrating than an API that's slower than molasses. You know the code works, but you know it can’t possibly be a...](https://blog.sentry.io/how-i-cut-22-3-seconds-off-an-api-call-using-trace-view/)

[### Debugging slow pages caused by slow backendsThe truth is that how you solve performance issues varies, and as a developer, you always want the fastest path to resolution.](https://blog.sentry.io/debugging-slow-pages-caused-by-slow-backends/)

[### Your bad LCP score might be a backend issueLargest Contentful Paint (LCP) is a Core Web Vital (CWV) metric that marks the point in the page load timeline where the main page content has likely...](https://blog.sentry.io/your-bad-lcp-score-might-be-a-backend-issue)

[### How to make your web page faster before it even loadsAs developers (and as front end developers in particular), we usually talk about web performance in the context of measuring what happens when we star...](https://blog.sentry.io/how-to-make-your-web-page-faster-before-it-even-loads/)

[### Debug (even) faster with 8 Sentry updatesOver the past few months, we introduced several new features and capabilities. While we released larger product updates like , , and our (to name a f...](https://blog.sentry.io/debug-even-faster-with-8-sentry-updates/)

[### How to identify fetch waterfalls in ReactFetch Waterfalls are scenarios where multiple fetch requests are invoked in a sequential manner, not in parallel. This leads to some serious performan...](https://blog.sentry.io/how-to-identify-fetch-waterfalls-in-react/)

[### My errors are gone w̶i̶t̶h̶o̶u̶t̶ with a traceI can’t imagine another product where I go from “I probably don’t need this” to “I am adding this to all my products.” That’s what did to me.](https://blog.sentry.io/my-errors-are-gone-with-a-trace/)

[### Everyone needs to know how to traceIt’s a bold claim for me to say that every developer can benefit from something , but hear me out. I was among the 40% who didn’t know tracing existed...](https://blog.sentry.io/everyone-needs-to-know-how-to-trace/)

[### How I cut 22.3 seconds off an API Call using Trace ViewAs a developer, few things are more frustrating than an API that's slower than molasses. You know the code works, but you know it can’t possibly be a...](https://blog.sentry.io/how-i-cut-22-3-seconds-off-an-api-call-using-trace-view/)

[### Debugging slow pages caused by slow backendsThe truth is that how you solve performance issues varies, and as a developer, you always want the fastest path to resolution.](https://blog.sentry.io/debugging-slow-pages-caused-by-slow-backends/)

[### Your bad LCP score might be a backend issueLargest Contentful Paint (LCP) is a Core Web Vital (CWV) metric that marks the point in the page load timeline where the main page content has likely...](https://blog.sentry.io/your-bad-lcp-score-might-be-a-backend-issue)

[### How to make your web page faster before it even loadsAs developers (and as front end developers in particular), we usually talk about web performance in the context of measuring what happens when we star...](https://blog.sentry.io/how-to-make-your-web-page-faster-before-it-even-loads/)

[### Debug (even) faster with 8 Sentry updatesOver the past few months, we introduced several new features and capabilities. While we released larger product updates like , , and our (to name a f...](https://blog.sentry.io/debug-even-faster-with-8-sentry-updates/)

[### How to identify fetch waterfalls in ReactFetch Waterfalls are scenarios where multiple fetch requests are invoked in a sequential manner, not in parallel. This leads to some serious performan...](https://blog.sentry.io/how-to-identify-fetch-waterfalls-in-react/)

[### My errors are gone w̶i̶t̶h̶o̶u̶t̶ with a traceI can’t imagine another product where I go from “I probably don’t need this” to “I am adding this to all my products.” That’s what did to me.](https://blog.sentry.io/my-errors-are-gone-with-a-trace/)

[### Everyone needs to know how to traceIt’s a bold claim for me to say that every developer can benefit from something , but hear me out. I was among the 40% who didn’t know tracing existed...](https://blog.sentry.io/everyone-needs-to-know-how-to-trace/)

[### How I cut 22.3 seconds off an API Call using Trace ViewAs a developer, few things are more frustrating than an API that's slower than molasses. You know the code works, but you know it can’t possibly be a...](https://blog.sentry.io/how-i-cut-22-3-seconds-off-an-api-call-using-trace-view/)

[### Debugging slow pages caused by slow backendsThe truth is that how you solve performance issues varies, and as a developer, you always want the fastest path to resolution.](https://blog.sentry.io/debugging-slow-pages-caused-by-slow-backends/)

[### Your bad LCP score might be a backend issueLargest Contentful Paint (LCP) is a Core Web Vital (CWV) metric that marks the point in the page load timeline where the main page content has likely...](https://blog.sentry.io/your-bad-lcp-score-might-be-a-backend-issue)

[### How to make your web page faster before it even loadsAs developers (and as front end developers in particular), we usually talk about web performance in the context of measuring what happens when we star...](https://blog.sentry.io/how-to-make-your-web-page-faster-before-it-even-loads/)

[### Debug (even) faster with 8 Sentry updatesOver the past few months, we introduced several new features and capabilities. While we released larger product updates like , , and our (to name a f...](https://blog.sentry.io/debug-even-faster-with-8-sentry-updates/)

[### How to identify fetch waterfalls in ReactFetch Waterfalls are scenarios where multiple fetch requests are invoked in a sequential manner, not in parallel. This leads to some serious performan...](https://blog.sentry.io/how-to-identify-fetch-waterfalls-in-react/)

[### My errors are gone w̶i̶t̶h̶o̶u̶t̶ with a traceI can’t imagine another product where I go from “I probably don’t need this” to “I am adding this to all my products.” That’s what did to me.](https://blog.sentry.io/my-errors-are-gone-with-a-trace/)

## Fix It

Get started with the only application monitoring platform that empowers developers to fix application problems without compromising on velocity.

[Try Sentry for Free](https://sentry.io/signup/)[Get a Demo](https://sentry.io/demo/)


# Talk to a human

Have questions about Sentry? We'll answer all of them.

### Talk to Us

Get all of Sentry's core features plus enterprise capabilities to suit your business and workflow:

  * Get a Demo
  * Get Volume Pricing
  * Pay by Invoice
  * Learn about our Security & Compliance Policies

First Name

Last Name

Email Address

Job Title:

Company Name

How can we help?Select...DemoEnterprise quoteBilling supportTechnical supportPartnershipEDU/Non-profit/Student Plans Legal requirementsOther

Additional context:

Have a support question? [Contact Support.](https://sentry.zendesk.com/hc/en-us)

By filling out this form, you agree to our [privacy policy](https://sentry.io/privacy/). You may unsubscribe at any time. This form is protected by reCAPTCHA and Google's [Privacy Policy](https://policies.google.com/privacy) and [Terms of Service](https://policies.google.com/terms) apply.

Submit


# Start monitoring today

Sentry helps over 4M+ developers and 100K+ organizations see what actually matters, solve errors and performance issues quicker, and learn continuously about their application health - from the frontend to the backend.

#### These folks get it:

### Track in seconds

Name

Organization

Email

Password

Data Storage Location

Choose where to store your organization's data. Please note, you won't be able to change locations once your organization has been created. [Learn MoreSentry docs for data storage location](https://docs.sentry.io/organization/data-storage-location/)

Select a location🇺🇸 United States (US)🇪🇺 European Union (EU)

I would like to receive updates via email.I agree to the [Terms of Service](https://sentry.io/terms/) and [Privacy Policy](https://sentry.io/privacy/).This form is protected by reCAPTCHA. [Google's Privacy Policy](https://policies.google.com/privacy) and [Google's Terms of Service](https://policies.google.com/terms) apply.

Create your account

Got a promo code? _Redeem_

or sign up with

[ Google](https://sentry.io/identity/login/google/)[ GitHub](https://sentry.io/identity/login/github/)[ Azure DevOps](https://sentry.io/identity/login/vsts/)

## Getting started is easy

### Start for free

Start with Sentry's 14-day free Business plan trial - after the trial is over, you can either use Sentry's free plan or scale based on your needs.

### No contracts

You can upgrade or downgrade at any time, and we'll automatically adjust your rate at the beginning of your next billing cycle.

### Save money

If you need more events than what's included in your plan, we got you. Either set a pay-as-you-go event budget or save 20% by reserving in advance.

#### over 100K+ organizations have fewer (software) issues than before

## Code breaks, fix it faster

Application monitoring software considered "not bad" by 4 million developers

Try Sentry for Free  [ Get Demo  ](https://sentry.io/demo)


### Categories:

UPTIMEMETRICSAlertsDASHBOARDSERROR-MONITORINGANDROIDMOBILEBETALogsINTEGRATIONSBUSINESSSTATSTracingREPLAYSeerPROFILINGcode-reviewAI/MLPYTHONJAVASCRIPTBILLING-AND-SPENDSDKSRUBYRAILSCIEARLY-ACCESSINSIGHTSRELEASESAUTOFIXFRONTENDIOSTEAMSECURITY-ADVISORYUI/UX-UPDATEISSUESPERFORMANCEPHPLARAVELBACKENDJAVANODE.JSCODE-COVERAGENotificationsREACT-NATIVEDATA-RESIDENCYCRONSNODEENTERPRISE

Reset

April 2023

[### User Click Search for Session ReplayREPLAYUser click search allows you to search for replays by DOM element, or in other words, where users have clicked to interact with specific parts of your web...

    April 27, 2023](https://sentry.io/changelog/2023-4-27-user-click-search-for-session-replay/)

March 2023

[### Automatic Code Mapping SetupISSUESINTEGRATIONSSentry will automatically set up code mappings for your Python, Javascript, Ruby and Node projects. Once you have set up a GitHub integration, automatic code...

    March 10, 2023](https://sentry.io/changelog/2023-3-10-automatic-code-mapping-setup/)[### Spike ProtectionBILLING-AND-SPENDSpike Protection now uses an improved spike detection algorithm to better protect you from any sudden quota-depleting spikes. The improved feature will work...

    March 10, 2023](https://sentry.io/changelog/2023-3-10-spike-protection-2-0-beta/)[### Codecov-Sentry IntegrationINTEGRATIONSThe Sentry Codecov Integration allows you to see untested code causing errors - or whether it’s partially or fully covered - directly in the stack trace,...

    March 10, 2023](https://sentry.io/changelog/2023-3-10-codecov-sentry-integration-beta/)

[Previous](https://sentry.io/changelog/?page=26&search=)

[1](https://sentry.io/changelog/?search=)[...](https://sentry.io/changelog/?page=0&search=)[25](https://sentry.io/changelog/?page=25&search=)[26](https://sentry.io/changelog/?page=26&search=)[27](https://sentry.io/changelog/?page=27&search=)

Next


# LuauNES, The fastest NES emulator in roblox.

**NES** emulator ported to roblox luau inspired/based on **[Mesen2](https://github.com/SourMesen/Mesen2/tree/master)** ( one of the most accurate nes emulators )
This is very performant and able to run **Kirby Adventure** with ~150 FPS ( 13th Gen Intel® Core™ i7-13620H )
also **Donkey Kong Classics** with ~220 FPS.

But for low/mid-end devices, it still run pretty smooth. ( ~30-70 FPS )

Moreover, you should upload your audio files as your own ( I cannot distrub the sounds because I am unverified )
The audio files you can download in the [Sounds](https://github.com/vantoanvh/LuauNES/tree/main/Sounds) folder

### Disclamer
 Your device should have native code generation to make this run effectively.This used EditableImage so you need ID Verification for this.

## Features

- 2-player support.
- zapper support ( or mouse ).
- Full noises sequences, pulses (with extra ones), triangles for sounds.
- PPU dot-based
- Almost cycle-accurate CPU
- No DMC channels (sorry!)

# Supported Mappers:

### Nintendo

- `0` - NROM
- `1` - MMC1 / SxROM
- `2` - UxROM (UNROM/UOROM)
- `3` - CNROM
- `4` - MMC3 / TxROM
- `5` - MMC5 / ExROM
- `7` - AxROM / AOROM
- `9` - MMC2 / PxROM
- `10` - MMC4 / FxROM
- `13` - CPROM
- `37` - MMC3 multicart variant
- `47` - MMC3 multicart variant
- `66` - GxROM
- `94` - UN1ROM
- `105` - NES-EVENT (MMC1)
- `118` - TxSROM (TKSROM/TLSROM)
- `155` - MMC1A variant
- `180` - UxROM (inverted)
- `185` - CNROM security / CHR-disable variant

### Namco

- `19` - Namco 163 family
- `76` - NAMCOT-3446
- `88` - Namco 108 variant
- `95` - NAMCOT-3425
- `154` - NAMCOT-3453
- `206` - Namco 108 / Namco 118 / MIMIC-1 / DxROM
- `210` - Namco 175 / Namco 340

### Konami

- `21` - VRC2 / VRC4 family
- `22` - VRC2 / VRC4 family
- `23` - VRC2 / VRC4 family
- `24` - VRC6
- `25` - VRC2 / VRC4 family
- `26` - VRC6
- `27` - VRC2 / VRC4 family
- `73` - VRC3
- `75` - VRC1
- `85` - VRC7

### Sunsoft

- `67` - Sunsoft-3
- `68` - Sunsoft-4
- `69` - FME-7
- `89` - Sunsoft-2 on Sunsoft-3 board
- `93` - Sunsoft-2 on Sunsoft-3R board
- `184` - Sunsoft-1

### Homebrew

- `30` - UNROM 512

### Unlicensed

- `11` - Color Dreams
- `71` - Camerica / Codemasters
- `79` - NINA-03 / NINA-06
- `116` - Huang / Gouder SOMARI-P
- `163` - Nanjing FC-001

## Code usage

You can download the **ROMs** in the internet and convert it into **rbxmx** using [my website](https://vantoanvh.github.io/LuauNES/)!
or testing pregenerated roms in [test](https://github.com/vantoanvh/LuauNES/tree/main/test)

```luau
--!native
--!optimize 2
--!strict

local UserInputService = game:GetService'UserInputService'
local AssetService = game:GetService'AssetService'
local RunService = game:GetService'RunService'
local GuiService = game:GetService'GuiService'

-- Import the LuauNES module.
local LuauNES = require'@game/ReplicatedStorage/Shared/LuauNES'
local Rom = require'@game/ReplicatedStorage/Roms/DonkeyKong' -- Import your rom too

-- UI element that displays the NES output.
local Display = script.Parent.Display

-- Size is defined by the emulator (typically 256x240 for NES).
local Screen = AssetService:CreateEditableImage{ Size = LuauNES.size }
Display.ImageContent = Content.fromObject(Screen)

-- Cache the WritePixelsBuffer function for faster repeated calls.
local WritePixels = Screen.WritePixelsBuffer

-- Load the NES ROM into the emulator.
LuauNES.load(Rom)

-- Key mapping for player 1.
local keyMapP1 = {
    -- Face buttons
    [Enum.KeyCode.X] = LuauNES.Buttons.A,
    [Enum.KeyCode.Z] = LuauNES.Buttons.B,

    -- System buttons
    [Enum.KeyCode.LeftShift] = LuauNES.Buttons.Select,
    [Enum.KeyCode.Return] = LuauNES.Buttons.Start,

    -- Directional pad
    [Enum.KeyCode.Up] = LuauNES.Buttons.Up,
    [Enum.KeyCode.Down] = LuauNES.Buttons.Down,
    [Enum.KeyCode.Left] = LuauNES.Buttons.Left,
    [Enum.KeyCode.Right] = LuauNES.Buttons.Right,

-- Key mapping for player 2.
local keyMapP2 = {
    -- Face buttons
    [Enum.KeyCode.J] = LuauNES.Buttons.A,
    [Enum.KeyCode.K] = LuauNES.Buttons.B,

    -- System buttons
    [Enum.KeyCode.RightShift] = LuauNES.Buttons.Select,
    [Enum.KeyCode.RightControl] = LuauNES.Buttons.Start,

    -- Directional pad
    [Enum.KeyCode.W] = LuauNES.Buttons.Up,
    [Enum.KeyCode.S] = LuauNES.Buttons.Down,
    [Enum.KeyCode.A] = LuauNES.Buttons.Left,
    [Enum.KeyCode.D] = LuauNES.Buttons.Right,

local function updateZapper()
    local pos = UserInputService:GetMouseLocation()

    local guiSize = Display.AbsoluteSize
    local guiPos = Display.AbsolutePosition + Vector2.new(0, GuiService.TopbarInset.Height)

    local x = (pos.X - guiPos.X) / guiSize.X * 256
    local y = (pos.Y - guiPos.Y) / guiSize.Y * 240

    LuauNES.point(x // 1, y // 1) -- Update zapper position
end

-- Accumulator allows the emulator to step multiple frames if Roblox lags.
local accumulator = 0

-- This is used as the main emulator update loop.
local function onRendered(dt: number)
    -- NES runs at ~60.0988 FPS, so we need to accumulate it.
    accumulator += dt

    while accumulator >= 0.01663926733 do
        -- Render a frame from the emulator.
        local frame = LuauNES.render()

        -- If a frame was produced, write it into the EditableImage.
        if frame then
            WritePixels(Screen, Vector2.zero, LuauNES.size, frame)
        end

        -- Remove the processed frame time from the accumulator.
        accumulator -= 0.01663926733
    end
end

-- Handles press events.
local function Pressed(input: InputObject)
    -- Check if the key pressed by player 1
    local btn = keyMapP1[input.KeyCode]
    if btn then LuauNES.press(btn, 1) end

    -- Check if the key pressed by player 2
    local btn = keyMapP2[input.KeyCode]
    if btn then LuauNES.press(btn, 2) end

    if input.UserInputType == Enum.UserInputType.MouseButton1 then
        LuauNES.trigger() -- Triggered zapper
    end
end

-- Handles release events.
local function Released(input: InputObject)
    -- Check if the key released by player 1
    local btn = keyMapP1[input.KeyCode]
    if btn then LuauNES.release(btn, 1) end

    -- Check if the key released by player 2
    local btn = keyMapP2[input.KeyCode]
    if btn then LuauNES.release(btn, 2) end
end

-- Connect events to the handler.
UserInputService.InputBegan:Connect(Pressed)
UserInputService.InputEnded:Connect(Released)

-- PostSimulation runs once per simulation step,
-- so the emulator work is done before PreRender
-- and does not block rendering as much.
-- it's a good pratice to do this way
RunService.PostSimulation:Connect(onRendered)
RunService.PreRender:Connect(updateZapper)


# File to RBXMX

Upload, edit source, and export.

Copy Export .rbxmx

Upload a file to generate editable text. Every byte is written as a numeric Lua escape.


# Module3D
Module3D is a helper module for adorning 3D objects to 2D frames
in ScreenGuis, BillboardGuis, or SurfaceGuis. This version uses
ViewportFrames to make development easier with more features and
less overhead on the developer's part.

## Code Example
```lua
local Frame = script.Parent:WaitForChild("Frame")
local Module3D = require(game.ReplicatedStorage:WaitForChild("Module3D"))
local Towers = game.ReplicatedStorage:WaitForChild("Towers")

local Model3D = Module3D:Attach3D(Frame,Towers)
Model3D:SetDepthMultiplier(1.2)
Model3D.CurrentCamera.FieldOfView = 5
Model3D.Visible = true

game:GetService("RunService").RenderStepped:Connect(function()
    Model3D:SetCFrame(CFrame.Angles(0, tick() % (math.pi * 2), 0) * CFrame.Angles(math.rad(-10), 0, 0))
end)

## Roblox Model
This model can be found in the Roblox library.
https://www.roblox.com/library/2615023691/Module3D-V6

For use with Rojo, only the `Module3D.lua` file is
needed since there is no external dependencies.

## Contributing
Both issues and pull requests are accepted for this project.

## License
Module3D is available under the terms of the MIT
Licence. See [LICENSE](LICENSE) for details.


# Luau Futures

Futures represent a read-only asynchronous value, one that may not have
finished computation like.

This design is inspired by the Futures crate in Rust.

> [!IMPORTANT]
> After almost two years of being the oldest Futures implementation on Wally,
> Luau Futures v2.0.0 has released, with several key changes.
> Importantly, the Wally scope has been changed to `yetanotherclown/luau-futures`.
> If you are still using the v1.x.x Future library make sure to update your `wally.toml` to upgrade.
> You can find out more [here](https://github.com/YetAnotherClown/luau-futures/releases/latest).

## Basic Use

Creating a future is very simple:

```luau
local Futures = require("@packages/Futures")
local Future = Futures.Future

local myFuture = Future.new(function()
    yield()
    return 1, 2, 3
end)

When you create a future, it wont begin execution until it is either polled or awaited.

Polling will advance the future to it's next resumption point every time that it is called, returning a [Poll](https://yetanotherclown.github.io/luau-futures/api/Poll) to let you check the status of the future.

If the Poll is ready, you can also unwrap it to get the [Result](https://yetanotherclown.github.io/luau-futures/api/Result)

```luau
local poll = myFuture:poll()
if poll:isReady() then
    local result = poll:unwrap()
    -- Handle result
end

Awaiting a future will yield the current thread until the future finishes execution. As such, it is recommended that you only use the await method within other futures, preferring to use poll instead.

```luau
local result = myFuture:await()
-- Handle result

To read the result, you can use [Result:isOk](https://yetanotherclown.github.io/luau-futures/api/Result#isOk) or [Result:isErr](https://yetanotherclown.github.io/luau-futures/api/Result#isOk) to check what type the Result is.

You can then use [Result:unwrapOk](https://yetanotherclown.github.io/luau-futures/api/Result#unwrapOk) or [Result:unwrapErr](https://yetanotherclown.github.io/luau-futures/api/Result#unwrapErr) to get the value of the result.

```luau
if result:isOk() then
    print(result:unwrapOk()) -- 1, 2, 3
elseif result:isErr() then
    warn(result:unwrapErr()) -- An error occurred
end

There are also several other methods for chaining, combining, and mapping futures, as well as other utilities for working with futures.

It is suggested to read the [API Documentation](https://yetanotherclown.github.io/luau-futures) for more information about these methods.

## Why Luau Futures

### Laziness

Like in Rust, Luau Future is lazy. Unlike Promises which are eager.

Futures will not begin execution until polled or awaited, where as in Promises, execution is begun immediately or scheduled to be done as soon as it can.

Polling will execute until the next suspension point, until execution is finished. By awaiting a Future, it will yield the current thread until execution has completed.

### Strictly Typed

Strict Typing is a feature, with API designed to work with the Luau type solver.

There are currently some restrictions, see below for more information.

### Functional

The API is designed to be functional, taking inspiration from the Rust futures crate.

## Why you Shouldn't Use Luau Futures

### Futures are Lazy

Sometimes, you might not want the Laziness of Futures, and instead want execution to begin when it can. Promises begin execution as soon as they're made,
allowing the result to be completed much sooner than with a Future. Futures are lazy by design, you might find that you want this laziness for a certain
purpose and that is fine, but sometimes you might not.

### Promises Just Work

roblox-lua-promise works, and has worked for some time now. Do you need a battle tested strategy for asynchronous programming? Use roblox-lua-promise!
If you're already using Promises, keep using them.

### Promises are more Common

Working on a library? Introducing new developers to your team? It would be easier for them to understand Promises, as they're already widely popular in
the JavaScript ecosystem as well as in Luau.

## A Note on Typechecking

The following typechecking restrictions should be resolved in the Luau Solver V2, in which recursive type restrictions
should be loosened.

### Exported Types

The Futures library exports two types because of these restrictions. `FutureLike` should be used when your being given a future, such as in a function with a future as a parameter. The `Future` type should be used when returning a future, such as in a function return.

```luau
function Class:method<E, U...>(future: Futures.FutureLike<E, U...>): Futures.Future<E, U...>
    return future:andThen(function(...)
        -- ...
    end) :: any
end

> [!NOTE]
> To avoid recursive type restrictions, there are internally multiple types like FutureFirst, FutureNext, FutureLast and FutureExhausted.
> The Futures.Future type is just FutureFirst, so when you use that type it will expect a FutureFirst which is the first type you get when creating a future with Future.new().
> If you are chaining a future in a function that returns one, you can annotate the return type to be Futures.Future and then typecast the returned future with :: any like in the example.

### Recursive Types

Some methods, such as `andThen`, `mapOk`, `mapErr`, etc. will return a recursive type with different parameters.
Currently, there are restrictions in place in the Luau type solver to prevent this. The Futures library has a workaround
to allow you to chain up to 3 of these methods. When you hit the limit, you will be returned a generic
Future that is typed as `Future`.

### Join Methods

The Join methods currently will always return a generic Future. Currently, it is impossible to type these methods.

### UnwrapOrElse
[Future:unwrapOrElse](https://yetanotherclown.github.io/luau-future/api/Future#unwrapOrElse) should return the type `Future<never, U...>`. However, due to recursive type restrictions, it will return `Future<E, U...>`.


# Luau Futures

Rust-like futures for Luau

[Get Started](https://yetanotherclown.github.io/luau-futures/docs/intro)[API](https://yetanotherclown.github.io/luau-futures/api)

## Lazy, not Eager.

Futures will not begin execution until polled or awaited, unlike Promises when begin immediately.

Polling will execute until the next suspension point, until execution is finished. By awaiting a Future, it will yield the current thread until execution has completed.

## Rusty. Rust-like.

Luau Futures aim to have similar API and behavior to Rust Futures where possible, drawing inspiration otherwise.

## Types? Check. Typechecked.

Luau Futures are strictly typed, within the type solver's restrictions.

[Typechecking Guide](https://yetanotherclown.github.io/luau-futures/docs/typechecking)


A future represents a read-only asynchronous value, one that may not have finished computation yet. A basic future could look like:

    local Futures = require("@packages/Futures")
    local Future = Futures.Future

    local myFuture = Future.new(function()
        yield()
        return 1, 2, 3
    end)

When you create a future, it wont begin execution until it is either polled or awaited.

Polling will advance the future to it's next resumption point every time that it is called, returning a [Poll] to let you check the status of the future.

If the Poll is ready, you can also unwrap it to get the [Result].

    local poll = myFuture:poll()
    if poll:isReady() then
        local result = poll:unwrap()
        -- Handle result
    end

Awaiting a future will yield the current thread until the future finishes execution. As such, it is recommended that you only use the await method within other futures, preferring to use poll instead.

    local result = myFuture:await()
    -- Handle result

To read the result, you can use [Result:isOk] or [Result:isErr] to check what type the Result is.

You can then use [Result:unwrapOk] or [Result:unwrapErr] to get the value of the result.

    if result:isOk() then
        print(result:unwrapOk()) -- 1, 2, 3
    elseif result:isErr() then
        warn(result:unwrapErr()) -- An error occurred
    end

There are also several other methods for chaining, combining, and mapping futures, as well as other utilities for working with futures.

It is suggested to read the [API Documentation](https://yetanotherclown.github.io/luau-futures/api/Future) for more information about these methods.


Purse

  [![Discord](https://discord.com/api/guilds/1162303282002272359/widget.png)](https://discord.gg/N2KEnHzrsW)

Purse is a fork of the [default Roblox backpack](https://github.com/Roblox/Core-Scripts/blob/master/CoreScriptsRoot/Modules/BackpackScript.lua) decoupled from the CoreGui, allowing developers access to APIs that were previously unavailable and allowing for code modifications.

![Screenshot of Purse with the inventory open](docs/assets/screenshot.png)

For more information, see the [documentation](https://purse.luau.page/).

## Upstream Repo

Mirroring `829cb13cc98870ddbcf4ba6bd48b774a87ae549f` on the [Roblox Client Tracker](https://github.com/MaximumADHD/Roblox-Client-Tracker).

> https://github.com/MaximumADHD/Roblox-Client-Tracker/blob/829cb13cc98870ddbcf4ba6bd48b774a87ae549f/scripts/CoreScripts/Modules/BackpackScript.lua

## License

Purse is available under the Apache 2.0 license. See [LICENSE.md](LICENSE.md) for details.


# Purse¶

Purse is a fork of the [default Roblox backpack](https://github.com/Roblox/Core-Scripts/blob/master/CoreScriptsRoot/Modules/BackpackScript.lua) decoupled from the CoreGui, allowing developers access to APIs that were previously unavailable and allowing for code modifications.

  * Source code modification
  * Developer APIs for controlling the inventory
  * Not reliant on CoreGui permissions

What Purse is not is a major improvement over the CoreGui backpack, but a copy of it, so that developers can iterate on it themselves. There are no additional features beyond what the CoreGui backpack provides.

## Demo¶

You can play the [Purse Demo](https://www.roblox.com/join/sc1eh) on Roblox to try out Purse before using it. The place is uncopylocked so you can access an editable copy of the experience

[Play on Roblox](https://www.roblox.com/join/sc1eh)

## Notes¶

Because we can't access the topbar without CoreGui, we use [TopbarPlus](https://devforum.roblox.com/t/topbarplus/1017485). This is one of the major differences in terms of functionality. TopbarPlus may not be as familiar to use on a controller.

Back to top


# Guide

Through source code modifications, you can change Purse's behavior and appearance. Here are a few examples of what you can do with Purse.

## Changing Equip Color¶

You can change the slot's equip color, which is blue, by modifying the `SLOT_EQUIP_COLOR` constant in its source.

The following code sample changes the equip color to red.

    49
    50
    51
    52
    53
    54

    local SLOT_DRAGGABLE_COLOR = Color3.new(49 / 255, 49 / 255, 49 / 255)
    local SLOT_EQUIP_COLOR = Color3.new(233 / 255, 90 / 255, 90 / 255) -- (1)!
    local SLOT_EQUIP_THICKNESS = 0.1 -- Relative
    local SLOT_FADE_LOCKED_DEFAULT = 0.50 -- Locked means undraggable
    local slotFadeLocked = SLOT_FADE_LOCKED_DEFAULT * GuiService.PreferredTransparency -- ROBLOX deviation: use GuiService instead of UserGameSettings
    local SLOT_BORDER_COLOR = Color3.new(1, 1, 1) -- Appears when dragging

  1. Changed from blue `Color3.new(90 / 255, 142 / 255, 233 / 255)` to red `Color3.new(233 / 255, 90 / 255, 90 / 255)`

Hotbar with a red equip outline

## Increasing Hotbar Slots and Inventory Rows¶

Purse shows a set number of hotbar slots and inventory rows based on the device.

Computer, console, and VR have 10 hotbar slots and 4 inventory rows

Phone and tablet devices have 3 hotbar slots and 2 inventory rows

It's possible to increase the number of hotbar slots and inventory rows shown by changing the constants in the source code.

Note

Formerly VR devices used different constants for hotbar slots and inventory rows but now use the same as computer and console devices.

`HOTBAR_SLOTS_VR` and `INVENTORY_ROWS_VR` are no longer used but are still included in the code. VR devices now use `INVENTORY_ROWS_FULL` and `HOTBAR_SLOTS_FULL`.

    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77

    local HOTBAR_SLOTS_FULL = 10
    local HOTBAR_SLOTS_VR = 6
    local HOTBAR_SLOTS_MINI = 3
    local HOTBAR_SLOTS_WIDTH_CUTOFF = 1024 -- Anything smaller is MINI
    local HOTBAR_OFFSET_FROMBOTTOM = -30 -- Offset to make room for the Health GUI

    local INVENTORY_ROWS_FULL = 4
    local INVENTORY_ROWS_VR = 3
    local INVENTORY_ROWS_MINI = 2
    local INVENTORY_HEADER_SIZE = 40
    local INVENTORY_ARROWS_BUFFER_VR = 40

Constants suffixed with `_FULL` are for computer, console, and VR devices while constants suffixed with `_MINI` are for phone and tablet devices.

The following code sample changes phone and tablet devices to have 5 hotbar slots.

    67
    68
    69
    70
    71

    local HOTBAR_SLOTS_FULL = 10
    local HOTBAR_SLOTS_VR = 6
    local HOTBAR_SLOTS_MINI = 5 -- (1)!
    local HOTBAR_SLOTS_WIDTH_CUTOFF = 1024 -- Anything smaller is MINI
    local HOTBAR_OFFSET_FROMBOTTOM = -30 -- Offset to make room for the Health GUI

  1. Changed from `3` hotbar slots to `5` hotbar slots

Increased hotbar slots on phone and tablet devices

## Removing Topbar Icon¶

The topbar icon is decoupled from Purse's functionality, so you can remove it by disabling the [`TopbarIcon`](https://github.com/ryanlua/purse/blob/main/src/TopbarIcon.client.luau) script. In addition, a [`ContextAction`](https://github.com/ryanlua/purse/blob/main/src/ContextAction.client.luau) script is included to bind opening and closing the inventory to a keycode (set to backquote ``` by default).

Topbar icon enabled

Topbar icon disabled

Your explorer window should look similar to the following when you disable the `TopbarIcon` script and enable the `ContextAction` script.

Warning

If you do not enable the `ContextAction` script, players will not be able to open the backpack since the topbar icon which handles binding is disabled.

## Changing Inventory Key¶

The default key to open the inventory is the backquote ``` key, but you can change this by modifying the `bindToggleKey` argument in the [`TopbarIcon`](https://github.com/ryanlua/purse/blob/main/src/TopbarIcon.client.luau) script.

The following code sample changes the inventory toggle key to the `I` key.

TopbarIcon

     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25

    local icon = Icon.new()
    icon:modifyTheme({ "IconLabelContainer", "TargetWidth", 0 }) -- Force minimum width
    icon:setLabel("backpack")
    icon:setOrder(-1)
    icon:setTextSize(24)
    icon:setTextFont(
        "rbxasset://LuaPackages/Packages/_Index/BuilderIcons/BuilderIcons/BuilderIcons.json",
        Enum.FontWeight.Bold,
        Enum.FontStyle.Normal,
        "Selected"
    )
    icon:setTextFont(
        "rbxasset://LuaPackages/Packages/_Index/BuilderIcons/BuilderIcons/BuilderIcons.json",
        Enum.FontWeight.Regular,
        Enum.FontStyle.Normal,
        "Deselected"
    )
    icon:bindToggleKey(Enum.KeyCode.I) -- (1)!
    icon:autoDeselect(false)
    icon:setCaption("Inventory")

  1. Changed from backquote ``` key `Enum.KeyCode.Backquote` to `I` key `Enum.KeyCode.I`

Topbar icon with inventory toggle key changed to `I`

It is also possible to bind the inventory toggle when using the [`ContextAction`](https://github.com/ryanlua/purse/blob/main/src/ContextAction.client.luau) script. The following code sample binds the inventory toggle to the `I` key.

ContextAction

    16

    ContextActionService:BindAction(ACTION_NAME, handleAction, false, Enum.KeyCode.I) -- (1)!

  1. Changed from backquote ``` key `Enum.KeyCode.Backquote` to `I` key `Enum.KeyCode.I`

If you don't want any key to be bound to toggling the inventory, you delete the line that binds the inventory toggle for either the `TopbarIcon` or `ContextAction` script which you use.

Back to top