FIDL design history

This page provides a starting point for navigating RFCs in the “FIDL” area. It organizes them in various ways and gives an updated status on each, bringing the reader up to speed with FIDL's history and current direction.

Previously, these design documents were called FTPs or FIDL Tuning Proposals. The FTP process was later merged into the RFC process. Because of the way FTPs were renumbered as RFCs, RFC numbers do not imply chronology. However, each individual list on this page shows RFCs in chronological order: by submission date for FTP-turned-RFCs, and by review date for all later RFCs.

By theme

This section organizes FIDL RFCs by theme. Each RFC is listed once, under its primary theme, even if it touches on multiple themes.

Governance

Evolvability

Expressivity

Syntax

Ergonomics

Performance

Safety & security

Tooling

Documentation

Simplify design space

By language feature

This section lists RFCs that introduced new feature that are easily visible in the FIDL language. It only includes current features, not obsolete ones.

FeatureRFCNote
struct defaultsRFC-0022Default values for struct members
tableRFC-0047Forward and backward compatible data type
///RFC-0055Documentation comments
struct Empty {};RFC-0056Empty structs
errorRFC-0060Method error result syntax
unionRFC-0061Initially called xunion, replaced the old static unions
@selectorRFC-0020Override method hashing with an explicit selector
@transitionalRFC-0021Attribute for soft transitioning method addition/removal
composeRFC-0023Renamed interface to protocol, added the compose feature
bitsRFC-0025Bit flags types
strict, flexibleRFC-0033Strict and flexible types
handle rightsRFC-0028Annotate required or excluded handle rights
serviceRFC-0041Services are collection of protocols
alias, typeRFC-0052Replaced using aliases with alias and type
resourceRFC-0057Value and resource types
anonymous layoutsRFC-0050Inline type definitions, named contextually or with @generated_name
@availableRFC-0083Version annotations
Method(table { ... })RFC-0087Tables and unions as top-level request/response types
open, closed, ajarRFC-0138Open and closed interactions

Current status

This section gives the current status of all FIDL RFCs.

Legend:

StatusMeaning
UnpublishedNever made public nor formally reviewed
WithdrawnMade public, but never formally reviewed
In reviewMade public, review pending
ImplementedAccepted, implemented, still accurate
Partially implementedAccepted and partially implemented, no plans to finish
Implementation in progressAccepted, implementation in progress
AmendedAccepted, still mostly accurate, but amended by a later RFC
SupersededAccepted but no longer accurate, superseded by a later RFC
RejectedFormally rejected
Rejected; SupersededFormally rejected, then superseded by a later RFC
RFCTitleStatus
RFC-0018FTP process: A modest proposalSuperseded by RFC-0017
RFC-0019Type aliases with usingSuperseded by RFC-0052
RFC-0022Default values for struct membersPartially implemented: only in HLCPP, Dart
RFC-0051Safer structs for C++Rejected
RFC-0062Method impossibleRejected
RFC-0053EpitaphsImplemented
RFC-0066Programmer advisory explicit defaultsImplemented
RFC-0047TablesAmended by RFC-0116, RFC-0132
RFC-0055Documentation commentsAmended by RFC-0043
RFC-0063OrdinalRangeRejected; Superseded by RFC-0020
FIDL in FIDLUnpublished; Protobuf can do this
RFC-0056Empty structsImplemented
RFC-0058Introduce a deprecated attributeSuperseded by RFC-0083
RFC-0060Error handlingImplemented
RFC-0061Extensible unionsImplemented
RFC-0065No optional strings or vectorsRejected
RFC-0064Box<Knox>Rejected; see also “FIDL large message support”
SequencesUnpublished; earlier version of “Streams”
StreamsUnpublished; see also measure-tape (a pragmatic solution)
RFC-0020Interface ordinal hashingImplemented
RFC-0021Soft transitions for methods add and removeImplemented
RFC-0023Compositional model for protocolsImplemented
RFC-0045Zero-size empty structsRejected
RFC-0025Bit flagsImplemented
RFC-0026Envelopes everywhereRejected
RFC-0027You only pay for what you useImplemented
RFC-0030FIDL is little endianImplemented
RFC-0031Typed epitaphsRejected
RFC-0032Efficient envelopesRejected; Superseded by RFC-0113
RFC-0033Handling of unknown fields and strictnessAmended by RFC-0137
RFC-0034Null terminate stringsRejected
RFC-0029Increasing method ordinalsSuperseded by RFC-0037
RFC-0035Automatic flow tracingRejected
RFC-0036Update to struct declarationsRejected
RFC-0037Transactional message header v3Implemented
RFC-0038Separating layout from constraintsRejected; Superseded by RFC-0050
RFC-0039Types come secondRejected; Superseded by RFC-0050
RFC-0028Handle rightsImplemented
RFC-0042Non nullable typesRejected (April Fools)
RFC-0024Mandatory source compatibilityImplemented; see also source_compatibility
RFC-0040Identifier uniquenessImplemented (rejected at first, later accepted)
RFC-0041Support for unifying services and devicesPartially implemented: only in C++, Rust
RFC-0044Extensible method argumentsRejected; Superseded by RFC-0087
RFC-0043Documentation comment formatImplemented
VersioningUnpublished; Superseded by RFC-0083
Required table fieldsUnpublished
RFC-0048Explicit union ordinalsImplemented
RFC-0049FIDL tuning process evolutionSuperseded by RFC-0017
Unified view of optionalityUnpublished
IteratorsUnpublished; see also measure-tape (a pragmatic solution)
RFC-0054Parameter attributesSuperseded by RFC-0050
RFC-0052Type aliasing and new typesImplementation in progress
Restrict non-numeric floating point valuesUnpublished
Constant expressionsUnpublished
RFC-0057Default no handlesImplemented
RFC-0050Syntax revampAmended by RFC-0086, RFC-0087, [RFC-0088]
FIDL text formatUnpublished
RFC-0059Reserved bits in vector, string, and array count fieldsImplemented; reserved bits no longer used by LLCPP
RFC-0017The FTP Process is dead, long live the RFC Process!Implemented
FIDL Large message supportWithdrawn
RFC-0076FIDL API summariesImplemented
RFC-0083FIDL versioningImplementation in progress
RFC-0086Updates to RFC-0050: FIDL attributes syntaxImplemented
[RFC-0088]Updates to RFC-0050: FIDL bits, enum, and constraints syntaxRejected
RFC-0087Updates to RFC-0050: FIDL method parameter syntaxImplementation in progress
RFC-0097FIDL ToolchainImplementation in progress
RFC-0113Efficient envelopesImplemented
RFC-0114Inlining small values in FIDL envelopesImplemented
RFC-0116Wire format support for sparser FIDL tablesRejected
RFC-0120Standalone use of the FIDL wire formatImplementation in progress
RFC-0131Design principles of the FIDL wire formatImplemented
RFC-0132FIDL table size limitImplemented
RFC-0137Discard unknown data in FIDLImplementation in progress
RFC-0138Handling unknown interactionsImplementation in progress
RFC-0149FIDL encode validation not mandatoryImplemented
Remove support for FIDL struct defaultsIn review
Terminal eventsIn review