This is about migrating FOC as a whole from using filecoinpin.contact (not just filecoin-pin affordances). The tracking issue needs to live somewhere, and this seemed like the best repo to house it.
Intended solution
Details
- Curio SPs advertise only to cid.contact (no longer to filecoinpin.contact).
- Curio SPs confirm indexing themselves: since Curio already knows the advertisement CID it just announced, it can poll cid.contact's
/sync/status/ad/{adCid} endpoint directly to learn whether that specific ad has been fully processed. This endpoint doesn't have the negative-caching problem because it's keyed on the ad CID, not the content CID.
- Curio surfaces that confirmation on its own piece-status endpoint (
GET /pdp/piece/{pieceCid}/status, per curio#1405: adding synced/syncedAt fields). Clients like filecoin-pin and dealbot poll that endpoint, not cid.contact, to learn indexing status.
- The key reason clients can't just poll cid.contact directly: cid.contact's ad-status check is keyed on the advertisement CID, and Curio is the only party that knows the advertisement CID for a given upload. An end client like filecoin-pin only knows the IPFS root CID, and has no structural way to derive the ad CID from it. If such a client polled
/cid/{rootCid} on cid.contact before the content was actually indexed, it would trigger the negative-cache issue this whole migration is trying to avoid, hence the need to go through Curio's own status endpoint first, and only fall back to cid.contact once Curio has confirmed the content is ready.
- Only once Curio's endpoint reports the piece as synced do clients query cid.contact for the root CID (
GET https://cid.contact/cid/{rootCid}). By then it should already be indexed, so the query shouldn't produce a negative-cache miss.
- This final cid.contact query is a genuine confirmation step, not a formality: we don't expect Curio's
synced signal and cid.contact's own record to ever disagree, but if they do (Curio says synced, cid.contact has no record for the root CID), that's a real anomaly worth surfacing loudly rather than silently retrying or swallowing. filecoin-pin's library should expose this as a distinct, identifiable error/event (separate from "not yet indexed"), and callers (the filecoin-pin CLI, dealbot) are each responsible for logging/metricing it. See the filecoin-pin and dealbot issues below for specifics.
Steps
ℹ️ It should be safe to "turn off" filecoinpin.contact at this point. We'll follow the plan in #664 (comment)
Why
Details
filecoinpin.contact's current hardware is going away. Rather than stand up and operate replacement infrastructure, we're going to simplify and rely on cid.contact going forward: we believe its reliability and performance are good enough for our needs today.
For context, filecoinpin.contact's backend (Pulsar) doesn't resemble the storetheindex/IPNI deployment behind cid.contact. It was a different system built to work around scaling and operational reliability issues seen with IPNI, exposing an IPNI-compatible API as a compatibility layer rather than a long-term architecture. Standing up and operating a replacement of that infrastructure ourselves is not something we're taking on, so we're consolidating on cid.contact instead.
This is about migrating FOC as a whole from using filecoinpin.contact (not just filecoin-pin affordances). The tracking issue needs to live somewhere, and this seemed like the best repo to house it.
Intended solution
Details
/sync/status/ad/{adCid}endpoint directly to learn whether that specific ad has been fully processed. This endpoint doesn't have the negative-caching problem because it's keyed on the ad CID, not the content CID.GET /pdp/piece/{pieceCid}/status, per curio#1405: addingsynced/syncedAtfields). Clients like filecoin-pin and dealbot poll that endpoint, not cid.contact, to learn indexing status./cid/{rootCid}on cid.contact before the content was actually indexed, it would trigger the negative-cache issue this whole migration is trying to avoid, hence the need to go through Curio's own status endpoint first, and only fall back to cid.contact once Curio has confirmed the content is ready.GET https://cid.contact/cid/{rootCid}). By then it should already be indexed, so the query shouldn't produce a negative-cache miss.syncedsignal and cid.contact's own record to ever disagree, but if they do (Curio says synced, cid.contact has no record for the root CID), that's a real anomaly worth surfacing loudly rather than silently retrying or swallowing. filecoin-pin's library should expose this as a distinct, identifiable error/event (separate from "not yet indexed"), and callers (the filecoin-pin CLI, dealbot) are each responsible for logging/metricing it. See the filecoin-pin and dealbot issues below for specifics.Steps
ipniVerifyMs— currently not showing up in the BetterStack dashboard. Ideally fix that chart so we can compare against Probelab's cid.contact analysis.200 OKresponse)(ECD 2026-08-31) Deploy the transition CloudFlare worker before filecoinpin shuts downHTTP_REQUESTS_TO_CURIO.md, which currently describesGET https://filecoinpin.contact/cid/{cid}).src/hooks/use-ipni-check.tscalls filecoin-pin'swaitForIpniProviderResultsdirectly with no explicitipniIndexerUrloverride, so it should pick up the new behavior automatically once the dependency is bumped. This step is mainly about the version bump + doc updates.ℹ️ It should be safe to "turn off" filecoinpin.contact at this point. We'll follow the plan in #664 (comment)
Why
Details
filecoinpin.contact's current hardware is going away. Rather than stand up and operate replacement infrastructure, we're going to simplify and rely on cid.contact going forward: we believe its reliability and performance are good enough for our needs today.
For context, filecoinpin.contact's backend (Pulsar) doesn't resemble the storetheindex/IPNI deployment behind cid.contact. It was a different system built to work around scaling and operational reliability issues seen with IPNI, exposing an IPNI-compatible API as a compatibility layer rather than a long-term architecture. Standing up and operating a replacement of that infrastructure ourselves is not something we're taking on, so we're consolidating on cid.contact instead.