
0.7.1 / 09-10-2026
Performance
Features
Ruffle
Accuracy
Ruffle is a Flash Player emulator written in Rust. Ruffle runs natively on all modern operating systems as a standalone application, and on all modern browsers through the use of WebAssembly and has extensive content compatibility in ActionScript; the language that powers interactivity in games and applications made with Flash.
Users or website owners may install the web version of Ruffle and existing flash content will "just work", with no extra configuration required. It will also detect all existing Flash content and this is an entirely open source project maintained by volunteers.
--
Installing on a website you own
Use an official Ruffle CDN, or download the 'standalone' version of Ruffle from our downloads, and include the following JavaScript on any page with Flash content:
<script src="https://unpkg.com/@ruffle-rs/ruffle"></script>
OR
<script src="path/to/ruffle/ruffle.js"></script>
If you're using a local installation, you'll need to make sure your web server is configured to serve .wasm files correctly, so please visit our wiki if you need help with that.
For advanced usage, consult their documentation for JavaScript API and installation options.
Downloading
Ruffle is directly available as an extension in the Chrome Web Store and on addons.mozilla.org:
- Safari: 14+ is required...
Most Recent Changes
--0.7.1--
desktop: Match device fonts case-insensitively by @qian-xuan in #24763
avm1: Migrate ContextMenu and ContextMenuItem to ActionScript by @relrelb in #24863
web: Migrate extension package from Webpack to esbuild by @danielhjacobs in #24774
--0.7.0--
core: Remove bitmap glyphs in favor of atlas glyphs by @kjarosh in #24619
core: Fix the caret not being rendered at line endings by @kjarosh in #24624
chore: Fix some whitespace and comment typos by @torokati44 in #24628
avm2: Don't allocate a buffer for arguments when calling non-variadic native methods by @Lord-McSweeney in #24542
avm2: Implement TextField's scroll event by @kjarosh in #24625
avm2: Fixes and refactors to Value strict equality by @Lord-McSweeney in #24626
build(deps): bump the cargo-minor group across 1 directory with 4 updates by @dependabot[bot] in #24639
build(deps-dev): bump the npm-minor group across 1 directory with 11 updates by @dependabot[bot] in #24636
build(deps): bump crowdin/github-action from 2 to 3 by @dependabot[bot] in #24635
avm1: Don't call getters when accessing
C.prototypeduringnew C()by @moulins in #24647build(deps): bump js-yaml from 4.3.1 to 4.3.2 in /web by @dependabot[bot] in #24648
build(deps-dev): bump morgan from 1.11.0 to 1.12.0 in /web by @dependabot[bot] in #24649
build(deps): bump svgo from 4.0.2 to 4.1.0 in /web by @dependabot[bot] in #24650
avm1: Dynamically resolve builtin classes (3/N:
Rectangle) by @moulins in #24656chore: Update some WebdriverIO packages to 9.31.7 by @torokati44 in #24654
avm2: Disallow constructing custom BitmapFilters by @kjarosh in #24661
desktop,web: Handle bitmap glyphs with no ink properly by @kjarosh in #24611
avm2: Handle bad ByteArray symbol classes by @kjarosh in #24663
render: Implement reposition in Z-axis by @cookie-s in #19405
avm2: Improve error handling in Json.parse() by @kjarosh in #24633
avm1: Dynamically resolve builtin classes (4/N: rest of
flash.geom.*) by @moulins in #24658avm2: Optimize method calls on parametrized Vectors to CallNative by @Lord-McSweeney in #24660
build: Use ESM instead for all of the web core build by @danielhjacobs in #24664
wgpu: Index into "dynamic transforms" via instancing, rather than dynamic buffer offsets by @Dinnerbone in #24666
desktop: Fix 32-bit builds with freetype by @kjarosh in #24668
ci: Bump cssnano and cssnano-preset-advanced from 8.02 to 9.04 by @danielhjacobs in #24659
build(deps-dev): bump @eslint/js from 9.39.4 to 10.0.1 in /web by @dependabot[bot] in #22990
tests: Fix avm1/bitmap_data_copypixels by @kjarosh in #24674
core: Fix copy_on_cpu when source and destination are the same by @kjarosh in #24676
build(deps-dev): bump typescript from 5.9.3 to 6.0.3 in /web by @danielhjacobs in #24675
build: Remove direct tsx dependency and use direct node compilation by @danielhjacobs in #24677
tests: Improve test coverage for queued stop/play actions in gotos by @Lord-McSweeney in #24669
core: Group arguments for triggering a goto in a GotoInfo struct by @Lord-McSweeney in #24678
build: Bump ashpd, rand, getrandom, and quinn-proto by @danielhjacobs in #24686
build: Bump rustls by @danielhjacobs in #24688
build: Bump jobserver by @danielhjacobs in #24687
build(deps): bump the cargo-minor group with 6 updates by @dependabot[bot] in #24694
build(deps): bump the winit-wgpu-egui group with 4 updates by @dependabot[bot] in #24690
build(deps-dev): bump eslint-plugin-jsdoc from 63.3.2 to 64.3.9 in /web by @dependabot[bot] in #24692
build(deps): bump the npm-minor group across 1 directory with 10 updates by @dependabot[bot] in #24701
avm2: Queue play/stop action alongside the frame for queued gotos by @Lord-McSweeney in #24684
chore: Bump various indirect Rust crate versions in Cargo.lock by @torokati44 in #24703
avm1: Dynamically resolve builtin classes (5/N:
TextFormat) by @moulins in #24696core: Refactors related to font scaling by @kjarosh in #24707
build(deps): bump mocha from 12.0.0 to 12.0.2 in /web by @danielhjacobs in #24711
web: Fully specify module imports and exports by @danielhjacobs in #24702
core: Rewrite fpdownload URLs to https by @kjarosh in #24718
tests: Add regression test for AVM1 rewind MovieClip replace by @AllinolCP in #24699
avm1: Resolve variables of a removed clip on the current target by @relrelb in #24725
build(deps): bump mnao305/chrome-extension-upload from 6.0.0 to 7.0.0 by @dependabot[bot] in #24689
build(deps-dev): bump archiver and @types/archiver in /web by @dependabot[bot] in #23927
avm2: Support atomic memory functions by @Lord-McSweeney in #24722
build(deps-dev): bump the npm-minor group in /web with 8 updates by @dependabot[bot] in #24746
build(deps): bump syn from 3.0.5 to 3.0.6 in the cargo-minor group by @dependabot[bot] in #24747
ci: Switch macOS GHA runner image from 15 to 26 by @torokati44 in #23842
build(deps): bump vergen from 9.1.0 to 10.0.3 by @dependabot[bot] in #24749
chore: Update
jpegxrto latest master, bumpingbindgenplusccby @torokati44 in #24759chore: Add missing lints.workspace inheritance to 2 cargo packages by @torokati44 in #24755
extension: Don't use chrome type by @danielhjacobs in #24754
web: Import JS and WASM assets from current directory in load-ruffle by @danielhjacobs in #24713
avm1: Support string targets in BitmapData.draw by @cmdocmd in #24732
tests: Expand avm1/bitmap_data_draw_string_target by @kjarosh in #24780
avm1: Return zero from successful BitmapData.draw by @cmdocmd in #24733
avm2: Avoid panic on out-of-range Date.setTime by @cmdocmd in #24738
frontend-utils: Replace deprecated macos-system-configuration feature by @danielhjacobs in #24781
desktop: Don't require building from a git repo by @Dinnerbone in #24787
desktop: Add shell completion subcommand via clap_complete by @Qiumix in #24646
build(deps): bump the cargo-minor group across 1 directory with 4 updates by @dependabot[bot] in #24788
avm2: Fix get_gradient_colors value reading and coercion by @lsaa in #24775
avm2: Throw error #2007 at the right place in gradient filters by @kjarosh in #24790
avm2: Add stubs to flash.sensors.Geolocation by @evilpie in #24795
core/common: Include reference to SWF movie's data directly in SwfSlice by @Lord-McSweeney in #24779
build(deps-dev): bump the npm-minor group in /web with 7 updates by @dependabot[bot] in #24799
build(deps-dev): bump ip-address from 10.4.0 to 10.7.2 in /web by @dependabot[bot] in #24804
build(deps-dev): bump morgan from 1.12.0 to 1.12.1 in /web by @dependabot[bot] in #24803
build(deps): bump the cargo-minor group with 2 updates by @dependabot[bot] in #24800
chore: Fix beta clippy lints by @torokati44 in #24805
chore: Make duplicated dependencies workspace dependencies by @shinjjin in #24801
build(deps): bump markdown-it from 14.3.0 to 14.3.2 in /web by @dependabot[bot] in #24808
build(deps): bump webpack-dev-middleware from 8.0.3 to 8.3.0 in /web by @dependabot[bot] in #24810
build(deps): bump undici in /web by @dependabot[bot] in #24809
build(deps): bump brace-expansion from 5.0.9 to 5.0.12 in /web by @dependabot[bot] in #24813
chore: Bump reqwest to 0.13.5 by @torokati44 in #24798
build(deps-dev): bump @grpc/grpc-js from 1.13.5 to 1.13.6 in /web by @dependabot[bot] in #24817
build(deps): bump base64 from 0.22.1 to 0.23.1 by @dependabot[bot] in #24783
tests: Add test coverage for queued gotos to invalid frames by @Lord-McSweeney in #24816
avm1: Migrate flash.geom.Point from Rust to ActionScript by @relrelb in #24736
avm2: Parity with SWFv9 and SWFv10 for invalid gotoAndStop parameters by @lsaa in #24741
chore: Bump h263-rs to latest master by @torokati44 in #24767
avm1: Migrate flash.geom.Rectangle to ActionScript by @relrelb in #24743
tests/framework: Treat NaN as equal to NaN in approximate comparisons by @cookie-s in #24825
core: Parse and serialize HTML img tags by @cmdocmd in #24802
text: Various fixes related to implementation and tests by @kjarosh in #24834
avm2: Use laid-out metrics for TextLine ascent and descent by @doombubbles in #24486
build(deps-dev): bump eslint-plugin-jsdoc from 64.5.4 to 65.0.2 in /web by @dependabot[bot] in #24840
build(deps): bump compression from 1.8.1 to 1.8.2 in /web by @dependabot[bot] in #24841
build(deps): bump proxy-addr from 2.0.7 to 2.0.8 in /web by @dependabot[bot] in #24842
build(deps): bump source-map-js from 1.2.1 to 1.2.2 in /web by @dependabot[bot] in #24843
web: Convert eslint config file to TS by @danielhjacobs in #24838
tests/framework: Show line and column number in approx comparisons by @cookie-s in #24826
build(deps-dev): bump the npm-minor group across 1 directory with 11 updates by @dependabot[bot] in #24839
build(deps): bump shell-quote from 1.10.0 to 1.12.0 in /web by @dependabot[bot] in #24845
avm1: Migrate flash.geom.Matrix to pure ActionScript by @relrelb in #24831
chore: Update translations from Crowdin by @kjarosh in #24846
--0.6.0--
chore: Bump ip-address from 10.2.0 to 10.4.0 in /web by @dependabot[bot] in #24365
chore: Bump fast-uri from 3.1.4 to 3.1.5 in /web by @dependabot[bot] in #24368
chore: Bump undici from 6.27.0 to 6.28.0 in /web by @dependabot[bot] in #24369
chore: Bump postcss from 8.5.22 to 8.5.25 in /web by @dependabot[bot] in #24367
chore: Bump the npm-minor group across 1 directory with 13 updates by @dependabot[bot] in #24370
video: Add support for NV12 pixel format by @X1nto in #24335
core: Migrate ruffle_macros to syn 3 by @torokati44 in #24378
chore: Run cargo +nightly fmt --all by @danielhjacobs in #24376
avm2: Implement some of the
flash.automationclasses by @ChrisCPI in #24390avm2: Reimplement Matrix3D.recompose() as a native method by @kjarosh in #24404
avm2: Reimplement Matrix3D.decompose() as a native method by @kjarosh in #24405
avm2: Implement TextBlock.releaseLines and TextBlock.lastLine by @Lord-McSweeney in #24399
tests: Add coverage for a
TextBlock.releaseLinesedge case by @Lord-McSweeney in #24416avm2: Implement Matrix3D.append()/prepend() as native by @kjarosh in #24406
core: Make
DisplayObject::ptr_eqtake any TDisplayObject parameter by @Lord-McSweeney in #24417avm2: Implement Matrix3D.copyColumn*() as native methods by @kjarosh in #24407
avm2: Make Matrix3D.determinant/invert() native by @kjarosh in #24408
avm2: Implement Matrix3D.position as a native property by @kjarosh in #24409
avm2: Implement Matrix3D.transpose() as native method by @kjarosh in #24410
avm2: Implement Matrix3D.copyRow*() as native methods by @kjarosh in #24411
chore: Bump js-yaml from 4.3.0 to 4.3.1 in /web by @dependabot[bot] in #24426
chore: Bump
lruandspindependencies by @torokati44 in #24435chore: Bump the cargo-minor group across 1 directory with 3 updates by @dependabot[bot] in #24423
ci: Sync bumped package versions into package-lock.json upon release by @torokati44 in #24379
avm2: Make Matrix3D.transformVector() native by @kjarosh in #24412
avm2: Make Matrix3D.appendRotation() a native method by @kjarosh in #24413
avm2: Make Matrix3D.identity()/appendTranslation() native by @kjarosh in #24414
avm2: Implement Matrix3D.copyRawDataFrom() properly by @kjarosh in #24437
Fte/textline composition by @doombubbles in #24371
render/swf: Allow Rgb15 format for
DefineBitsLossless2by @ChrisCPI in #24439avm2: Implement Matrix3D.copyRawDataTo() properly by @kjarosh in #24443
avm2: Improve the behavior of
TextBlock.releaseLinesby @Lord-McSweeney in #24425core: Make
Matrix3D.determinantmore accurate by @kjarosh in #24454core: Move
TDisplayObject::instantiateonto each enum variant that needs it by @Lord-McSweeney in #24446avm1: Improve behavior of
SoundwhenloadSound()has been called by @ChrisCPI in #23975avm2: Improve FP's buggy behavior in Vector3d.nearEquals() by @kjarosh in #24463
avm2: Improve accuracy of Number to String coercion by @kjarosh in #24459
desktop: Implement FreeType device font renderer by @kjarosh in #24418
avm2: Make remaining Matrix3D methods native and clean up code by @kjarosh in #24465
avm2: Use restargs instead of passing arguments as an array in Date methods by @Lord-McSweeney in #24466
avm2: Implement Matrix3D.interpolate and interpolateTo by @SulivanM in #24450
desktop: Gate FreeType behind a feature by @kjarosh in #24470
avm2: Use f64 sign methods in f64_to_string by @kjarosh in #24471
debug_ui/avm2: Move Class information into its own window by @Lord-McSweeney in #24456
tests: Add FreeType variants to more tests by @kjarosh in #24479
avm2: Add a method to ParametersExt to allow slicing it by @Lord-McSweeney in #24477
core: Split font.rs into multiple files by @kjarosh in #24482
swf: Support incorrect uncompressed lengths in LZMA SWFs by @kjarosh in #24487
avm1: Dynamically resolve builtin classes (1/N: preliminaries) by @moulins in #24327
video: Reduce allocations/copies when decoding frames by @moulins in #24135
avm2: Include attribute and element name in XML parser error 1104 by @evilpie in #24352
chore: Resolve clippy beta lints by @torokati44 in #24502
avm2: Refactor DisplayObjectContainer.stopAllMovieClips implementation by @Lord-McSweeney in #24506
desktop: Remove the wgpu-report-to-tracy-plot feature by @Dinnerbone in #24474
avm1: Dynamically resolve builtin classes (2/N:
Function,BitmapFilterss, display objects) by @moulins in #24500chore: Update translations from Crowdin by @kjarosh in #24517
avm2: In Sound constructor, call Sound.load from Actionscript by @Lord-McSweeney in #24512
avm1: Track activations in Tracy with
tracy_avmfeature by @Dinnerbone in #24511Update webbrowser to 1.2.4 due to RUSTSEC-2026-0257 by @Dinnerbone in #24488
core: Blit copyPixels rows through slices by @1bugproof in #24490
avm2: Use
ParametersExtfor ruffle stub methods by @Lord-McSweeney in #24523core: Don't degrade alpha for opaque alphaBitmapData pixels in copyPixels by @1bugproof in #24492
core: Replace the "deterministic" feature with LocaleBackend by @kjarosh in #24478
chore: Update translations from Crowdin by @kjarosh in #24528
chore: Drop clippy::float_cmp lint attributes by @kjarosh in #24526
tests: Expand test coverage for AVM2 primitive keys by @Lord-McSweeney in #24527
avm2: Match avmplus's index parsing logic more closely by @Lord-McSweeney in #24529
swf/avm2: Add
read_vec_with_leninternal helper by @moulins in #24531avm2: Make native methods take
FunctionArgsinstead of a slice by @Lord-McSweeney in #24534chore: Update translations from Crowdin by @kjarosh in #24538
Update to wgpu 30.0.1, egui 0.36.1, wasm-bindgen 0.2.127 by @Dinnerbone in #24520
avm2: Implement TextLine.getAtomIndexAtCharIndex by @doombubbles in #24497
desktop: Submit frame images to Tracy by @Dinnerbone in #18904
core: Make it possible to lay out text during render by @kjarosh in #24539
desktop: Profile wgpu into Tracy by @Dinnerbone in #24510
tests: Add test for caching callee object of AVM2 instance init method by @Lord-McSweeney in #24554
avm2: Have
MovieClip.addFrameScript()throw error 2001 for an odd number of args by @ChrisCPI in #24557wgpu: Pass UV(T) to shaders, rather than always calculating via a uniform by @Dinnerbone in #24555
desktop: Fix crashes resulting from handling egui texture deltas by @kjarosh in #24559
chore: Revert lazy blends, again by @Dinnerbone in #24564
render: Implement bitmap region rendering for wgpu by @kjarosh in #24525
avm2: Implement
flash.ui.Mouse.cursorby @ChrisCPI in #24578chore: Bump mocha to 12 by @torokati44 in #24584
build(deps-dev): bump replace-in-file from 8.4.0 to 9.0.0 in /web by @dependabot[bot] in #24422
avm2: Implement "unload" event on LoaderInfo by @kjarosh in #24579
avm1: Implement MovieClip.hitArea (part of #21569) by @FIM43-Redeye in #24227
avm2: Support default superclass object for callstatic op by @Lord-McSweeney in #24558
chore: Bump WebdriverIO package family to 9.31 by @torokati44 in #24583
build(deps): bump the npm-minor group across 1 directory with 14 updates by @dependabot[bot] in #24589
docs: Update CONTRIBUTING.md and add AI tool use policy by @kjarosh in #24571
chore: Update translations from Crowdin by @kjarosh in #24592
build(deps-dev): bump fast-uri from 3.1.5 to 3.1.7 in /web by @dependabot[bot] in #24593
chore: Bump gc-arena to 0.7.0, hashbrown to 0.17.1 by @torokati44 in #24588
chore: Update translations from Crowdin by @kjarosh in #24597
avm2: Expand the stubs for
Mouse.registerCursor()/unregisterCursor()by @ChrisCPI in #24586debug_ui: Add "Preview" tab to Display Objects by @kjarosh in #24522
build(deps): bump the cargo-minor group across 1 directory with 9 updates by @dependabot[bot] in #24598
chore: Run
npm audit fixin web/ by @torokati44 in #24603desktop: Implement font atlases and use them for FreeType by @kjarosh in #24568
render: Fix panic when calling
Context3D.drawTriangles()with no bound texture by @ChrisCPI in #24545core: Implement glyph cache eviction for font renderers by @kjarosh in #24608
web: Use font atlases in CanvasFontRenderer by @kjarosh in #24609
web: Allow variable bitmap glyph height by @kjarosh in #24610
wgpu: Mark profiler end-of-frame, fixes #24605 by @Dinnerbone in #24612
tests: Add avm2/bitmapdata_draw_cab_quality test by @kjarosh in #24613
core: Move font color to EvalParameters by @kjarosh in #24614
core: Store LayoutContext on LayoutBuilder by @kjarosh in #24616
chore: Update rascal to 0.3.5 by @Dinnerbone in #24623
tests: Add test coverage for the XML special case in indexOf methods by @Lord-McSweeney in #24618
--0.5.0--
chore: Bump actions/setup-node from 6 to 7 by @dependabot[bot] in #24256
chore: Bump actions/setup-python from 6 to 7 by @dependabot[bot] in #24255
chore: Bump KSXGitHub/github-actions-deploy-aur from 4.1.3 to 4.2.0 by @dependabot[bot] in #24257
chore: Bump fast-uri from 3.1.2 to 3.1.4 in /web by @dependabot[bot] in #24271
chore: Bump tar from 7.5.16 to 7.5.21 in /web by @dependabot[bot] in #24273
chore: Bump shell-quote from 1.8.4 to 1.10.0 in /web by @dependabot[bot] in #24270
chore: Bump svgo from 4.0.1 to 4.0.2 in /web by @dependabot[bot] in #24274
chore: Bump fast-xml-parser from 5.9.3 to 5.10.1 in /web by @dependabot[bot] in #24272
chore: Bump webdriverio and some @wdio packages to 9.30 in web/ by @torokati44 in #24276
chore: Run
npm audit fixin web/ by @torokati44 in #24277chore: Bump the npm-minor group across 1 directory with 10 updates by @dependabot[bot] in #24278
chore: Bump the cargo-minor group with 13 updates by @dependabot[bot] in #24260
avm2: Getters should always be listed after slots in JSON.stringify by @Lord-McSweeney in #24249
tests: Add coverage for calling methods on duplicate ClassObjects by @Lord-McSweeney in #24288
tests: Add assertions for current mouse cursor by @ChrisCPI in #24284
avm1: Serialize top-level objects with class definitions as appropriate by @danielhjacobs in #24155
avm1: Recursively serialize constructed objects as typed objects by @danielhjacobs in #24161
avm2: Correctly implement
DisplayObject.getRectby @Lord-McSweeney in #24253avm2: Clean up some FTE logic, add validation by @Lord-McSweeney in #24304
avm2: Handle shrinking underlying content in TextBlock.createTextLine by @evilpie in #24303
avm2: Handle null
elementFormatcorrectly when creating text line by @Lord-McSweeney in #24307tests: Expand the
avm2/avm1_roottest by @ChrisCPI in #24164video/webcodecs: Pass in whole Access Units to VideoDecoder by @torokati44 in #24098
chore: Bump the cargo-minor group with 4 updates by @dependabot[bot] in #24318
tests: Add failing test for AVM1 using attachMovie in a frame before ExportAssets by @evilpie in #24292
Polyfilled plugin properties remain configurable by @mincerafter42 in #24312
avm2: Clear parent when deleting element/attribute from XMLList by @evilpie in #24324
avm2: Implement XML.children using get_property_local by @evilpie in #24330
swf: Add dedicated error types
Avm1ParseErrorandUnexpectedEofby @moulins in #24334avm2: TLF improvements, implement TextBlock.recreateTextLine by @Lord-McSweeney in #24313
avm2: Implement XML.attribute(s) using get_property_local by @evilpie in #24340
avm2: Store content of
ContentElementsubclasses as native data by @Lord-McSweeney in #24338avm2: Implement more of XMLList using get_property_local by @evilpie in #24343
avm2: Only set
TextBlock.firstLinewhen creating the first line by @Lord-McSweeney in #24346avm2: Create a FormatSpans for the text block's content element in createTextLine by @Lord-McSweeney in #24351
swf: Return
AbcParseErroron error for AVM2 bytecode parsing. by @moulins in #24357avm2: Have
AVM1Movie.call/addCallbackthrow error 2014 by @ChrisCPI in #24358avm2: Implement several of the AV classes by @ChrisCPI in #24350
avm2: Emit
native_table.rsin a deterministic order by @bmwiedemann in #24360avm2: Partially implement the rest of
flash.trace.Traceby @ChrisCPI in #24344avm2: Minor FTE improvements by @Lord-McSweeney in #24354
--0.4.1--
ci: Fix version4 to respect extension manifest limit
--0.4.0--
Please refer to here.
--0.3.0--
Please refer to here.
--
Please refer to here for their almost daily consolidated update logs.
None to add for the moment...