source.unsplash.com Imepotea: Uchambuzi wa Baada ya Kifo na Kila Njia ya Kuibadilisha

Ilizimwa rasmi mwaka 2021 ikiwa na tamko la “matumizi yaliyopo yataendelea kufanya kazi”, kisha ikazimwa kabisa Juni 2024, na bado inaandikwa katika code mpya leo. Uchambuzi wa kina wa baada ya kifo — na mbadala tatu, pamoja na proxy inayorudisha nasibu bila ufunguo.

Picha nyeusi na nyeupe ya simu janja yenye skrini iliyopasuka ikiwa imelala juu ya uso wa mbao wenye rangi hafifu, nembo ya Unsplash ikionekana kwenye skrini iliyoharibika.
Picha kupitia Unsplash

Huduma ya picha za hisa (stock photo) ilizima subdomain moja, na miaka miwili baadaye bado inavunja tovuti za nyaraka, skrini za kuingia (login), mazoezi ya kozi na msimbo unaotolewa hivi karibuni na mashine. Huu ni uchambuzi wa baada ya kifo (post-mortem) wa URL moja — ilikuwa ikifanya nini, kilichoiua, na cha kuiweka mahali pake — pamoja na mtazamo wa kipimo kwenye sehemu ya ajabu zaidi ya hadithi hii: mashine zinazoandika msimbo wetu bado hazijagundua kuwa imeondoka.

Majibu ya HTTP, vipengele viwili vya changelog vilivyonukuliwa neno kwa neno, mipaka ya API, viwango vya ufuatiliaji wa masuala (issue trackers) vya miradi iliyovunjika, na hesabu kutoka GitHub, npm na Stack Overflow — vyote vinatoka kwenye vyanzo vya msingi, na mbinu ya kila kimoja imeelezwa katika tanbihi. Kama unataka tu suluhisho, nenda moja kwa moja kwenye jedwali la uhamishaji.

Unachopata leo, endapo bado unaitaka

Amri moja, bila funguo, inayoweza kurudiwa kwenye mashine yoyote:

terminal
curl -I https://source.unsplash.com/random

HTTP/2 503
cache-control: no-cache, no-store
content-type: text/html; charset=utf-8
server: Heroku
via: 2.0 heroku-router
# mwili wa jibu: iframe inayoelekeza kwa herokucdn.com/error-pages/application-error.html

Hakuna kinachotokea hapa ni hitilafu ya DNS. source.unsplash.com bado inatatuliwa (resolve) — ni CNAME kuelekea host ya herokudns.com — hivyo ombi linajibiwa, ila si na programu. Undani huu ni muhimu zaidi kuliko unavyosikika: kivinjari kinachopata 503 ya haraka yenye mwili wa HTML kinachora sanduku la picha iliyovunjika, na msimbo wowote unaosoma response.ok au kishikizi cha onerror ambacho hukujawahi kukiandika, kinachukua njia ya kushindwa ambayo hukuwahi kuipima.

Muundo wa URL Zamani ilikuwa inarudisha nini Leo
source.unsplash.com/randomPicha ya nasibu, ukubwa wowote503
source.unsplash.com/random/1600x900Picha ya nasibu, iliyokatwa (crop) kwa ukubwa503
source.unsplash.com/1600x900/?apple,deskPicha ya nasibu inayolingana na maneno ya utafutaji503
source.unsplash.com/featured/1600x900?naturePicha ya nasibu iliyo featured503
source.unsplash.com/collection/190727/800x600Picha ya nasibu kutoka mkusanyiko (collection)503
source.unsplash.com/user/scottwebb/1600x900Picha ya nasibu kutoka kwa mpiga picha mmoja503
source.unsplash.com/dailyPicha ya siku503

Ilikaguliwa moja moja kwa kutumia curl -o /dev/null -w "%{http_code}". Kipengele cha utafutaji kilizimwa kwanza, kama ilivyotangazwa; leo programu nzima imezimwa, kwa hiyo tofauti hiyo haipo tena.

Miaka mitatu kati ya “imeachwa” na “imezimwa”

Matangazo yote mawili bado yanasomeka, mahali pamoja, kwenye unsplash.com/documentation/changelog. Yamenukuliwa kikamilifu, kwa sababu maneno yenyewe ndiyo hadithi nzima:

25 Novemba 2021 — “Unsplash Source being deprecated”
“Unsplash Source is being deprecated. Existing uses will continue to work, however for new projects use the full Unsplash API.”

11 Juni 2024 — “Unsplash Source sunset”
“Unsplash Source has been officially unsupported since its deprecation in 2021. As part of the final sunsetting, we will first wind down by disabling the search feature, and in the coming weeks turn off the application entirely. Existing uses of Source — particularly production-level ones — should migrate as soon as possible to the full Unsplash API.”

Zisome kwa mfuatano na mfumo wa kushindwa unakuwa dhahiri. Taarifa ya 2021 ilikuwa na ahadi (existing uses will continue to work) na hakuna tarehe. Msanidi programu aliyeisoma mwaka 2021 alikuwa na sababu kamili ya kuacha msimbo unaofanya kazi bila kuugusa; msanidi programu aliyejiunga mwaka 2022 hakuwahi kuisoma kabisa. Taarifa ya 2024 ilitoa “wiki zijazo”, miaka mitatu baadaye, kwenye ukurasa ambao hakuna aliyeuweka alama (bookmark).

Unsplash inachapisha sera ya uachwaji (deprecation policy), na ni sera ya kimantiki — nyaraka zinasema kwamba kwa fani (fields) na endpoint zilizoandikwa hadharani, mabadiliko yanatangazwa kwenye changelog kwa angalau wiki 3 za taarifa, na endpoints zinarudisha kichwa (header) cha Warning wakati wa kipindi cha uachwaji. Aya ile ile ina sentensi inayoeleza kwa nini hakuna kilichomlinda Source: “For any non-publicly documented fields or endpoints, we may make changes to these with no warning.” Source haikuwahi kuwa endpoint ya API iliyoandikwa hadharani. Ilikuwa nje ya sera ambayo ingeweza kuifunika.

  • Somo la vitendo si “Unsplash ilikuwa mzembe”. Ni kwamba URL unayoweza kutumia bila kusoma nyaraka yoyote ni URL ambayo sera yake ya uachwaji nayo hukuwahi kuisoma.
  • Kuvunjika kulitokea kabla ya tangazo. Issue ya Drupal iliyofunguliwa tarehe 28 Novemba 2022 tayari inaripoti “I get always a Heroku application error”, miezi kumi na minane kabla ya kipengele cha kuzimwa (sunset entry). Hivi ndivyo huduma hizi zinavyokufa: taratibu, kisha kwenye tangazo ambalo huwezi kuliona kamwe.

Tangazo ni gumu zaidi kulipata kuliko hitilafu yenyewe

Uachwaji wa mwaka 2021 ulichapishwa kwenye changelog.unsplash.com, na hiyo ndiyo URL ambayo kila ripoti ya hitilafu ya wakati huo inaunganisha — ikijumuisha ile ya Drupal hapo juu. Vipimo vitatu:

  1. Endpoint ya HTTPS imevunjika. openssl s_client -connect changelog.unsplash.com:443 inarudisha tlsv1 alert internal error — handshake inashindwa kabla ya cheti chochote kuwasilishwa. Kila kiungo cha zama za 2021, ambacho kilikuwa https://, kwa hiyo kimekufa kwenye kivinjari.
  2. Kupitia HTTP wazi kinaelekeza (redirect), lakini si kwa manufaa. Kufuata http://changelog.unsplash.com/deprecations/2021/11/25/source-deprecation.html kunaishia, baada ya hatua mbili, kwenye 400 kwenye unsplash.com/@documentation/changelog/deprecations/2021/11/25/source-deprecation/html — njia hiyo (path) imemezwa na njia ya jina la mtumiaji (username route) ya tovuti.
  3. Kumbukumbu (archive) ina pengo pale ambapo kuzimwa kulitokea. Nakala ya mwisho iliyofanikiwa ya Wayback Machine ya changelog ya zamani ni tarehe 24 Machi 2024; nakala yake ya kwanza ya ile mpya ni tarehe 23 Agosti 2024. Kuzimwa kulitangazwa tarehe 11 Juni 2024 — ndani ya pengo hilo la miezi mitano.

Hakuna kati ya hayo ni njama; ni uhamishaji wa kawaida wa CMS. Lakini matokeo yake ni halisi, na ndiyo sababu makala haya yamenukuliwa vipengele vyote viwili kikamilifu: rekodi ya msingi ya uachwaji inapaswa kuishi kwa muda mrefu zaidi kuliko kitu kilichoachwa, na hapa karibu isingefanya hivyo.

Kilichovunjika kihalisi

Si miradi ya kando (side projects). Hitilafu zilizo hapa chini ni maingizo ya hadharani ya viwango vya ufuatiliaji wa masuala (issue-tracker); vichwa vya habari, tarehe na hali (states) vinatoka kwenye API za GitHub na drupal.org.

Mradi Issue Ilifunguliwa Inasema nini
MUI (Material UI) #42736 24 Juni 2024 “[docs] Random Unsplash photo URL is no longer functional” — kiolezo rasmi cha Sign-in side kilikuwa kimesambaza picha iliyokufa. Ilifungwa siku tatu baadaye.
Nextcloud #115 17 Januari 2023 “Migrate to Unsplash API” — programu ya mandhari nyuma (background app) ilijengwa juu ya Source URIs. Ilikaa wazi kwa miezi kumi na minane, ikafungwa tarehe 16 Julai 2024.
sindresorhus/Actions #248 28 Mei 2024 “Get Unsplash Image: 503 Error” — kitendo (action) cha iOS/macOS Shortcuts, kilichovunjika wiki mbili kabla ya kutangazwa kwa kuzimwa.
Drupal — Gin Login #3324054 28 Novemba 2022 “Unsplash has deprecated source.unsplash.com — this delays reCAPTCHA from loading, preventing users from logging in.”

Soma msururu wa mwisho huo tena, kwa sababu ndio unaostahili kuufahamu vizuri. Picha ya mapambo tu karibu na fomu ya kuingia (login) — mali dhahiri isiyo muhimu kwenye ukurasa — iligeuka kuwa hitilafu ya uthibitishaji (authentication outage), kwa sababu ombi la polepole la mtu wa tatu lilikuwa mbele ya CAPTCHA ambayo fomu ya kuingia iliihitaji. Hakuna aliyeandika hivyo kwa makusudi. Ilitokea kutokana na mpangilio ambao kivinjari kinapakia vitu.

Msaidizi wako wa uandishi wa msimbo hakupata ujumbe huo

Hapa ndipo sehemu inayogeuza hitilafu ya 2024 kuwa tatizo la 2026. source.unsplash.com iliandikwa katika nyaraka, blogu, mafunzo na kunakiliwa kwa takribani miaka minane. Maandishi hayo yote yamo kwenye data ya mafunzo (training data) ya modeli ambazo sasa zinaandika msimbo wetu wa kuanzia — na maandishi hayana muda wa kuisha. Hesabu tatu:

KipimoThamani tarehe 30 Agosti 2026Jinsi ilivyopatikana
Faili zenye source.unsplash.com 3,344 API ya utafutaji wa msimbo wa GitHub, q=source.unsplash.com (msimbo wa hadharani uliowekwa fahirisi (indexed) tu — ni kiwango cha chini, si jumla kamili)
Repositori katika sampuli ya faili 100 zilizoundwa baada ya kuzimwa 12 kati ya 77 Utafutaji uleule, matokeo 100, yaliyopunguzwa marudio hadi repositori 77, created_at ikilinganishwa na tarehe 11 Juni 2024
…na repositori katika sampuli hiyo zilizosukumwa (pushed) miezi 12 iliyopita 20 kati ya 77 Repositori zinazoendelea kutumika, si kumbukumbu (archives) — zikijumuisha elastic/kibana, ambayo faili yake ya onyesho (demo) bado inasoma imageUrl: 'https://source.unsplash.com/64x64/?dingo'
Upakuaji wa kila mwezi wa unsplash-source-es6 23 API ya rejista ya npm — kifunga (wrapper) kwa huduma iliyokufa, iliyochapishwa mwisho mwaka 2022, bado inasakinishwa
Machapisho ya Stack Overflow yanayoitaja 1,459 Jumla la API ya Stack Exchange, /search/excerpts

Ushahidi wa moja kwa moja zaidi haupo kwenye msimbo wa programu hata kidogo — upo kwenye prompt. Matokeo ya juu kabisa ya utafutaji huo ni maktaba ya prompt za mfumo za GPT zenye mstari “please use unsplash API( https://source.unsplash.com/1280x720/?<PUT YOUR QUERY HERE>”. Maelekezo hayo bado yananakiliwa kwenye wasaidizi wapya leo. Modeli haihakiki URL hiyo; iliambiwa kuitumia, na kila mfano iliowahi kuuona ulikubaliana.

Kwa hivyo hitilafu ya msimbo unaotolewa (generated code) ina visababishi viwili huru, na kurekebisha kimoja hakirekebishi kingine: data ya mafunzo iliyopitwa na wakati, na maagizo yaliyopitwa na wakati yaliyoandikwa na binadamu juu yake. Kwa vyovyote vile, dalili ni familia ile ile ya picha zisizopakia kamwe:

mifumo ya picha zilizokufa inayostahili kutafutwa kwa grep
source.unsplash.com/random/1200x800   # 503 tangu katikati ya 2024 — haitarudi kamwe
images.unsplash.com/photo-…           # CDN halisi, lakini ID zilizokaririwa (memorised) huenda hazipo
via.placeholder.com/400               # mstatili wa kijivu, uliopelekwa production
placehold.co/800x600                  # mstatili wa kijivu, kwa makusudi
picsum.photos/800/600                 # picha halisi, isiyohusiana na ukurasa wako
/placeholder.png                      # faili ambayo haikuwahi kuongezwa kwenye repo

Tanbihi kwenye mstari wa pili wa orodha hiyo: wakati wa kuandika makala haya, via.placeholder.com haikukamilisha handshake ya TLS kutoka kwenye mtandao wetu wa majaribio pia, na ilijibu 403 kupitia HTTP wazi. Ikague kutoka kwenye mtandao wako mwenyewe kabla ya kuiamini — mbadala (fallback) ambao zana hizi zinaufikia unaweza kuwa na hadithi yake ya hitilafu.

Ni ile ya kwanza tu ndiyo iliyovunjika. Nyingine ni mbaya zaidi kwa namna nyembamba zaidi: zinapakia, mpangilio unaonekana umekamilika, na hakuna anayegundua kwamba ukurasa umeoneshwa kwa kitu kisicho na uhusiano wowote. Na hakuna hata mojawapo ya haya limejikita tu kwenye picha — ni umbo la jumla la tatizo hili. Picha ya modeli kuhusu wavuti ni picha ya wakati fulani (snapshot), na endpoints, bendera za CLI, majina ya vifurushi na viwango vya bure (free tiers) vinaendelea kubadilika baada ya kamera kupiga picha.

Jedwali la uhamishaji

Kuna maeneo matatu kabisa ya kwenda, na njia ya uaminifu ya kuyawasilisha ni kwa kile unachoacha. Chagua safu wima kwanza, kisha soma safu mlalo yako.

URL ya zamani ya Source A. URL fasta ya CDNhakuna funguo · hakuna nasibu B. Unsplash APIfunguo · wito wa upande wa server C. Proxy yako mwenyewefunguo imefichwa · nasibu inarudi
/random images.unsplash.com/photo-… — picha moja uliyochagua GET /photos/random /?w=1600
/random/1600x900 …?w=1600&h=900&fit=crop /photos/random + vigezo vya Imgix kwenye URL iliyorudishwa /?w=1600&h=900&fit=crop
/1600x900/?apple,desk Hakuna mfano sawa — chagua picha kwa mkono /photos/random?query=apple,desk /?query=apple,desk&w=1600
/featured/1600x900?nature Hakuna mfano sawa /photos/random?query=nature “featured” haina mrithi /?query=nature&w=1600
/collection/67920491/1600x900 Hakuna mfano sawa /photos/random?collections=67920491 /?collections=67920491&w=1600
/user/scottwebb/1600x900 Hakuna mfano sawa /photos/random?username=scottwebb /?username=scottwebb&w=1600
/daily Bandika picha moja, izungushe (rotate) kwenye build yako Hakuna mfano sawa — hifadhi (cache) picha moja ya nasibu kwa masaa 24 mwenyewe Vivyo hivyo, na hifadhi ndani ya proxy

Chaguo A ndicho watu wengi wanachotaka hasa. Kama picha ilikuwa ya mapambo tu — hero, jopo la pembeni la kuingia (login), au mandhari nyuma ya kadi — hukuwahi kuhitaji picha tofauti kwa kila ombi. Chagua moja, hifadhi URL ya CDN, na ukurasa unaacha kutegemea kitu chochote cha nasibu:

URL fasta, inayoweza kubadilisha ukubwa, ya Unsplash — bila funguo, bila wito wa API
<img src="https://images.unsplash.com/photo-1506905925346-21bda4d32df4?w=1600&h=900&fit=crop&auto=format"
     width="1600" height="900" alt="…">
# Vigezo vinavyoungwa mkono rasmi: w, h, crop, fit, fm, auto=format, q, dpr.
# Hifadhi kigezo chochote cha ixid ulichopewa na API — ndicho kinachoripoti mwonekano.

Chaguo B ni njia rasmi, na inasogeza wito upande wa server, kwa sababu Client-ID mbele ya JavaScript ya front-end ni kitambulisho kilichochapishwa. Angalia kanuni mbili zinazowakwaza watu: collections/topics haziwezi kuunganishwa na query kwenye ombi lile lile, na count (upeo 30) inabadilisha umbo la jibu kuwa mkusanyiko (array) hata linapokuwa 1.

mbadala rasmi wa /random
curl "https://api.unsplash.com/photos/random?query=nature&orientation=landscape" \
  -H "Authorization: Client-ID YOUR_ACCESS_KEY" \
  -H "Accept-Version: v1"

# → JSON. Picha ipo kwenye .urls.regular / .urls.raw (ongeza w/h/fit mwenyewe).
# → X-Ratelimit-Limit: 1000   X-Ratelimit-Remaining: 999

Chaguo C: jenga upya Source, kwa mistari kama arobaini

Kama kile ulichopoteza kilikuwa hasa tabia yenyewe — URL isiyohitaji funguo inayorudisha picha tofauti kila mara, inayoweza kutumika moja kwa moja kwenye tagi ya <img>, kwenye field ya CMS, au kwenye tovuti tuli (static site) ambako hakuna server — basi lazima uendeshe endpoint hiyo mwenyewe. Ni worker moja ndogo mbele ya API, na mambo matatu yanayoifanya iishi mgongano na production ni cache, ukaguzi wa referrer, na kupitisha sehemu iliyobaki ya query string kwenda CDN.

worker.js — endpoint isiyohitaji funguo yenye umbo la Source juu ya /photos/random
// Cloudflare Workers. Sehemu nyingine (Deno Deploy, Val Town…) umbo ni lile lile,
// lakini fungua cache yenye jina kwa caches.open() badala ya caches.default.
// UNSPLASH_KEY inabaki upande wa server. Wapigaji simu (callers) hawaioni kamwe.
const ALLOWED = ["example.com", "www.example.com"];   // domeni zako pekee
const API_PARAMS = ["query", "collections", "topics", "username", "orientation"];
const TTL = 60;                                       // sekunde — inalinda kikomo cha saa

const host = (value) => { try { return new URL(value).hostname; } catch { return null; } };

export default {
  async fetch(req, env, ctx) {
    // 0. GET pekee: Cache API inakataa kuhifadhi kingine chochote, na endpoint
    //    ya picha haina kitenzi kingine cha kujibu.
    if (req.method !== "GET")
      return new Response("Method not allowed", { status: 405 });
    const url = new URL(req.url);

    // 1. Kurasa zako pekee ndizo zinaruhusiwa kuiingiza — endpoint ya hadharani
    //    ya picha za nasibu kwenye mtandao wazi ni kikomo cha kasi cha mtu mwingine cha kuunguza.
    const ref = req.headers.get("referer");       // haipo kwa wateja wengi halali
    if (ref && !ALLOWED.includes(host(ref)))
      return new Response("Forbidden", { status: 403 });

    // 2. Hifadhi (cache) kwa mchanganyiko wa vigezo, ili ukurasa wenye picha 12
    //    ugharimu wito mmoja wa API kwa dakika badala ya kumi na mbili kwa uonyeshaji.
    const cache = caches.default;
    const hit = await cache.match(req);
    if (hit) return hit;

    // 3. Omba API rasmi ipe picha ya nasibu.
    const api = new URL("https://api.unsplash.com/photos/random");
    for (const p of API_PARAMS)
      if (url.searchParams.has(p)) api.searchParams.set(p, url.searchParams.get(p));

    const r = await fetch(api, { headers: {
      Authorization: "Client-ID " + env.UNSPLASH_KEY,
      "Accept-Version": "v1",
    }});
    // 403 hapa kwa kawaida inamaanisha kikomo cha saa, si funguo mbaya — ongeza TTL, usitishike.
    if (!r.ok) return new Response("Upstream " + r.status, { status: 502 });
    const photo = await r.json();

    // 4. Jenga upya URL ya picha: hifadhi ixid, ongeza vigezo vya ukubwa vya mpigaji simu.
    const img = new URL(photo.urls.raw);          // .raw tayari inabeba ixid
    for (const [k, v] of url.searchParams)
      if (!API_PARAMS.includes(k)) img.searchParams.set(k, v);  // w, h, fit, q…

    const res = new Response(null, { status: 302, headers: {
      Location: img.toString(),
      "Cache-Control": "public, max-age=" + TTL,
      // Sifa (credit) inasafiri pamoja na redirect; thamani za header lazima ziwe ASCII, kwa hiyo encoding.
      "X-Photo-Credit": encodeURIComponent(photo.user.name + " on Unsplash"),
      "X-Photo-Link": photo.links.html,
    }});
    ctx.waitUntil(cache.put(req, res.clone()));
    return res;
  },
};

Kuhamisha URL basi ni suala la kutafuta-na-kubadilisha (search-and-replace), ambalo ndilo hasa linalofanya chaguo hili listahili dakika ishirini:

ubadilishaji sawa-kwa-sawa
- https://source.unsplash.com/collection/67920491/1600x900
+ https://img.example.com/?collections=67920491&w=1600&h=900&fit=crop

Vidokezo viwili vya muundo, vyote viwili viligharimu mtu fulani alasiri mbaya kabla ya kuandikwa chini. Kuelekeza upya (redirect, 302) badala ya kupitisha (proxy) baiti mwenyewe kunakuepusha na dhima ya matumizi ya kipimo data (bandwidth) na kunahifadhi mwonekano ukihesabika kwenye CDN ya Unsplash, ambacho ndicho miongozo inachotaka. Na ukaguzi wa Referer ni wa uvumilivu kwa makusudi wakati kichwa (header) hakipo — wateja wengi halali wanaufuta — huku bado ukizuia hali dhahiri ambapo endpoint yako inageuka kuwa API ya picha za bure ya mtu mwingine.

Kanuni unazorithi mara tu unapotumia API

Source haikuwa na kanuni kwa sababu haikuwa na akaunti. API ina kanuni tano zinazobadilisha jinsi unavyoiunda muundo, zote kutoka nyaraka za sasa:

  • Kikomo cha kasi (rate limits) ni kwa saa, na kidogo mwanzoni. Maombi 50/saa katika hali ya onyesho (demo mode); 1,000/saa baada ya programu yako kuidhinishwa kwa production. Miito kwa api.unsplash.com tu ndiyo inahesabiwa — maombi ya picha kwa images.unsplash.com hayahesabiwi. Soma X-Ratelimit-Remaining kwenye kila jibu.
  • Hotlinking ni lazima, si tu inaruhusiwa. Unsplash inahitaji URL za picha zinazorudishwa na API kuingizwa moja kwa moja, ili mwonekano wa picha uweze kuhusishwa (attributed) na mpiga picha. Kuiga faili kwenye CDN yako mwenyewe ndicho kiboreshaji pekee ambacho huna uhuru wa kukifanya.
  • Hifadhi kigezo cha ixid. Kubadilisha ukubwa na kukata (crop) URL iliyorudishwa kunatarajiwa; kuondoa kigezo kinachotambulisha programu yako sivyo.
  • Sifa (attribution) na ufuatiliaji wa upakuaji ni sehemu ya mkataba — mpiga picha na Unsplash wanapewa sifa, na “upakuaji” unaripotiwa kupitia endpoint ya upakuaji ya picha wakati mtumiaji anachukua faili, ambalo ni tukio ambalo lazima uliashe (fire) mwenyewe.
  • Bidhaa zilizosambazwa zinahitaji usajili wa wateja wa nguvu (dynamic client registration). Kama unasambaza plugin, mandhari (theme), au CMS iliyowekwa peke yako (self-hosted), funguo moja iliyoshirikiwa ni ukiukwaji wa sera na pia sehemu moja ya kushindwa (single point of failure); API ina mtiririko wa usajili kwa ajili ya hali hiyo hasa.

Huu ndio wakati wa kuwa mkweli kuhusu wigo: kama unaunganisha API na funguo hata hivyo, uchaguzi wa API gani ya picha unafunguka ghafla, na inafaa kutumia dakika tano juu yake kabla ya kuandika kliaenti. Tulilinganisha zile za bure — kikomo, kanuni, tabia ya utafutaji na maumbo ya jibu — katika ulinganisho wa API za picha za hisa za bure.

Kama ulitaka tu kishikizo cha muda (placeholder), sema hivyo

Sehemu kubwa ya matumizi ya Source haikuwa kuhusu Unsplash kamwe. Ilikuwa “weka kitu chenye umbo la picha hapa wakati ninajenga mpangilio”. Kwa hilo, huduma zisizohitaji funguo bado zipo na ndizo jibu sahihi:

HudumaFunguo?UnachopataInaishia wapi
Lorem Picsum Hapana Picha halisi: picsum.photos/800/600, iliyo thabiti kwa /id/237/… au /seed/xxx/…, pamoja na ?grayscale na ?blur=1..10. Endpoint yake ya /v2/list inatoa sifa ya ukurasa wa Unsplash na mwandishi wa kila picha. Hakuna ulengaji wa mada (subject targeting) kabisa. Picha haitahusiana na ukurasa wako.
placehold.co Hapana Mstatili wenye lebo katika ukubwa wowote — kijaza kizuri cha wireframe cha kuaminika. Ni sanduku la kijivu, na linaonekana hivyo kwenye picha ya skrini iliyoshirikiwa na mteja.
Openverse Hapana Katalogi yenye leseni wazi (openly licensed) na API ya hadharani, inayoendeshwa na WordPress.org. Kulingana kwa maneno muhimu (keyword matching), na leseni zinatofautiana kwa kila kipengele — lazima uzisome.

Tofauti inayohesabika: kishikizo cha muda (placeholder) ni cha muda tu kwa ufafanuzi. Kama picha inaishia production, si tena kishikizo cha muda — ni mchoro ambao hakuna aliyeuchagua, na msomaji anaweza kuutambua.

Funguo moja badala ya tatu

Hii ndiyo sehemu ya uhamishaji ambayo hakuna anayeipanga. Watu wanaoacha Source mara chache huishia kwenye API moja. Ukurasa unahitaji hero, picha mbili za sehemu (section), na kitu kwa gridi ya kadi, na jibu la kweli mara nyingi ni Unsplash pamoja na Pexels pamoja na Pixabay — usajili tatu, mifumo mitatu ya uthibitishaji, maumbo matatu ya JSON, mifano mitatu ya uwekaji kurasa (pagination) na seti tatu za kanuni za sifa (attribution), yote hayo kujaza tagi zile zile za <img>. Kazi hiyo ya kuunganisha (integration) ndiyo gharama halisi ya URL isiyohitaji funguo kutoweka, na inagonga wiki baada ya hitilafu iliyoisababisha.

Kuunganisha hilo kuwa muunganiko mmoja ndiyo tuliyounda Pexafy: funguo moja juu ya maktaba 9 za leseni za bure katika muundo mmoja (schema), na utafutaji wa kimaana (semantic) wa kina cha sentensi — ili maelezo kamili kama “a cracked phone screen on a wooden desk, shot from above” yarudishe matokeo yaliyopangwa kwa mpangilio badala ya kutorudisha chochote. Vikomo viwili, vilivyoelezwa waziwazi, kwa sababu makala haya yote ni kuhusu kutoshangazwa mara mbili: inahitaji funguo, kwa hiyo haichukui nafasi ya kile Source ilichokuwa — inaingia kwenye kundi lile lile na API rasmi ya Unsplash hapo juu; na inabeba picha za leseni za bure, si picha za uhariri (editorial) au za chapa (brand).

Kipande ambacho ni kipya kihalisi kimelenga wasaidizi walioelezwa hapo juu: seva ya MCP kwenye mcp.pexafy.com/mcp inamaanisha modeli ambayo vinginevyo ingesoma URL ya picha kutoka kwenye kumbukumbu (memory) inaweza sasa kutafuta katalogi halisi na kurudisha picha iliyopo, ikiwa na mstari wake wa sifa (credit line) ukiambatanishwa. Hilo ni jibu bora zaidi kwa URL zilizokufa zinazoandikwa na mashine kuliko kanuni yoyote ya lint, na hoja hiyo imeandikwa katika miundombinu ya utafutaji wa picha kwa mawakala wa AI.

Kagua mali zako ndani ya dakika kumi

Chochote unachohamia, fanya sehemu hii kwanza — huwezi kurekebisha URL ambazo hujazipata. Source ni mfano wa leo tu; hatua zile zile tatu zinatumika kwa kila mali ya nje unayoingiza.

tafuta kila rejea iliyokufa, kisha uziweke nje
# 1. Kila kitu kwenye repo, ikijumuisha nyaraka, majaribio, fixtures na README.
grep -rn --binary-files=without-match \
  -e "source.unsplash.com" -e "via.placeholder.com" -e "/placeholder.png" .

# 2. Kila kitu kilichohifadhiwa kwenye database — miili ya CMS ndiko haya hujificha kwa muda mrefu zaidi.
psql -c "SELECT id FROM posts WHERE body LIKE '%source.unsplash.com%'"

# 3. Kila kitu ambacho tovuti iliyojengwa inaomba hasa: itambae (crawl) na uorodheshe hitilafu.
#    Linganisha attribute, si kiambishi cha faili — URL za picha mara chache zinaishia .jpg.
grep -rhoE 'src="[^"]+"' dist/ \
  | cut -d'"' -f2 | grep -E '^https?://' | sort -u \
  | xargs -P8 -I{} curl -s -o /dev/null -w "%{http_code} {}\n" {} \
  | grep -v "^200"

# 503 https://source.unsplash.com/random/1200x800   ← hiki ndicho unachotafuta

Kisha amua, mara moja tu, kiasi gani picha za nje zinaruhusiwa kukugharimu. Kanuni nne zinazoishi kuzimwa kunakofuata, awe ni nani anaesababisha:

  1. Chukua (fetch) wakati wa build, si wakati wa ombi. Picha inayotatuliwa (resolved) wakati wa build inashindwa kwenye CI, mbele ya msanidi programu, badala ya saa 3 usiku mbele ya mtumiaji.
  2. Kamwe usiruhusu mali ya mapambo tu izuie njia muhimu. Usipakie mapema (preload) chochote cha nje juu ya fomu ya kuingia (login); ipe kila <img> ya mtu wa tatu mbadala (fallback) wa onerror na width/height dhahiri ili kushindwa kugharimu tu sanduku tupu, si mabadiliko ya mpangilio (layout shift) au script iliyosimama.
  3. Ongeza ukaguzi kwenye CI. Hatua ya 3 hapo juu, ikiendeshwa kwenye matokeo yako ya build, inageuza “mtu fulani aligundua hatimaye” kuwa build nyekundu. Ni hatua pekee inayozuia kurudia kwake.
  4. Panga bajeti ya utegemezi wako wa nje kama utegemezi wowote mwingine. Andika chini ni host zipi kurasa zako zinaruhusiwa kutegemea na nini kitatokea kila moja ikizimwa. URL ambayo hukuhitaji kujisajili nayo bado ni utegemezi — Source imethibitisha kuwa ni utegemezi tu ambao hakuna anayemiliki.

Marejeo & tanbihi

1 Kila msimbo wa hali (status code), hesabu na mstari uliyonukuliwa katika makala haya ulichukuliwa kutoka chanzo chake cha msingi tarehe 30 Agosti 2026. Misimbo ya hali ya HTTP ilichukuliwa kwa curl dhidi ya kila muundo wa URL; zote zilirudisha 503 zikiwa na server: Heroku na mwili uliobeba herokucdn.com/error-pages/application-error.html. Utatuzi wa DNS ulithibitishwa siku hiyo hiyo (CNAME kuelekea host ya herokudns.com).

2 Vipengele vyote viwili vya changelog vimenukuliwa kikamilifu kutoka unsplash.com/documentation/changelog. Maneno ya sera ya uachwaji (wiki 3 za taarifa, header ya Warning, na msamaha kwa endpoints zisizoandikwa hadharani) yanatoka kwenye unsplash.com/documentation, siku hiyo hiyo.

3 Hitilafu ya TLS ilirudiwa kwa openssl s_client -connect changelog.unsplash.com:443 (tlsv1 alert internal error). Msururu wa redirect ulifuatwa kwa curl -L. Pengo la kumbukumbu (archive) lilichukuliwa kutoka API ya Wayback CDX: nakala ya mwisho ya 200 ya changelog.unsplash.com tarehe 20240324, ya kwanza ya unsplash.com/documentation/changelog tarehe 20240823.

4 Vichwa vya habari vya issue, tarehe za kuundwa na kufungwa vilisomwa kutoka API ya REST ya GitHub (mui/material-ui#42736, nextcloud/unsplash#115, sindresorhus/Actions#248) na kutoka API ya JSON ya drupal.org kwa issue namba 3324054 ya gin_login, ambayo mwili wake unaripoti “I get always a Heroku application error” mnamo Novemba 2022.

5 Hesabu: API ya utafutaji wa msimbo wa GitHub (faili 3,344; sampuli ya matokeo 100 iliyopunguzwa marudio hadi repositori 77, ambapo 12 ziliundwa baada ya tarehe 11 Juni 2024 na 20 zilikuwa zimesukumwa (pushed) ndani ya miezi 12 iliyopita); API ya upakuaji ya rejista ya npm (unsplash-source-es6, upakuaji 23 katika siku 30 zilizopita); Stack Exchange /search/excerpts (machapisho 1,459). Utafutaji wa msimbo unahusu tu repositori za hadharani zilizowekwa fahirisi (indexed), kwa hiyo kila kielelezo ni kiwango cha chini.

Maswali yanayoulizwa mara kwa mara

Je, source.unsplash.com imezimwa kwa muda, au imefungwa kabisa?
Kabisa. Unsplash ilitangaza kuzimwa kwake tarehe 11 Juni 2024 — “tutaanza kwa kuzima kipengele cha utafutaji, kisha ndani ya wiki zijazo tutazima programu nzima” — baada ya kuiondoa rasmi kwenye matumizi tarehe 25 Novemba 2021. Kila muundo (/random, /1600x900/?query, /collection/…, /daily) unarudisha HTTP 503 pamoja na ukurasa wa jumla wa Application Error wa Heroku. Jina la seva bado linatambulika, kwa hiyo hitilafu hiyo inaonekana kama picha iliyovunjika badala ya hitilafu ya mtandao.
Ni nini mbadala wa moja kwa moja wa source.unsplash.com/random?
Hakuna mbadala usiohitaji ufunguo unaoweza kubandikwa moja kwa moja, na hilo ni jambo la kukubali mapema. Kuna mbadala tatu. URL thabiti ya CDN — images.unsplash.com/photo-…?w=1600&h=900&fit=crop — haihitaji ufunguo lakini daima inarudisha picha ile ile, ambayo ndiyo hasa mahitaji mengi ya kupamba yalihitaji. API rasmi, GET https://api.unsplash.com/photos/random ikiwa na kichwa cha Authorization: Client-ID, inarudisha uwezo wa nasibu lakini lazima iitwe upande wa seva. Proxy ndogo unayomiliki mbele ya endpoint hiyo ndiyo chaguo pekee linalorudisha URL isiyohitaji ufunguo unayoweza kuiweka moja kwa moja kwenye lebo ya <img>.
Kwa nini zana za AI za kuandika code bado zinazalisha URL za source.unsplash.com mwaka 2026?
Kwa sababu URL hiyo iliandikwa kwenye nyaraka, ilifundishwa na kunakiliwa kwa takribani miaka nane, na hifadhi ya mafunzo haiishi muda wake pale huduma inapozimwa. Kwa kipimo cha tarehe 30 Agosti 2026: utafutaji wa code wa GitHub bado unarudisha faili 3,344 zenye URL hiyo, na kwenye sampuli ya faili 100, hazina 12 kati ya 77 ziliundwa baada ya kuzimwa kwake. Hata maktaba za maelekezo (prompts) zilizoandikwa na binadamu zinarudia maagizo hayo — mfano mmoja wa prompt ya GPT inayonakiliwa sana bado inamwambia mfumo “tumia unsplash API( https://source.unsplash.com/1280x720/?… )”. Chukulia URL yoyote ya picha inayoandikwa na mfumo wa AI kama isiyothibitishwa, na angalia msimbo wa hali (status codes) kwenye CI.
Je, bado ninaweza kupata picha nasibu ya Unsplash bila ufunguo wa API?
Sio moja kwa moja kutoka Unsplash — uchaguzi wa nasibu sasa uko nyuma ya /photos/random, ambayo inahitaji Client-ID. Njia zako mbili zisizohitaji ufunguo ni proxy unayohifadhi mwenyewe, ambapo ufunguo unabaki upande wa seva na URL ya umma inafanana na ile ya zamani, au huduma ya nafasi ya muda ya mtu wa tatu kama Lorem Picsum (picsum.photos/800/600), inayotoa picha halisi bila ufunguo lakini pia bila uwezo wowote wa kulenga mada.
Je, API ya Unsplash inaruhusu kupakua na kuhifadhi picha kwenye seva yako mwenyewe?
Hapana. Tofauti na API nyingi nyingi, Unsplash inahitaji hotlinking: URL za picha zinazorudishwa na API lazima ziwekwe moja kwa moja, ili mionekano ya picha ihesabiwe kwa ajili ya mpiga picha. Majukumu matatu yanakuja pamoja na hilo — hifadhi kigezo cha ixid unapobadilisha ukubwa au kukata URL, mpe sifa mpiga picha na Unsplash, na piga endpoint ya kupakua picha wakati mtumiaji anachukua faili hilo. Kunakili faili hizo kwenye CDN yako mwenyewe ni uboreshaji ambao huruhusiwi kufanya.
Kwa nini tangazo la kuondolewa rasmi la 2021 halikuwalinda watumiaji waliokuwepo?
Kwa sababu tangazo hilo na sera havikuhusiana na jambo lile lile. Kipengele cha changelog cha tarehe 25 Novemba 2021 kiliahidi kuwa “matumizi yaliyopo yataendelea kufanya kazi” na hakikutoa tarehe ya mwisho. Sera ya Unsplash iliyochapishwa ya kuondoa huduma rasmi — angalau wiki tatu za taarifa pamoja na kichwa cha Warning — inatumika kwa mashamba na endpoint zilizoandikwa rasmi kwenye nyaraka za umma, na aya ile ile inasema kuwa chochote kisichoandikwa rasmi kinaweza kubadilika bila taarifa yoyote. Source haikuwahi kuwa endpoint iliyoandikwa rasmi ya API, hivyo ilikuwa nje ya sera ambayo ingeilinda.
Ninawezaje kupata kila URL iliyokufa ya source.unsplash.com kwenye mradi wangu?
Hatua tatu, dakika kumi. Fanya grep kwenye hazina (repository) ikiwa ni pamoja na nyaraka, majaribio, mifano ya data na faili za README — grep -rn "source.unsplash.com" . — kwani URL hizi hudumu muda mrefu zaidi kwenye code za mfano. Fanya query kwenye database, kwa sababu maandishi ya makala kwenye CMS ndipo yanapojificha (WHERE body LIKE '%source.unsplash.com%'). Kisha tambaza matokeo yaliyojengwa (built output): toa kila URL ya picha na omba kila moja, ukiorodhesha yoyote isiyorudisha 200. Ongeza hatua hiyo ya mwisho kwenye CI ili faili ya nje iliyokufa isababishe ujenzi kushindwa badala ya ukurasa kuvunjika.

Acha kuwinda maneno muhimu. Eleza unachomaanisha.

Tafuta picha 9M+ za bure kwa maana — katika lugha yoyote, kwa chini ya 100 ms.