Editor’s note: This Singer review is based on my hands-on test of singer-python 6.8.0 and the Meltano Singer SDK 0.54.9 on October 30, 2026. I weighed cost, setup effort, connector quality, maintenance, and alternatives.
Quick verdict: I recommend Singer for Python data engineers building custom connectors for niche sources, or teams already using Meltano or Stitch. Skip its catalog for install-and-forget ingestion: 3 of 5 published connectors crashed on Python 3.14.3 before reading a row.
Singer is a specification plus an Apache-2.0 library, not a hosted ELT product. Its JSON-lines contract lets compatible taps and targets communicate over a Unix pipe; you supply the operating infrastructure.
In this Singer review, I’ll take a closer look at cost, setup, the spec, the Meltano SDK, connector maintenance, and alternatives, so you can see exactly whether Singer belongs in your stack.
Key Takeaways
- Free Apache-2.0 library: My first working tap used 36 lines of Python against a local SQLite source.
- Incremental resume worked: A saved bookmark resumed extraction with 1,001 changed or new records.
- Connector compatibility is uneven: Three published connectors failed on Python 3.14.3 despite separate environments.
- The spec remains at v0.3.0: I recommend the Meltano SDK for new connector development.
- No built-in operating platform: You supply scheduling, state storage, and monitoring for self-hosted pipelines.
Pros and Cons
Pros
- The singer-python core library is free to use under the Apache-2.0 license.
- My working singer-python tap used 36 lines of Python against a local SQLite source.
- My Meltano SDK tap successfully sent records into the older target-jsonl package.
- Saved-state resume extracted 1,001 changed or new records from my local orders table.
- Meltano Hub contains 655 extractor entries for teams choosing source connectors.
Cons
- Three of five published connectors crashed on Python 3.14.3 before reading data.
- Thirty-three singer-io tap repositories had no push in the preceding two years.
- Singer supplies no built-in state store for saving checkpoints between pipeline runs.
- The updated order appeared in both JSONL files after my incremental run.
How Much Does Singer Cost?
Singer has no subscription price. The singer-python library is free under Apache-2.0, but individual connector licenses differ: tap-hubspot and tap-github use AGPL-3.0. Check the specific repository’s license before embedding a tap in a commercial product.
Choose between running connectors yourself and paying a separate service such as Stitch:
- Singer taps and targets (Free): for engineers running connector processes on their own infrastructure.
- Meltano (Free, MIT): for teams wanting a CLI to manage configuration, selection, state, and schedule definitions. Meltano Cloud has shut down.
- Stitch Standard (from $100/month): for managed ingestion, with selectable volumes from 5 million to 300 million rows, one destination, 10 Standard sources, and five users.
- Stitch Advanced ($1,500/month, billed annually): for 100 million rows, three destinations, and unlimited Enterprise sources.
- Stitch Premium ($3,000/month, billed annually): for 1 billion rows and five destinations.
Stitch offers a 14-day trial without a card. These are its US prices; the Standard starting price does not buy the entire selectable row range.
| Option | Price | What you get | What you still run yourself |
|---|---|---|---|
| Bare Singer | Free | Protocol and connector library | Connector processes and operating infrastructure |
| Meltano | Free, MIT | Singer project management and runner | Hosting, scheduler, and monitoring |
| Stitch Standard | From $100/month | Managed ingestion, 1 destination | Custom extraction feeding the Import API, if needed |
| Stitch Advanced | $1,500/month, billed annually | 100M rows, 3 destinations | Custom extraction, if needed |
| Stitch Premium | $3,000/month, billed annually | 1B rows, 5 destinations | Custom extraction, if needed |
Is Singer Good Value for Money?
- Good fit: I recommend Singer for a source that requires custom extraction anyway. Its reusable message format makes that code useful beyond a single destination.
- Less convincing fit: Skip an abandoned tap when repairing its dependencies costs more engineering time than building or buying a replacement.
- Budget priority: Include infrastructure and maintenance labor. Singer supplies neither a hosted runtime nor an operator, so assign responsibility for failed runs before adopting it.
Airbyte Standard starts at $20/month, while Fivetran’s free plan includes 500,000 monthly active rows. Both deserve consideration before paying Stitch’s starting price for a small workload. Credits, replicated rows, and active rows are different billing units; estimate your workload in each service’s unit.
Stitch’s community integrations remain community-maintained, with commercial support limited to Advanced or Premium. Stitch also builds custom integrations only on those tiers. Choose Standard for integrations that already fit, rather than budgeting $100/month for custom development.
Reviewer’s Notes: I recommend starting with free Singer through Meltano when you can own the infrastructure. Pay for Stitch when its managed connectors justify the subscription. For an unsupported source, run your custom Singer tap and send its data through the Stitch target and Import API; include that extraction process in your operating budget.
My Experience With Singer
Three connector failures made Python compatibility my first adoption gate, before throughput or catalog size. My custom taps worked; several published packages did not.
Installing Taps and Targets
I used Python 3.14.3 on macOS, with a separate virtual environment for each connector. That isolated dependencies, but target-csv and target-sqlite still referenced the removed collections.MutableMapping API.
| Package | Version | Result on Python 3.14.3 |
|---|---|---|
| singer-python | 6.8.0 | Installed cleanly and ran |
| singer-sdk | 0.54.9 | Installed in about 7 seconds and ran |
| tap-github | 4.0.0 | Installed in about 4 seconds; ships 23 stream schemas; discovery required valid credentials |
| target-jsonl | 0.1.4 | Installed and loaded records |
| target-csv | 0.3.0 | Missing pkg_resources; then collections.MutableMapping failure after pinning setuptools<81 |
| target-sqlite | 0.2.0 | Crashed on collections.MutableMapping through its old SQLAlchemy dependency |
| tap-exchangeratesapi | 0.1.1 | Crashed with No module named 'urllib3.packages.six.moves' |
Target-csv installed, then crashed at startup because pkg_resources was missing. After I pinned setuptools<81, it failed on collections.MutableMapping. Repairing the first dependency problem exposed another, so installation alone was a poor adoption milestone.
Tap-github’s help command worked. Discovery without a token failed with Config is missing required keys: ['access_token']; a fake token produced 401 Bad credentials because discovery called the GitHub API.
For tap-github, even obtaining the catalog required live credentials. Make discovery and a small sync your acceptance checks, rather than stopping after package installation.
Writing My First Tap With singer-python
My source was a SQLite orders table containing 50,000 rows, with an updated_at column for incremental extraction. The tap used 36 lines of Python, including schema metadata and argument handling.
These helper calls carried the message-writing work:
singer.write_schema("orders", schema, ["id"], bookmark_properties=["updated_at"])
singer.write_record("orders", rec)
singer.write_bookmark(state, "orders", "updated_at", bookmark)
singer.write_state(state)
I liked the small amount of protocol code needed for a working tap. The schema call identified id as the key and updated_at as the bookmark property; the remaining calls emitted records and saved progress.
For a production API connector, budget separately for authentication and pagination. The Meltano SDK supplies those development features alongside Singer’s message handling.
Discovery and Stream Selection
Running --discover printed the catalog in about 0.5 seconds. It identified updated_at as the valid replication key and marked the replication method as INCREMENTAL.
Passing that raw catalog back produced no records. The tap logged Skipping unselected stream orders, so I edited the stream’s top-level metadata to add "selected": true.
Bare Singer has no selection interface to perform that edit. Meltano’s select command handles selection; I recommend that route when manual catalog editing becomes part of routine operations.
Running a Sync and Resuming From State
The first extraction emitted one SCHEMA, 50,000 RECORD, and six STATE messages. My tap wrote a bookmark every 10,000 rows plus a final checkpoint. Piping it into target-jsonl wrote one file in about 5.8 seconds.
The target echoed the final STATE with an updated_at bookmark of 2026-10-18T08:40:00Z, which I saved. I then added 1,000 rows and updated the existing row with ID 5.
Rerunning with --state extracted 1,001 records in about 0.25 seconds, and the bookmark advanced to October 21.
Target-jsonl wrote a second file, leaving ID 5 in both files. Test update handling before adopting a destination: incremental extraction is not deduplication, and Singer leaves upserts to the target.
The Singer Spec: Messages, Catalogs and State
Singer spec v0.3.0 defines three core message types, with one JSON object per line on stdout. Logs go to stderr, and exit code 0 indicates success.
- SCHEMA: Describes a stream using required
schema,stream, andkey_propertiesfields. The key list can be empty;bookmark_propertiesis optional. - RECORD: Carries required
recordandstreamfields, with optionaltime_extracted. - STATE: Carries a required
value, but the specification leaves its meaning to the tap.
A discovery catalog contains a top-level streams array. The separate discovery convention uses metadata’s selected flag to choose streams and fields before passing the catalog back with --catalog.
The spec names FULL_TABLE and INCREMENTAL replication. Database taps such as tap-mysql and tap-postgres also implement LOG_BASED behavior. Some targets use ACTIVATE_VERSION for full-table versioning, although that message is not defined in the core SPEC.md body.
I see the small contract as Singer’s strongest design choice and its biggest interoperability limit. My two taps read the same SQLite table but wrote different bookmark structures: singer-python used updated_at, while the SDK used replication_key and replication_key_value.
Those saved states were not interchangeable. Plan a state migration when replacing a tap implementation, even when the source and replication column stay unchanged.
Historical issue reports identify specific resume problems worth testing:
- tap-facebook issue #122: “State doesn’t work,” opened January 22, 2021.
- tap-hubspot issue #161: Incremental duplicates, opened August 27, 2021.
- tap-pardot issue #40: “State is not populated,” opened February 14, 2023.
Require a resume test for each tap-target pair, including an updated existing row like ID 5 in my test.
The spec repository’s last push was August 8, 2025. For built-in incremental handling without Singer compatibility requirements, consider dlt.
Building Taps With the Meltano SDK
The Meltano Singer SDK reduced my tap from 36 lines to 20. Version 0.54.9, released October 19, 2026, requires Python 3.10 or later and uses Apache-2.0.
I recommend it over bare singer-python for new connector development. Its discovery output selected the stream by default, avoiding the manual catalog edit from my first test.
The SDK also exposed connector information automatically:
- Capabilities: Its
--aboutoutput included discovery, state, and catalog support. - Configuration: Each setting had an environment-variable name, including
TAP_ORDERS_DB_PATH. - Metrics: Log output reported
record_countof 51,000 andsync_durationof about 1.65 seconds.
The CLI differed from singer-python’s: --config worked, but -c failed with No such option '-c'. Check each implementation’s arguments before reusing a shell script.
Stream Maps Without Extra Tap Code
This configuration hashed customer, added amount_cents, and removed status in my test:
{"stream_maps": {"orders": {"customer": "md5(customer)", "amount_cents": "int(amount * 100)", "status": null}}}
The tap alone processed 51,000 records in about 1.9 seconds. SDK output also worked with the older target-jsonl, loading the same row count in about 5.2 seconds.
I valued that compatibility more than the local timing: the SDK tap fed target-jsonl without requiring a replacement target.
Stream maps additionally support:
- Hashing:
sha256alongsidemd5. - Filtering: Row expressions through
__filter__. - Aliases: Stream names through
__alias__. - Masking: Faker-generated values.
Stream maps use single Python expressions and cannot modify nested properties. Their expressions execute code, so configuration must remain trusted. Use them for the supported field-level changes rather than treating configuration as an unrestricted transformation pipeline.
BATCH Is Still a Separate Decision
The SDK’s BATCH extension passes manifests for JSONL, Parquet, or Arrow files over local storage or S3. It remains a preview feature, supports gzip, and is incompatible with stream maps.
Incremental STATE tracking is unsupported except for native Arrow. Its default temporary folder can also be cleared by the operating system.
I recommend Meltano‘s record-based SDK workflow for a new tap; choose BATCH only when its file-handoff model and restrictions fit your pipeline.
Connector Catalog and Maintenance in 2026
Singer.io’s 106 taps and Meltano Hub’s 655 extractors describe different catalogs, not equivalent pools of maintained connectivity.
| Where you count | Taps or extractors | Targets or loaders |
|---|---|---|
| Singer.io homepage | 106 | 10 |
| singer-io organization | 192 | 4 |
| Meltano Hub | 655 | 50 |
The singer-io organization has 207 public repositories, including eight archived repositories overall. 33 of its 192 tap repositories had no push in the two years before October 30, 2026, and 328 open pull requests across the organization were created before 2023.
Singer-python PR #161, “update jsonschema range,” has been open since December 7, 2022. Version 6.8.0, released February 27, 2026, still pins jsonschema to the 2.x series and declares no minimum Python version.
Tap-github 4.0.0 shipped October 1, 2026. These repositories received pushes on October 29:
- tap-facebook
- tap-salesforce
- tap-zendesk
- tap-hubspot
- singer-python
My test produced a mixed result: tap-github started and reached credential validation, while three published packages crashed. Target-jsonl still loaded both custom taps successfully, so I recommend checking the exact package rather than rejecting connectors by age alone.
Stitch created Singer, Talend acquired Stitch in November 2018, and Qlik acquired Talend in 2023. Stitch’s integrations use Singer; community integrations remain community-maintained.
Matatika and Meltano have combined under the Meltano name, while Meltano Cloud has shut down. The SDK and CLI remain separate choices from that discontinued hosted service.
Before selecting a connector:
- Check release age and Python requirements: Use the package’s dependency constraints to choose an environment.
- Inspect SDK-built variants: Compare the particular implementations on Meltano Hub, then run discovery and resume checks.
- Pin each connector separately: Use its own virtual environment to avoid conflicting dependency requirements.
PipelineWise offers another library fork, pipelinewise-singer-python 3.0.2, released April 22, 2026. It requires Python >=3.12,<3.13, so it needs a different environment from my Python 3.14.3 setup.
Running Singer in Production
Singer provides no scheduler, UI, pipeline retry system, or state store. A tap is a command-line process, so budget for operating infrastructure before adopting a production pipeline.
With bare Singer, you own:
- Scheduling: Trigger extraction through cron or Airflow.
- State persistence: Save the target-emitted checkpoint separately for each pipeline.
- Dependency isolation: Maintain a virtual environment or container per connector.
- Log capture: Collect stderr without mixing it into the JSON message stream.
- Alerting and recovery: Detect failed runs and define restart behavior.
For Meltano, replace its SQLite system database with PostgreSQL through database_uri. Schedule meltano run through cron or Airflow; the Airflow setup uses LocalExecutor with a Postgres metadata database.
Keep secrets in environment variables and persist logs under .meltano/logs/elt. Build from the meltano/meltano base image, then assign ownership of the scheduler and failed-run recovery.
PipelineWise is another Singer-based framework, built for Python 3.12. Its maintained connector set covers MySQL/MariaDB and PostgreSQL sources, with Postgres and Snowflake targets; other connectors are experimental.
Compare Airbyte Core if a self-hosted interface matters more than the Unix-pipe model. For code-first work, dlt includes schema inference and incremental state handling. I recommend choosing the runtime alongside the connector, rather than treating scheduling and saved state as later additions.
How Does Singer Compare to Competitors?
I recommend Singer for connector code you need to own, not simply because its library has no license fee. Choose the alternative that removes your biggest operating burden:
- Meltano: The free, MIT-licensed CLI is at version 4.4.1, with 655 extractors on its Hub. I recommend it for Singer projects needing configuration, selection, and state management rather than separate scripts. Hosting and scheduling remain your responsibility.
- Airbyte: Offers 700+ connectors, free self-hosted Core, and Standard from $20/month with five credits. Choose it for a UI-led connector workflow. MeltanoLabs’ MIT-licensed tap-airbyte-wrapper brings Airbyte sources into Singer pipelines, not Singer taps into Airbyte.
- dlt: An Apache-2.0 Python library with schema inference and incremental handling. Version 1.32.0 shipped October 29, 2026, and requires Python 3.10 or later. I recommend it for new code-first pipelines without a Singer compatibility requirement.
- Stitch: Managed Singer-based ingestion starts at $100/month. Choose it when its supported integrations fit and avoiding connector infrastructure justifies the subscription. For unsupported sources, your custom tap can send data through the Stitch target and Import API.
- Fivetran: Offers 700+ managed connectors and a free plan with 500,000 MAR. Shortlist it for lower-maintenance enterprise ELT, then forecast active-row usage before moving beyond the free allowance.
| Option | Entry price | Operating model | Connector or library scope |
|---|---|---|---|
| Singer | Free library | Self-hosted connector processes | Specification plus Apache-2.0 library |
| Meltano | Free CLI | Self-hosted project runner | 655 Hub extractors |
| Airbyte | Core free; Standard from $20/month | Self-hosted or cloud | 700+ connectors |
| dlt | Free library | Python code | Schema inference and incremental handling |
| Stitch | From $100/month | Managed ingestion | Singer-based source integrations |
| Fivetran | Free plan: 500,000 MAR | Managed ingestion | 700+ managed connectors |
Estimate the bill using your source’s update behavior. Stitch charges by replicated rows, Fivetran uses monthly active rows, and Airbyte uses credits.
For a small workload, compare Fivetran’s free allowance with Airbyte’s starting plan before choosing Stitch. For custom extraction, compare Singer’s interoperability with dlt’s built-in schema handling; I recommend paying for the operating work you actually need removed.
How I Reviewed Singer
On October 30, 2026, I tested singer-python 6.8.0 and singer-sdk 0.54.9 on a MacBook running macOS and Python 3.14.3, using separate virtual environments.
I installed five published connectors, wrote one tap with each library, and loaded a 50,000-row SQLite dataset into target-jsonl. I tested saved-state resume after adding 1,000 rows and updating one existing row, plus SDK stream maps.
I did not test Meltano’s CLI, Stitch, warehouse targets, LOG_BASED replication, BATCH messages, or extraction with a real GitHub token.
My evaluation weighed local setup effort and connector reliability alongside cost, maintenance, and alternatives.
Prices current as of October 2026.
Should You Build Your Pipelines on Singer?
I recommend Singer when interoperability is part of your requirement, especially for a custom source feeding an existing Meltano or Stitch stack. For a new tap, start with the Meltano SDK rather than bare singer-python.
My tests demonstrated working extraction, incremental resume, and compatibility between an SDK tap and an older JSONL target. They also exposed three startup failures and an updated row appearing in two output files.
- Best for: Python engineers connecting internal or niche sources, plus teams already operating Singer pipelines.
- Skip if: You want maintained integrations with a UI and minimal infrastructure work. Compare Airbyte or Fivetran.
- Consider dlt instead: You want code-first ingestion with built-in schema inference and incremental handling, without needing Singer compatibility.
Approve Singer connector by connector, not catalog by catalog. Before adopting your first tap, check its latest release and run an extraction-and-resume test in a dedicated virtual environment using your intended Python version. Include an updated existing record in that test, then inspect the target’s output before trusting the checkpoint.
FAQs
Is Singer still maintained?
Yes, but activity varies by repository. Singer-io repositories received pushes in October 2026, and Meltano SDK 0.54.9 shipped on October 19. The core spec remains at v0.3.0, while 33 singer-io tap repositories had no push in two years. Evaluate the exact connector rather than the project name.
Is Singer free?
Yes, singer-python is a free Apache-2.0 library. Individual connector licenses vary: tap-github and tap-hubspot use AGPL-3.0. You still pay for infrastructure and maintenance when self-hosting. Stitch is a separate managed option starting at $100/month, not a paid Singer plan; choose it for its managed integrations.
What is the difference between Singer and Meltano?
Singer defines how taps and targets exchange data; Meltano provides tooling to build and operate those connectors. Its SDK supplies connector-development features, while its CLI manages projects and state. My SDK tap used 20 lines versus 36 with singer-python. See Building Taps With the Meltano SDK for the tested differences.
Can I use Singer taps with Airbyte?
Airbyte does not state direct Singer tap compatibility. MeltanoLabs’ tap-airbyte-wrapper works in the opposite direction: it wraps Airbyte sources as a Singer tap for Singer or Meltano pipelines. Choose the runtime first, then select a connector built for that direction rather than treating the protocols as interchangeable.
Which Python version does Singer need?
Singer-python declares no minimum Python version; version 6.8.0 worked in my Python 3.14.3 test. The Meltano SDK requires Python 3.10 or later. Individual connectors impose their own dependency constraints, and three published packages crashed on my machine. Test your chosen connector in its own environment before adoption.







