gekro
GitHub LinkedIn
AI Engineering

AI वॉटरमार्किंगची शस्त्रस्पर्धा

12 मिनिटांचे वाचन

हा इंग्रजी मूळ लेखाचा यांत्रिक अनुवाद आहे. काही बारकावे हरवू शकतात, म्हणून संदर्भासाठी इंग्रजी आवृत्तीच ग्राह्य धरावी. मूळ लेख इंग्रजीत वाचा

थोडक्यात

Anthropic ने Claude च्या टेक्स्ट आउटपुटवर वॉटरमार्क लावायला सुरुवात केली आहे. जनरेटिव्ह टेक्स्ट वॉटरमार्किंग प्रत्यक्षात कसं काम करतं, कोणताही तिसरा पक्ष ते अजून का तपासू शकत नाही, दस्तऐवजाला दोन लेखक असले की ओळखण्याची ताकद यंत्र-लिखित भागाच्या वर्गमुळापर्यंत का घसरते, आणि मी स्कोअर बनवण्याऐवजी 'तपासता येत नाही' असं सांगणारं टूल का प्रकाशित केलं.
Anthropic ने Claude च्या आउटपुटवर खूण लावायला सुरुवात केली आहे. टेक्स्टला सांख्यिकीय वॉटरमार्क, फाइल्सना C2PA स्वाक्षरित मेटाडेटा, आणि हे 2 ऑगस्ट 2026 पासून लाँच होणाऱ्या सगळ्यावर मॉडेल-दर-मॉडेल जगभरात लागू होत आहे, EU AI Act च्या पारदर्शकता कोडनुसार. मी डिटेक्टर बनवायला निघालो आणि जमलं नाही. पद्धत अप्रकाशित आहे, संकेत मॉडेलच्या शब्दनिवडीत आहे, शोधता येईल अशा कोणत्याही अक्षरात नाही, आणि दस्तऐवजाला दोन लेखक असले की आकडेवारी अशा प्रकारे कोसळते जी तीन ओळींत काढता येते. म्हणून मी असं टूल बनवलं जे काय तपासता येतं ते सांगतं, आणि काही नसेल तर तसंही स्पष्ट सांगतं.

मी Anthropic ची घोषणा वाचली आणि झिरो-विड्थ कॅरेक्टर शोधायला टेक्स्ट एडिटर उघडला. एकही नाही. वॉटरमार्क अक्षरांच्या मध्ये लपलेला नाही, तो मॉडेलने कोणते शब्द निवडले यात आहे, आणि हे मान्य करायला मला जितका वेळ लागायला हवा होता त्यापेक्षा जास्त लागला. याचा अर्थ “वॉटरमार्क रिमूव्हर”ला काढायला काहीच नाही.

लोक वॉटरमार्क म्हणतात त्या तीन गोष्टी

तीन वेगवेगळ्या यंत्रणांना वॉटरमार्क म्हटलं जातं. त्यांच्यात आपसात जवळजवळ काहीही साम्य नाही.

यंत्रणासंकेत कुठे राहतोकशाने निघतोतिसऱ्या पक्षाला ओळखता येतो का
लपवलेला Unicodeझिरो-विड्थ कॅरेक्टर, Tag ब्लॉक (U+E0000-E007F)कोणतंही शोधा-आणि-बदलाहो, अगदी सहज
C2PA मेटाडेटाफाइल कंटेनरमधला स्वाक्षरित मॅनिफेस्टस्क्रीनशॉट, पुन्हा सेव्ह, फॉरमॅट बदलणंहो, उपस्थिती तपासता येते
सांख्यिकीय वॉटरमार्कमॉडेलच्या टोकन निवडीजोरदार पॅराफ्रेज किंवा भाषांतरनाही, वेंडरची की लागते

Anthropic यांपैकी दोन लावतं. फाइल्सना .svg, .png आणि .jpg वर C2PA स्वाक्षरित प्रोव्हेनन्स मेटाडेटा मिळतो, तोच Content Credentials मानक जो इमेजिंग उद्योग वापरतो. टेक्स्टला तिसरी ओळ मिळते. Anthropic चे दस्तऐवज त्याला “थेट मजकुरातच असलेला अदृश्य वॉटरमार्क” म्हणतात, जो “Claude च्या उत्तराचा अर्थ, दर्जा किंवा वाचनीयता बदलत नाही”.

रोलआउट मथळ्यांनी सुचवलं त्यापेक्षा मर्यादित आहे. Anthropic च्या शब्दांत, “2 ऑगस्ट 2026 रोजी किंवा त्यानंतर लाँच झालेले Claude मॉडेल लाँचपासून यंत्र-वाचनीय खूण सपोर्ट करतील”, आणि सध्याच्या मॉडेल्ससाठी सपोर्ट सुरू असलेलं काम म्हणून वर्णिलं आहे. विभागणी मॉडेलनुसार आहे, देशानुसार नाही. त्याच पानावर म्हटलं आहे की जिथे Claude उपलब्ध आहे तिथे सपोर्टेड मॉडेल्सच्या आउटपुटवर खूण लावणं लागू होतं, जगभरात. मागची प्रेरणा EU AI Act च्या कलम 50(2) अंतर्गत AI-निर्मित मजकुराच्या पारदर्शकतेवरील आचारसंहिता आहे, ज्यावर Anthropic ने मॉडेल प्रदाता आणि जनरेटिव्ह AI सिस्टीम प्रदाता, दोन्ही म्हणून स्वाक्षरी केली. म्हणजे ते मॉडेल-दर-मॉडेल येतं, आणि एखाद्या मॉडेलमध्ये आलं की सगळ्यांना मिळतं.

Google बऱ्याच काळापासून Gemini मध्ये SynthID-Text चालवत आहे, आणि पद्धत Nature मध्ये प्रकाशित आहे. ती फक्त सॅम्पलिंगचा टप्पा बदलते. प्रत्येक टोकनवर ती आधीच्या k टोकनांनी एक छद्म-यादृच्छिक फंक्शन सीड करते, शब्दसंग्रहाला m स्तरांच्या टूर्नामेंट ब्रॅकेटमध्ये वाटते, आणि जे टोकन आपले सामने जिंकत राहतात त्यांची सॅम्पलिंग शक्यता वाढवते. हे पुरेशा स्तरांवर आणि पुरेशा टोकनांवर पसरवलं की मोजता येईल असा सांख्यिकीय कल मिळतो, आणि वाचकाला कोणताही एक शब्द चुकीचा वाटत नाही.

पडताळणीसाठी मूळ मॉडेल लागत नाही. त्याला कीवर आधारित छद्म-यादृच्छिक फंक्शन आणि उमेदवार मजकुरावर एक स्कोअरिंग पास लागतो. वॉटरमार्क असलेल्या मजकुरात वॉटरमार्कशिवायच्या मजकुरापेक्षा पद्धतशीरपणे जास्त g-मूल्ये असतात, आणि तो फरक म्हणजे एक गृहीतक चाचणी.

इथेच मी अडकलो.

Signal              Verifiable in a browser?     Why
------              ------------------------     ---
Zero-width chars    Yes                          Codepoint scan
Unicode Tag block   Yes                          Codepoint scan, decodes to ASCII
C2PA manifest       Presence, not signature      JUMBF box / PNG caBX chunk markers
Claude watermark    NO                           Keyed detector, method unpublished
SynthID-Text        NO                           Keyed detector, Google-side API

Anthropic चं मदत पान याबाबत थेट आहे. ते म्हणतात की ते “वापरकर्त्यांना आणि इतर तिसऱ्या पक्षांना Claude चे एम्बेड केलेले वॉटरमार्क आणि प्रोव्हेनन्स मेटाडेटा ओळखता यावेत यासाठी काम करत आहेत” आणि ते “आगामी तांत्रिक दस्तऐवजीकरणात पडताळणी यंत्रणांचे तपशील शेअर करतील”. आगामी म्हणजे ते अजून अस्तित्वात नाही. ते येईपर्यंत Anthropic बाहेरचं कोणीही टेक्स्ट वॉटरमार्क तपासू शकत नाही. जे टूल तपासल्याचा दावा करतं ते दुसऱ्या नावाने एक सामान्य AI-टेक्स्ट क्लासिफायर चालवतं आहे, आणि त्यांच्या चुकांचं प्रमाण खूपच वाईट आहे, विशेषतः दुसऱ्या भाषेत लिहिणाऱ्यांच्या बाबतीत.

इन्स्पेक्टर बनवणं

म्हणून मी अशी आवृत्ती बनवली जी फक्त तेवढंच दावा करते जेवढं तपासू शकते.

C2PA बाजूला सर्वात जास्त कोड लागला. Content Credentials मॅनिफेस्ट JUMBF बॉक्समध्ये राहतो, आणि तो बॉक्स कुठे सापडेल हे कंटेनरवर अवलंबून असतं. PNG त्याला caBX चंकमध्ये ठेवतो, JPEG त्याला APP11 सेगमेंटमध्ये वाहून नेतो, SVG त्याला XML मेटाडेटामध्ये ठेवतो. तो शोधण्याचा अर्थ कच्च्या बाइट्समध्ये ते मार्कर स्कॅन करणं:

const scanC2PA = (buf: ArrayBuffer) => {
  const bytes = new Uint8Array(buf);

  const find = (needle: string): boolean => {
    const n = needle.length;
    const limit = bytes.length - n;
    for (let i = 0; i <= limit; i++) {
      let ok = true;
      for (let j = 0; j < n; j++) {
        if (bytes[i + j] !== needle.charCodeAt(j)) { ok = false; break; }
      }
      if (ok) return true;
    }
    return false;
  };

  const isPng = bytes[0] === 0x89 &&
    String.fromCharCode(bytes[1], bytes[2], bytes[3]) === 'PNG';

  const hasJumbf  = find('jumb') || find('jumd');
  const hasC2pa   = find('c2pa');
  const hasPngBox = isPng && find('caBX');

  return { found: hasC2pa || hasPngBox, hasJumbf, isPng };
};

यातून मॅनिफेस्ट सापडतो. त्याची पडताळणी होत नाही. पडताळणी म्हणजे सर्टिफिकेट चेन आणि क्रिप्टोग्राफिक स्वाक्षरीची तपासणी, आणि मी ते ब्राउझर टॅबमध्ये हाताने लिहून अधिकृत म्हणून सादर करणार नाही. टूल तसं सांगतं आणि अधिकृत वेरिफायरकडे बोट दाखवतं.

स्कॅनमध्ये एक अपयशाची शक्यता आहे जिचं नाव मला घ्यायला हवं, लपवायला नको. कच्च्या बाइट्समध्ये चार अक्षरांचा मार्कर शोधताना चुकीचा पॉझिटिव्ह मिळू शकतो, कारण संकुचित इमेज डेटाच्या आत c2pa बाइट्स येणं कोणी थांबवत नाही. तरीही मी ते ठेवलं. तीन फॉरमॅटमध्ये कंटेनरची रचना नीट पार्स करणं हे अशा टूलसाठी खूप मेहनतीचं आहे ज्याचा संपूर्ण दावा फक्त “इथे काहीतरी आहे, दुसरीकडे जाऊन तपासा” असा आहे. हा स्मोक अलार्म आहे, आणि लेबल तेच सांगतं. हे कधी पुरेसं ठरलं नाही, तर उपाय म्हणजे खरं बॉक्स पार्सिंग.

टेक्स्ट बाजू माझ्या लपवलेल्या-टेक्स्ट इन्स्पेक्टरचा कोडपॉइंट स्कॅनर पुन्हा वापरते: झिरो-विड्थ कॅरेक्टर, Unicode Tag ब्लॉक जो पूर्ण ASCII संदेश अदृश्यपणे तस्करी करू शकतो, bidi कंट्रोल, व्हेरिएशन सिलेक्टर. हे सगळं ओळखता येतं आणि चिन्हांकित करण्यासारखं आहे.

सर्वात कठीण भाग कोड नव्हता. तो एकाच निकालाचे शब्द होते. टूलमध्ये “सांख्यिकीय वॉटरमार्क (Claude, SynthID-Text)” नावाचा एक संकेत आहे ज्याची कायमची स्थिती not checkable आहे, सोबत स्पष्टीकरण. प्रकाशित करण्यापूर्वी मी यावर बराच वेळ बसून राहिलो, कारण “मला माहीत नाही” म्हणणारं टूल बिघडलेलं दिसतं.

हे महत्त्वाचं आहे कारण हे निकाल कसे वापरले जातात. कोणीतरी एक परिच्छेद चेकरमध्ये टाकतं आणि आउटपुट शिस्तभंग बैठकीत घेऊन जातं. म्हणून टूल चार सूचनांनी सुरू होतं. पहिल्या दोन Anthropic ची स्वतःची भूमिका आहेत, उरलेल्या दोन माझ्या आहेत, मी जे बनवलं त्याच्या मर्यादांबद्दल:

  • खूण नसणं हा मानवी लेखनाचा पुरावा नाही. Anthropic जोरदार संपादन, पॅराफ्रेजिंग, भाषांतर आणि इतर लेखनात मिसळणं यांना अशा परिस्थिती म्हणून सांगतं ज्यात खुणा ओळखता येत नाहीत.
  • खूण असणं हा लेखकत्वाचा पुरावा नाही. तो सूचित करतो की मजकूर त्या मॉडेलमधून गेला असू शकतो, कोणी लिहिला किंवा माणसाने किती बदलला हे नाही.
  • C2PA ची उपस्थिती म्हणजे C2PA ची पडताळणी नाही. हे टूल मॅनिफेस्ट शोधतं, स्वाक्षरी किंवा जारीकर्त्याची वैधता तपासत नाही.
  • मेटाडेटा नाजूक असतो. स्क्रीनशॉट, पुन्हा सेव्ह आणि बहुतेक प्लॅटफॉर्म अपलोड तो काढून टाकतात, त्यामुळे डाउनलोड केलेल्या फाइलवर स्वच्छ निकाल मूळाबद्दल फार कमी सांगतो.

दस्तऐवजाला दोन लेखक असले तर काय होतं

वरचं सगळं एका दस्तऐवजाला एक लेखक गृहीत धरतं. जवळजवळ कशालाच एक नसतो. लोक एका चॅटबॉटमध्ये मसुदा करतात, दुसऱ्यात एक भाग पुन्हा लिहितात, त्या आठवड्यात जे सर्वात स्वस्त असेल त्यासाठी OpenRouter मार्गे रूट करतात, आणि मधे हाताने संपादन करतात. ही काही विचित्र चकवा देण्याची युक्ती नाही, आज लोक असंच काम करतात.

Anthropic हे आधीच नोंदवतं. खूण ओळखता येत नाही अशा परिस्थितींच्या त्यांच्या यादीत “जोरदार संपादित, पॅराफ्रेज केलेला, भाषांतरित, किंवा इतर लेखनात मिसळलेला” मजकूर आहे. ते हे सावधगिरी म्हणून सांगतात आणि तिथेच थांबतात. यंत्रणा ही आहे, कारण परिणामाचा आकार मला चकित करून गेला.

ग्रीन-लिस्ट पडताळणी म्हणजे टोकन मोजणीवरची z-चाचणी. ही प्रकाशित ग्रीन-लिस्ट रचना आहे, उदाहरणादाखल पॅरामीटर्ससह. ही Anthropic ची योजना नाही, जी अप्रकाशित आहे. निकालाचा आकार लागू होतो, विशिष्ट आकडे नाही.

z = (greens - γT) / sqrt(T · γ(1-γ))

समजा दस्तऐवजात T टोकन आहेत, त्यापैकी फक्त W यंत्र-लिखित, आणि प्रत्येक ग्रीन दर ε ने वाढवतो. मानवी टोकन पायाभूत दर γ वर ग्रीन देतात, म्हणून अपेक्षित ग्रीन मोजणी Tγ + Wε आहे आणि पूर्ण दस्तऐवजाची सांख्यिकी अशी होते:

z_whole = W·ε / sqrt(T · γ(1-γ))

आता फक्त यंत्र-लिखित भागाला स्कोअर करा:

z_span  = ε·sqrt(W) / sqrt(γ(1-γ))

एकाला दुसऱ्याने भागा आणि सगळं कापलं जाऊन एकच संख्या उरते:

z_whole / z_span = sqrt(W/T) = sqrt(f)

पूर्ण दस्तऐवजाला स्कोअर केल्यास तुमच्या ओळखण्याच्या ताकदीचा फक्त यंत्र-लिखित अंशाचा वर्गमूल उरतो. f = 0.1 वर ते 32% आहे. उदाहरणादाखल γ = 0.5 आणि ग्रीन दरातील वाढ ε = 0.25 घेतल्यास, 300 टोकनांचा यंत्र-लिखित भाग एकटा z = 8.66 मिळवतो आणि प्रचंड खात्रीने चिन्हांकित होईल. तोच भाग 3,000 टोकनांच्या दस्तऐवजात टाका आणि पूर्ण दस्तऐवजाचा स्कोअर z = 2.74 वर घसरतो, कोणत्याही वाजवी मर्यादेच्या खाली. वॉटरमार्क बदलला नाही. डिटेक्टरने चुकीचं एकक मोजलं.

म्हणजे मॉडेल मिसळणं वॉटरमार्कवर हल्ला करत नाही. ते डिटेक्टरच्या विंडो निवडीवर हल्ला करतं.

उपाय म्हणजे मजकुरावरून एक विंडो सरकवणं आणि कमाल स्कोअर घेणं, साधारण SynthID-Text पेपरमधली WinMax कल्पना. ती चालते, आणि त्याची किंमतही आहे. शेकडो ओव्हरलॅपिंग विंडो स्कोअर करणं म्हणजे एका दस्तऐवजावर शेकडो गृहीतक चाचण्या चालवणं, म्हणून बहु-तुलना दुरुस्ती लागते, ती मर्यादा वर ढकलते, आणि ती लहान भागांना पुन्हा खाली ढकलते. तुम्ही पातळ होण्याची समस्या चुकीच्या पॉझिटिव्हच्या समस्येशी बदलता, आणि त्या डायलचं कोणतंही सेटिंग दोन्ही टाळत नाही.

विंडोइंग फक्त एका वेंडरच्या खुणेचं स्थान शोधतं, कारण प्रत्येक प्रदाता आपलं छद्म-यादृच्छिक फंक्शन स्वतःच्या कीने चालवतो:

for each vendor key K:          # Anthropic, Google, OpenAI, ...
    for each window w in text:  # all of these need FPR correction together
        score(w, K)

तीन वेंडर म्हणजे तीन डिटेक्टर, तीन API राउंड-ट्रिप, तीन विश्वासाची नाती. फेडरेटेड आवृत्ती कोणीच देत नाही, आणि Anthropic ची अजून सार्वजनिक नाही.

मग ते भोक आहे जे वरच्या बहुतेक गोष्टींना केवळ सैद्धांतिक बनवतं. वॉटरमार्किंगसाठी इन्फरन्स चालवणाऱ्याने सॅम्पलिंगचा टप्पा झुकवणं आवश्यक असतं. हा सर्व्हिंग स्टॅकचा गुण आहे, मजकुराचा नाही. म्हणून:

मार्गवॉटरमार्क आहे का?का
OpenRouter → Claude / Gemini / GPTहोटोकन परत करण्यापूर्वी प्रदात्याच्या स्टॅकमध्येच लावला जातो. राउटर फक्त तयार मजकूर पुढे पाठवतो.
OpenRouter → Llama / Qwen / Mistralनाहीओपन-वेट इन्फरन्स प्रदात्यांवर झुकलेलं सॅम्पलिंग राबवण्याचं बंधन नाही आणि प्रेरणाही नाही.
तुमच्या स्वतःच्या लॅपटॉपवर llama.cppनाहीतेच कारण, आणखी जास्त.

OpenRouter रूटिंग करून वॉटरमार्कला हरवत नाही. ते अशी लेन देतं जिथे खूण कधी लावलीच गेली नाही, आणि ती लेन एका कॉन्फिग स्ट्रिंगच्या अंतरावर आहे. म्हणून ही व्यवस्था प्रोप्रायटरी फ्रंटियर API पुरती आहे, आणि दुसरं काही नाही. ओपन वेट बहुतेक टेक्स्ट कामांसाठी आधीच पुरेसे चांगले आहेत आणि ते बाहेर आहेत. ज्याला यातून सुटायचं तो मॉडेलचं नाव बदलतो.

मी हा पातळ होण्याचा परिणाम इन्स्पेक्टरमध्ये तिसऱ्या टॅब म्हणून जोडला. तो कोणताही मजकूर तपासत नाही आणि काही ओळखत नाही. तो z-चाचणीचं गणित चालवतो आणि यंत्र-लिखित अंश बदलला की दोन स्कोअर कसे वेगळे होतात ते काढून दाखवतो.

मी काय चुकलो

मी गृहीत धरलं होतं की वॉटरमार्कचा टिकाऊपणा म्हणजे संपादनं टिकणं. तो पॅराफ्रेज टिकण्याबद्दल आहे, जे खूप कठीण आहे, कारण पॅराफ्रेज टोकन निवडी पुन्हा सॅम्पल करतो आणि संकेत तिथेच राहतो. माझी पहिली योजना आत्मविश्वास टक्केवारी असलेला चेकर होती, कारण लोकांना तेच अपेक्षित असतं आणि तेच रँक करतं. मी ती मारून टाकली. मी बनवलेला कोणताही आकडा दुसऱ्या लेबलखाली सामान्य AI-टेक्स्ट क्लासिफायर झाला असता, आणि त्यांच्या चुकीच्या पॉझिटिव्हच्या नोंदवलेल्या समस्या आहेत, विशेषतः मूळ इंग्रजी नसलेल्या लेखकांविरुद्ध.

कठीण निर्णय वॉटरमार्क रिमूव्हरचा होता, शेजारचं ते उत्पादन जे खरंच ट्रॅफिक खेचलं असतं. मी ते वगळलं. ते खुलाशाच्या बांधिलकीला चकवा देण्याचं टूल झालं असतं, आणि तरीही चालत नाही. काढायला कोणतं अक्षर नाही, म्हणून काढणं म्हणजे इतकं आक्रमक पॅराफ्रेज की लेखन बिघडतं, आणि ब्राउझर टूल मॉडेल पाठवल्याशिवाय पॅराफ्रेज करू शकत नाही. नंतर माझ्या मनात राहिलेली गोष्ट ही की याच्यासोबत मी प्रकाशित केलेलं विरामचिन्ह दुरुस्त करणारं टूल झिरो-विड्थ कॅरेक्टर काढतं, जे मला माझ्या स्वतःच्या मसुद्यांसाठी हवं होतं. तोच रेजेक्स, वेगळं उत्पादन. सीमारेषा पेज टूल कशासाठी आहे असं सांगतं त्यात आहे, कोडमध्ये नाही.

हे कुठे जातं

जो प्रोव्हेनन्स संकेत फक्त वेंडरच पडताळू शकतो तो अजून सार्वजनिक प्रोव्हेनन्स नाही. पण sqrt(f) चा निकाल “शस्त्रस्पर्धा सुरू आहे” यापेक्षा जास्त नेमक्या गोष्टीकडे बोट दाखवतो. फक्त मजकुरावर आधारित फॉरेन्सिक लोक खरंच विचारतात त्या प्रश्नाचं उत्तर देऊ शकत नाही. मजकूर निर्माण झाला का नाही, हे नव्हे, तर कोणते भाग, कोणी, आणि माणसाने किती बदललं. आपल्याकडे असलेली प्रत्येक यंत्रणा नेमकी तिथेच बिघडते जिथे खरे दस्तऐवज राहतात, अनेक लेखक आणि दीर्घ संपादन इतिहास असलेल्या फाइल्समध्ये. म्हणून उपयुक्त पाऊल बहुधा मजकुराची उलटतपासणी थांबवून परिसर नोंदवणं सुरू करणं आहे. एडिटरचा रिव्हिजन इतिहास, कमिट टाइमलाइन आणि स्वाक्षरित संपादन-साखळ्या आधीच तयार झालेल्या कलाकृतीवरच्या कोणत्याही सांख्यिकीय चाचणीपेक्षा लेखकत्व कितीतरी जास्त विश्वासार्हपणे टिपतात, आणि C2PA चं असर्शन मॉडेल नेमकं याच प्रकारच्या स्तरित, अनेक कर्त्यांच्या प्रोव्हेनन्सला लक्ष्य करतं. वॉटरमार्कचं खरं काम मथळ्यांनी सुचवलं त्यापेक्षा मर्यादित आहे. हे ते यंत्र-टेक्स्ट कोणी लपवू पाहत नाही त्यासाठीचा डिफॉल्ट-ऑन खुलासा आहे, आणि विरोधी प्रकरणं तिथे हाताळली जातात जिथे ती नेहमीच असायला हवी होती, दस्तऐवज कसा बनला हे नोंदवणाऱ्या टूल्समध्ये.

Rohit Burani

लेखक

Rohit Burani

AI इंजिनिअर, जे लॅबमधून लोकल-फर्स्ट सिस्टीम, सेल्फ-होस्टेड इन्फ्रास्ट्रक्चर आणि स्वायत्त टूल्स तयार करतात.

वाचल्याबद्दल धन्यवाद.

हा लेख आवडला असेल तर तो तुमच्या नेटवर्कसोबत शेअर करा.

← ब्लॉगवर परत जा