Full Changelog: pyiceberg-0.8.0...pyiceberg-0.9.0
There have been 243 new commits since the last minor release, 0.8.0, including 148 commits from various contributors and 95 from Dependabot. This release features contributions from 63 unique contributors, including 33 first-time contributors.
What's Changed
New Features
- Introduced the capability to perform
UPSERT
operations on their table directly within PyIceberg. - Added support for dynamic overwrites as an optimization when an entire partition is replaced.
- Implemented
namespace_exists
functionality for the REST catalog. - Extended the table updates to include new
remove-snapshot-ref
andremove-snapshot
action - Added
view_exists
method to the REST catalog as a part of the effort to add view support to the REST Catalog. - Implemented support for Alibaba OSS protocol in PyArrowFileIO
- Introduced read support for the Iceberg V3 spec.
- Added support for Location Providers for tables which includes the
ObjectStoreLocationProvider
and also enables for custom write paths for both data and metadata. - Extended
S3FileIO
operations to allow for cross region read support. - Introduced support to convert Iceberg table scan to
polars
DataFrame and LazyFrame. - Added support for the
all_manifests
metadata table. - Implemented support for writes to bucket partitioned tables.
- Added automatic metadata cleanup to iceberg tables via
write.metadata.delete-after-commit.enabled
. - Introduced syntactic sugar for
and
andor
operations in filters. - Implemented configurable S3 request timeout settings for better performance tuning.
- Add support to use
apache/iceberg-rest-fixture
image for integration tests - Introduced support to update table statistics
- Add support for Bucket and Truncate transforms utilizing
pyiceberg_core
(iceberg-rust
) - Add support for column projections from partition metadata
- Add support for
ResidualEvaluator
Deprecations
Catalog & Table Identifiers
- Parsing catalog-level identifiers in Catalog references is deprecated
- Please refer to tables using only their namespace and table name
Table.identifier
property is deprecated- Use
Table.name()
instead
- Use
Expression Parsing
- Parsing expressions with table names is deprecated
- Only provide field names in
row_filter
- Only provide field names in
Configuration Properties
rest.authorization-url
property is deprecated- Use
oauth2-server-uri
instead
- Use
gcs.endpoint
property is deprecated- Use
gcs.service.host
instead
- Use
- Properties starting with
adlfs.
are deprecated- Use properties that start with
adls.
- Use properties that start with
Table API Changes
project_table
is deprecated- Use
ArrowScan.to_table()
instead - Use
ArrowScan.to_record_batches()
instead
- Use
Name Mapping
NameMapping.find
is deprecated- Use
apply_name_mapping
instead
- Use
Table Update Field Removal
- The
initial_change
field has been removed from table updates, affecting:AddSchemaUpdate
AddPartitionSpecUpdate
AddSortOrderUpdate
Table Class Refactoring
Several table classes have been moved to private classes:
pyiceberg.table.Move
→pyiceberg.table.update.schema._Move
pyiceberg.table.MoveOperation
→pyiceberg.table.update.schema._MoveOperation
pyiceberg.table.DeleteFiles
→pyiceberg.table.update.snapshot._DeleteFiles
pyiceberg.table.FastAppendFiles
→pyiceberg.table.update.snapshot._FastAppendFiles
pyiceberg.table.MergeAppendFiles
→pyiceberg.table.update.snapshot._MergeAppendFiles
pyiceberg.table.OverwriteFiles
→pyiceberg.table.update.snapshot._OverwriteFiles
Table Properties Refactoring
Several constants have been moved to TableProperties
:
DEFAULT_MAX_SNAPSHOT_AGE_MS
→TableProperties.MAX_SNAPSHOT_AGE_MS_DEFAULT
DEFAULT_MIN_SNAPSHOTS_TO_KEEP
→TableProperties.MIN_SNAPSHOTS_TO_KEEP_DEFAULT
Documentation Updates
- Added documentation for the new
UPSERT
operation support. - Added documentation of the new
LocationProvider
feature. - Improve the
"How to Release"
documentation. - Add documentation linking to community contributing guidelines
- Add documentation on nightly build
Bug Fixes
- Fixed
KeyError
inadd_files
for Parquet files missing column stats. - Fixed
Table.scan
case sensitivity handling. - Resolved
TypeError
increate_match_filter
for composite keys. - Allowed leading underscore in column name used in row filter.
- Ensured correct statistics updates by removing redundant
snapshot_id
inSetStatisticsUpdate
. - Fixed namespace existence check for multi-level namespaces in
SqlCatalog
. - Improved handling of S3 request timeouts.
- Fixed
TypeError
in composite key joins.
Dependencies
- Remove
python
3.13 upper bound restriction - Remove
fsspec
upper bound restriction - Bump
PyArrow
to 19.0.0
Infra
- Improve and automate release process using github workflow
- Add support for testpypi nightly build
- Add
codespell
to pre-commit - Replace
pycln
withruff
Commits
Features
- Set default for
SortField
'stransform
by @kevinjqliu in #1347 - Boto Glue standard retry policy with configuration by @mark-major in #1307
- TEST: adopt new rest catalog image and enable tableExists tests by @sungwy in #1389
- Added force virtual addressing configuration for S3, Alibaba OSS protocol to use PyArrowFileIO by @helmiazizm in #1392
- Deserialize NestedField initial-default and write-default Attributes by @paulcichonski in #1432
- Snapshot: Make manifest-list required by @Fokko in #1385
- Implementing namespace_exists function on the REST Catalog by @AhmedNader42 in #1434
- Add Support for Dynamic Overwrite by @jqin61 in #931
- URL-encode partition field names in file locations by @smaheshwar-pltr in #1457
- Fix read from multiple s3 regions by @jiakai-li in #1453
- Nit fixes to URL-encoding of partition field names by @smaheshwar-pltr in #1499
- Support Location Providers by @smaheshwar-pltr in #1452
- Add
all_manifests
metadata table with tests by @soumya-ghosh in #1241 - Use
ObjectStoreLocationProvider
by default by @smaheshwar-pltr in #1509 - Improve
LocationProvider
unit tests by @smaheshwar-pltr in #1511 - Add table statistics by @ndrluis in #1285
- feat: Support Bucket and Truncate transforms on write by @sungwy in #1345
- ADLS: Support Vended Credentials by @Fokko in #1520
- Add V3 read support by @Fokko in #1554
- feat: support datetime objects in literal instantiation by @jayceslesar in #1542
- Make s3.request_timeout configurable by @metadaddy in #1568
- Update annotation with V3 by @Fokko in #1587
- Add
view_exists
method to REST Catalog by @shiv-io in #1242 - Hive metastore register table by @JoniKet in #1580
- Add support for
write.data.path
by @Fokko in #1611 - Accept date in literal by @TennyZhuang in #1618
- Implement column projection by @gabeiglio in #1443
- feat: implement InMemoryCatalog as a subclass of SqlCatalog by @hussein-awala in #1140
- Add base headers in properties to signer_headers by @tom-s-powell in #1610
- Add ResidualVisitor to compute residuals by @tusharchou in #1388
- Implement
write.metadata.delete-after-commit.enabled
to clean up old metadata files by @kaushiksrini in #1607 - feat: search current working directory for config file by @IndexSeek in #1464
- Feat/add support kerberize hivemetastore by @Fokko in #1634
- Added support for Polars DataFrame and LazyFrame by @yigal-rozenberg in #1614
- Filter rows directly from pa.RecordBatch by @gabeiglio in #1621
- Add table upsert support by @kevinjqliu in #1660
- Add support for
write.metadata.path
by @geruh in #1642 - Implement update for
remove-snapshot-ref
action by @grihabor in #1598 - Implement update for
remove-snapshots
action by @grihabor in #1561 - Add syntactic sugar for
and
andor
operation by @Fokko in #1697
Documentations
- Improve documentation for "how to release" by @kevinjqliu in #1359
- 0.8.0 post release steps by @kevinjqliu in #1334
- check mkdocs build strict in CI by @kevinjqliu in #1360
- Add instruction for patch release by @kevinjqliu in #1373
- Extend bugfix report by @Fokko in #1380
- docs: Add link to GitHub release notes by @manuzhang in #1394
- docs: Use
load_catalog
instead by @Fokko in #1406 - docs: fixed code example. by @kunnapatt in #1445
- [DOCS] Add RESTCatalog-specific headers table by @EternalDeiwos in #1446
- docs: various spelling fixes by @IndexSeek in #1471
- Change dot notation in add column documentation to tuple by @jeppe-dos in #1433
- docs: Add docstrings for Identifier, Properties, RecursiveDict by @rodrigc in #1530
- Docs: Location Provider Documentation by @smaheshwar-pltr in #1537
- Fix statistics documentation by removing snapshot_id references by @ndrluis in #1570
- [docs] Link community contributing guidelines by @kevinjqliu in #1579
- automate building Release Candidate in github action by @kevinjqliu in #1391
- Add upsert docs by @Fokko in #1665
- [docs] add docs about nightly build by @kevinjqliu in #1670
- Add instruction to install shell plugin to doc by @gabeiglio in #1674
- [docs] update new iceberg catalog link by @kevinjqliu in #1701
- Update docs to reflect default location provider by @geruh in #1724
Bug Fixes
- use the non-deprecated func to parse identifier by @kevinjqliu in #1326
- Ignore tables without table_type parameters while loading all iceberg table from Glue and Hive catalog by @gitzwz in #1332
- dont override global warning by @kevinjqliu in #1350
- Allow leading underscore in column name used in row filter by @vincenzon in #1358
- fix
KeyError
raised byadd_files
when parquet file doe not have column stats by @binayakd in #1354 - Write
null
when there is no parent-snapshot-id by @Fokko in #1383 - fix warnings from newer versions of dependencies by @kevinjqliu in #1414
- 0.8.1 post release by @kevinjqliu in #1410
- Add
_missing_
to makeFileFormat
case insensitive by @jiakai-li in #1411 - Fix
Table.scan
to enable case sensitive argument by @jiakai-li in #1423 - Update StrictProjection tests by @Fokko in #1422
- fix: field id in name mapping should be optional by @barronw in #1426
- Signer: Make token optional by @Fokko in #1447
- Remove unneeded partitioning by @Fokko in #1417
- Remove deprecation warnings in test by @kevinjqliu in #1416
- Added support for lowercase FileFormat for Issue #1340 by @hgollakota in #1362
- Revert "Add support for lowercase
FileFormat
(#1362)" by @Fokko in #1518 - Modified exception objects being thrown when converting Pyarrow tables by @DevChrisCross in #1498
- Refactor
bucket
transform types by @Fokko in #1562 - Refactor
{year,month,day,hour}
transform by @Fokko in #1563 - PyArrow: Avoid buffer-overflow by avoid doing a sort by @Fokko in #1555
- follow up #1555, bring back tests by @kevinjqliu in #1567
- Remove redundant snapshot_id from SetStatisticsUpdate by @ndrluis in #1566
- Return an empty dict if nan values is not provided by the catalog by @summermousa-vendia in #1575
- Log exception when FileIO import fails by @rshkv in #1578
- Move from
types_extensions
totypes
by @Fokko in #1586 - Test transform function consistency for all transforms by @kevinjqliu in #1573
- fsspec: Remove
botocore
as a module import by @Fokko in #1609 - fix new requirements handling by @ZENOTME in #1631
- Remove
_task_to_table
by @Fokko in #1643 - Upsert: Reuse existing expression to detect rows to be inserted by @Fokko in #1662
- fix: SqlCatalog namespace_exists should work with multi-level namespaces by @alessandro-nori in #1671
- [Bug Fix] Avoid reusing shared metrics evaluator across threads by @rachel88888 in #1664
- AWS: Undeprecate
botocore_session
by @Fokko in #1692 - Fix TypeError in create_match_filter for Composite Keys with Single Unique Condition by @omkenge in #1693
- Raise explicit error when join columns cannot be found by @Fokko in #1698
- Allow upserting into an empty table by @Fokko in #1699
- Use a join for upsert deduplication by @Fokko in #1685
- Remove top-level import of
pyarrow
by @kevinjqliu in #1703 - Upsert: Align codestyle by @Fokko in #1710
- Arrow: Suppress warning and cache bucket location by @Fokko in #1709
- Turn
ObjectStoreLocationProvider
off by default by @kevinjqliu in #1722 - fix loading
in-memory
catalog by @kevinjqliu in #1725 - Deprecations
- Remove support for catalog_name in table identifier string by @sungwy in #963
- Replace reference of
Table.identifier
withTable.name
by @kevinjqliu in #1346 - Remove parsing table name in
row_filter
by @geruh in #1689 - REST: Remove deprecated
AUTH_URL
by @Fokko in #1691 - IO: Remove deprecations by @Fokko in #1519
- remove
0.9.0
deprecated by @kevinjqliu in #1448 - Remove deprecated
datetime
functions by @hussein-awala in #1134 - Deprecate the use of
last-column-id
by @Fokko in #1367
Dependencies
- Remove Python 3.13 upper bound restriction by @bigluck in #1355
- Bump PyArrow to 19.0.0 by @Fokko in #1526
- Drop upper bounds for fsspec and it's implementations by @sumanth-manchala in #1341
- Tests: Bump Spark to 3.5.3 by @Fokko in #1322
- Bump
pre-commit
versions by @Fokko in #1344 - Build: Bump 3rd party deps by @Fokko in #1454
- bump version to 0.9.0 by @kevinjqliu in #1489
- Add poetry extra for rest-sigv4 dependencies (boto3) by @paulmech in #1415
- Bump Poetry to 1.8.4 by @Fokko in #1379
- Bump to Poetry 1.8.5 by @Fokko in #1455
- Bump Poetry to 2.0.1 by @Fokko in #1525
- [infra] update poetry if necessary by @kevinjqliu in #1656
- Upgrade
cryptography
dependency to v44.0.1 by @kevinjqliu in #1651 - Bump to Iceberg Java 1.8.0 by @Fokko in #1633
- [infra] Update pyspark java iceberg library to 1.6.0 by @kevinjqliu in #1462
Infra
- [infra] refactor release github workflow by @kevinjqliu in #1600
- [infra] clean up cibuildwheel build by @kevinjqliu in #1599
- [infra] add testpypi nightly build by @kevinjqliu in #1601
- Update
upload-artifact
to use v4 by @kevinjqliu in #1371 - Build: Upgrade to RAT 0.16.1, scanning hidden directories and adding missing ASF headers by @manuzhang in #1396
- Build: Don't run CI on unrelated changes by @manuzhang in #1395
- [INFRA] make integration test more resilient to intermittent failures by @kevinjqliu in #1412
- Build: Delete branch automatically on PR merge by @manuzhang in #1408
- docker: The
archive
seems unstable by @Fokko in #1425 - Remove
version
fromdocker-compose
by @Fokko in #1438 - ci: configure codespell in pre-commit by @IndexSeek in #1478
- [infra] replace
pycln
withruff
by @kevinjqliu in #1485 - [infra] Move
mkdocs
to use poetry asdocs
group dep by @kevinjqliu in #1486 - [infra] download Spark from
archive.apache.org
by @kevinjqliu in #1523 - fix: remove check-docstring-first pre-commit check by @rodrigc in #1531
- [infra] regenerate poetry lock by @kevinjqliu in #1538
- Update NOTICE copyright end year to 2025 by @kevinjqliu in #1557
- Fix ci by @kevinjqliu in #1638
- Break circular import by @Fokko in #1639
- Repo: Set status checks to strict by @Fokko in #1640
Dependabot
- Bump coverage from 7.6.4 to 7.6.5 by @dependabot in #1325
- Bump mkdocstrings from 0.26.2 to 0.27.0 by @dependabot in #1324
- Bump coverage from 7.6.5 to 7.6.7 by @dependabot in #1329
- Bump aiohttp from 3.10.5 to 3.10.11 by @dependabot in #1338
- Bump moto from 5.0.20 to 5.0.21 by @dependabot in #1339
- Bump mypy-boto3-glue from 1.35.53 to 1.35.65 by @dependabot in #1343
- Bump deptry from 0.21.0 to 0.21.1 by @dependabot in #1342
- Bump pydantic from 2.9.1 to 2.10.0 by @dependabot in #1352
- Bump mkdocs-material from 9.5.44 to 9.5.45 by @dependabot in #1351
- Bump pydantic from 2.10.0 to 2.10.1 by @dependabot in #1364
- Bump getdaft from 0.3.13 to 0.3.14 by @dependabot in #1361
- Bump mkdocs-material from 9.5.45 to 9.5.46 by @dependabot in #1376
- Bump coverage from 7.6.7 to 7.6.8 by @dependabot in #1375
- Bump pypa/cibuildwheel from 2.21.3 to 2.22.0 by @dependabot in #1374
- Bump pydantic from 2.10.1 to 2.10.2 by @dependabot in #1382
- Bump pyarrow from 18.0.0 to 18.1.0 by @dependabot in #1381
- Bump moto from 5.0.21 to 5.0.22 by @dependabot in #1399
- Bump mypy-boto3-glue from 1.35.65 to 1.35.74 by @dependabot in #1398
- Bump pydantic from 2.10.2 to 2.10.3 by @dependabot in #1403
- Bump mkdocs-material from 9.5.46 to 9.5.47 by @dependabot in #1402
- Bump coverage from 7.6.8 to 7.6.9 by @dependabot in #1413
- Bump mkdocs-material from 9.5.47 to 9.5.48 by @dependabot in #1419
- Bump mypy-boto3-glue from 1.35.74 to 1.35.80 by @dependabot in #1428
- Bump mkdocs-material from 9.5.48 to 9.5.49 by @dependabot in #1437
- Bump adlfs from 2024.7.0 to 2024.12.0 by @dependabot in #1436
- Bump moto from 5.0.22 to 5.0.23 by @dependabot in #1435
- Bump boto3 from 1.35.36 to 1.35.81 by @dependabot in #1440
- Bump pydantic from 2.10.3 to 2.10.4 by @dependabot in #1444
- Bump getdaft from 0.3.15 to 0.4.0 by @dependabot in #1450
- Bump moto from 5.0.23 to 5.0.24 by @dependabot in #1451
- Bump fastavro from 1.9.7 to 1.10.0 by @dependabot in #1460
- Bump deptry from 0.21.1 to 0.21.2 by @dependabot in #1459
- Bump mypy-boto3-glue from 1.35.80 to 1.35.87 by @dependabot in #1468
- Bump jinja2 from 3.1.4 to 3.1.5 by @dependabot in #1467
- Bump griffe from 1.5.1 to 1.5.4 by @dependabot in #1474
- Bump coverage from 7.6.9 to 7.6.10 by @dependabot in #1473
- Bump mkdocstrings-python from 1.12.2 to 1.13.0 by @dependabot in #1472
- Bump boto3 from 1.35.81 to 1.35.88 by @dependabot in #1476
- Bump moto from 5.0.24 to 5.0.25 by @dependabot in #1475
- Bump pyparsing from 3.2.0 to 3.2.1 by @dependabot in #1481
- Bump moto from 5.0.25 to 5.0.26 by @dependabot in #1490
- Build: Bump pytest-checkdocs from 2.10.1 to 2.13.0 by @dependabot in #682
- Build: Bump boto3 from 1.35.88 to 1.35.93 by @dependabot in #1495
- Build: Bump mypy-boto3-glue from 1.35.87 to 1.35.93 by @dependabot in #1496
- Build: Bump pydantic from 2.10.4 to 2.10.5 by @dependabot in #1504
- Build: Bump getdaft from 0.4.1 to 0.4.2 by @dependabot in #1503
- Build: Bump sqlalchemy from 2.0.36 to 2.0.37 by @dependabot in #1502
- Build: Bump deptry from 0.21.2 to 0.22.0 by @dependabot in #1508
- Build: Bump mkdocs-autorefs from 1.2.0 to 1.3.0 by @dependabot in #1513
- Build: Bump mypy-boto3-glue from 1.35.93 to 1.36.0 by @dependabot in #1522
- Build: Bump griffe from 1.5.4 to 1.5.5 by @dependabot in #1528
- Build: Bump boto3 from 1.35.93 to 1.36.1 by @dependabot in #1536
- Build: Bump moto from 5.0.26 to 5.0.27 by @dependabot in #1545
- Build: Bump pre-commit from 4.0.1 to 4.1.0 by @dependabot in #1544
- Build: Bump mkdocs-material from 9.5.49 to 9.5.50 by @dependabot in #1543
- Build: Bump actions/stale from 9.0.0 to 9.1.0 by @dependabot in #1558
- Build: Bump cachetools from 5.5.0 to 5.5.1 by @dependabot in #1559
- Build: Bump boto3 from 1.36.1 to 1.36.3 by @dependabot in #1564
- Build: Bump mypy-boto3-glue from 1.36.0 to 1.36.4 by @dependabot in #1565
- Build: Bump pydantic from 2.10.5 to 2.10.6 by @dependabot in #1576
- Build: Bump mmh3 from 5.0.1 to 5.1.0 by @dependabot in #1583
- Build: Bump deptry from 0.22.0 to 0.23.0 by @dependabot in #1584
- Build: Bump mkdocs-material from 9.5.50 to 9.6.1 by @dependabot in #1595
- Build: Bump getdaft from 0.4.2 to 0.4.3 by @dependabot in #1596
- Build: Bump griffe from 1.5.5 to 1.5.6 by @dependabot in #1593
- [infra] bump dependabot open PR limit by @kevinjqliu in #1597
- Build: Bump moto from 5.0.27 to 5.0.28 by @dependabot in #1603
- Build: Bump mkdocs-material from 9.6.1 to 9.6.2 by @dependabot in #1605
- Build: Bump mkdocstrings from 0.27.0 to 0.28.0 by @dependabot in #1604
- Build: Bump mkdocstrings-python from 1.13.0 to 1.14.4 by @dependabot in #1612
- Build: Bump mkdocstrings-python from 1.14.4 to 1.14.5 by @dependabot in #1616
- Build: Bump duckdb from 1.1.3 to 1.2.0 by @dependabot in #1617
- Build: Bump sqlalchemy from 2.0.37 to 2.0.38 by @dependabot in #1620
- Build: Bump mkdocs-material from 9.6.2 to 9.6.3 by @dependabot in #1625
- Build: Bump mkdocstrings-python from 1.14.5 to 1.14.6 by @dependabot in #1624
- Build: Bump coverage from 7.6.10 to 7.6.11 by @dependabot in #1641
- Build: Bump cython from 3.0.11 to 3.0.12 by @dependabot in #1646
- Build: Bump coverage from 7.6.11 to 7.6.12 by @dependabot in #1648
- Build: Bump mkdocs-autorefs from 1.3.0 to 1.3.1 by @dependabot in #1650
- Build: Bump griffe from 1.5.6 to 1.5.7 by @dependabot in #1647
- Build: Bump mkdocstrings-python from 1.14.6 to 1.15.0 by @dependabot in #1649
- Build: Bump mkdocs-material from 9.6.3 to 9.6.4 by @dependabot in #1657
- Build: Bump mkdocstrings from 0.28.0 to 0.28.1 by @dependabot in #1676
- Build: Bump mkdocstrings-python from 1.15.0 to 1.16.0 by @dependabot in #1675
- Build: Bump mkdocstrings-python from 1.16.0 to 1.16.1 by @dependabot in #1686
- Build: Bump getdaft from 0.4.3 to 0.4.4 by @dependabot in #1687
- Build: Bump pyarrow from 19.0.0 to 19.0.1 by @dependabot in #1688
- Build: Bump mkdocs-material from 9.6.4 to 9.6.5 by @dependabot in #1696
- Build: Bump cachetools from 5.5.1 to 5.5.2 by @dependabot in #1695
- Build: Bump boto3 from 1.36.3 to 1.36.23 by @dependabot in #1694
- Build: Bump mkdocs-autorefs from 1.3.1 to 1.4.0 by @dependabot in #1712
- Build: Bump moto from 5.0.28 to 5.1.0 by @dependabot in #1713
- Build: Bump polars from 1.22.0 to 1.23.0 by @dependabot in #1715
- Build: Bump mypy-boto3-glue from 1.36.4 to 1.37.0 by @dependabot in #1716
- Build: Bump datafusion from 44.0.0 to 45.2.0 by @dependabot in #1714
New Contributors
- @sumanth-manchala made their first contribution in #1341
- @gitzwz made their first contribution in #1332
- @vincenzon made their first contribution in #1358
- @bigluck made their first contribution in #1355
- @binayakd made their first contribution in #1354
- @paulmech made their first contribution in #1415
- @helmiazizm made their first contribution in #1392
- @jiakai-li made their first contribution in #1411
- @AhmedNader42 made their first contribution in #1434
- @barronw made their first contribution in #1426
- @kunnapatt made their first contribution in #1445
- @EternalDeiwos made their first contribution in #1446
- @IndexSeek made their first contribution in #1471
- @smaheshwar-pltr made their first contribution in #1457
- @jeppe-dos made their first contribution in #1433
- @hgollakota made their first contribution in #1362
- @rodrigc made their first contribution in #1531
- @DevChrisCross made their first contribution in #1498
- @summermousa-vendia made their first contribution in #1575
- @rshkv made their first contribution in #1578
- @metadaddy made their first contribution in #1568
- @shiv-io made their first contribution in #1242
- @JoniKet made their first contribution in #1580
- @TennyZhuang made their first contribution in #1618
- @ZENOTME made their first contribution in #1631
- @gabeiglio made their first contribution in #1443
- @tom-s-powell made their first contribution in #1610
- @tusharchou made their first contribution in #1388
- @kaushiksrini made their first contribution in #1607
- @yigal-rozenberg made their first contribution in #1614
- @grihabor made their first contribution in #1598
- @alessandro-nori made their first contribution in #1671
- @rachel88888 made their first contribution in #1664