Clepit
Sa isang sulyap
- Kategorya
- Plataporma para sa developer
- Website
- clepit.com
- Console
- app.clepit.com
- Dokumentasyon
- clepit.com/en/docs
- GraphQL API
- api.clepit.com/graphql
- Realtime
- ws.clepit.com
- MCP surface
- api.clepit.com/mcp
- Mga nailathalang pahina
- clepit.space
Karamihan sa rich text ay napupunta sa database bilang isang tipak ng HTML. Ayos lang iyon hangga’t wala kang ibang gustong gawin dito kundi ipakita muli: hanapin ang bawat pahinang bumabanggit sa isang kostumer, ipakita ang parehong dokumento sa web page, e-mail at mobile app, o hayaang dalawang tao ang sabay na mag-edit nang walang mawawalang talata. Sa puntong iyon, magusot na ang mga salita at ang anyo ng mga ito, at ang tanging nakakabasa pa nang maaasahan sa dokumento ay ang editor na sumulat nito.
Pinaghihiwalay ng Clepit ang dalawa. Ang pahina ay listahan ng mga bloke, bawat isa ay maliit na bagay na may tiyak na uri, at ang dokumento ay JSON: walang markup na kailangang basagin, at walang editor na kailangan para mabasa ito. Iyan din ang dahilan kung bakit nakatayo nang mag-isa ang editor. Ang @clepit/core ay nakalathala sa npm sa ilalim ng lisensiyang MIT at walang alam sa panig na naka-host, habang ang workspace sa app.clepit.com ang nagiging anyo ng mga dokumentong iyon kapag binigyan na sila ng mga kasamang manunulat, pahintulot, kasaysayan, at tirahan sa publikong web.
Ang pahina ay listahan ng mga bloke
Ang isang bloke ay apat na patlang: isang id, isang uri, ang datos na tinutukoy ng uring iyon, at anumang tuning na ipinatong dito. Iba ang hugis ng datos ng isang talata kaysa sa hugis ng datos ng isang talahanayan, at ang uri ang nagsasabi kung anong hugis ang aasahan, kaya ang nakaimbak na dokumento ay masusuri at hindi basta binabasa lamang. Ang buong pahina ay isang timestamp, isang bersyon, at ang mga bloke ayon sa pagkakasunod, sapat na maliit para mabasa mismo ng iyong mga mata at masuri sa isang pull request. Walang anuman doon ang naglalarawan kung ano ang dapat na hitsura ng pahina: pag-aari iyon ng kung ano man ang gumuguhit nito, at iyan ang nagpapahintulot sa isang dokumento na maging web page, e-mail at mobile screen nang hindi kailangang umiral ang tatlong kopya nito.
Pagguhit ng dokumento nang walang browser
Hindi kailanman direktang sumusulat sa browser ang renderer. Gumuguhit ito sa pamamagitan ng manipis na patong na may dalawang suporta sa likod: isang gumagawa ng tunay na mga sangkap ng pahina at isang gumagawa ng string, at iisang code ng bloke ang tumatakbo sa dalawa. Ganoon naiguguhit ang isang nailathalang pahina sa isang server na walang anumang browser, at kaya nga ang inilalabas ng server ay iyon ding dokumentong ipinakita sana ng editor, hindi isang pangalawang pagpapatupad na unti-unting lumilihis. Ang string backing ay humihingi ng sanitiser bilang kinakailangang argumento at sadyang walang default: ang karaniwang sanitiser ng pakete ay gumagawa muna ng pahina bago makapagsuri, kaya hindi iyon tatakbo roon, at ang tahimik na pagbalik sa escaping ay huhubad sa loob-anyo ng bawat dokumento nang hindi man lang nagsasabi. Kaya iniwang nakikita ang puwang doon mismo sa ginagamitan, sa halip na itago sa isang default.
Ang pagbabasa ay walang gastos na JavaScript para sa mambabasa
Magkahiwalay na ipinapadala ng React adapter ang dalawang kalahati nito, dahil magkasalungat ang gusto ng bawat isa. Tumatakbo sa server ang content component at naglalabas ng tapos nang markup habang binubuo ang pahina, kaya natatanggap ng mambabasa ang dokumento sa unang tugon pa lamang. Ang editor component naman ay nasa panig lamang ng kliyente, dahil ito ang may hawak sa buhay ng editor, at wala pang hahawakan hangga’t walang browser. Kaya naman walang anumang JavaScript ang kailangan para mabasa ang isang dokumentong Clepit. Sa pagsulat dumarating ang runtime.
Ano ang kayang lamanin ng isang pahina
Dalawampu’t anim na uri ng bloke ang kasama sa pakete. Karamihan ay iyong kailangan ng anumang editor: mga heading, talata, listahan, checklist, sipi, code, talahanayan, larawan, audio, video, file, paalala at panghati. Umiiral naman ang iba dahil ang pagsulat ng dokumentasyon ay humihingi ng mga bagay na karaniwang binabalewala ng kasangkapang pampasulat. Isang talaan ng nilalaman na binubuo ang sarili mula sa mga heading ng dokumento at nag-uugnay sa bawat isa. Mga seksiyong natitiklop at mga kolum. Isang kard na kumakatawan sa ibang pahina. Isang malayang guhit. At isang bloke ng aktibidad na nag-iimbak kung aling dokumento ang babantayan, hindi kopya ng aktibidad nito, kaya patuloy nitong ipinapakita ang nangyayari ngayon sa halip na manigas sa araw na ito ay ipinasok. Ang anyo sa loob ng bloke ay sumasaklaw sa karaniwang mga marka, makapal, pahilis, may salungguhit, may guhit sa gitna, code sa loob ng pangungusap, pagtatampok at mga link, kasama ang mga tooltip, status chip at pagbanggit sa tao. Ang pakete mismo ay walang anumang runtime dependency.
Mga pormula at diyagrama, iginuguhit sa loob ng pakete
Dalawa sa mga blokeng iyon ang naglalabas ng LaTeX at Mermaid, at pareho nilang ginagawa ang buong trabaho sa loob ng pakete: suriin ang pinagmulan, kuwentahin ang anyo, iguhit ang resulta. Walang aklatang panguhit sa ilalim nito at walang tawag sa anumang serbisyo para gawing larawan ang isang pormula o daloy. Higit pa sa panlasa tungkol sa mga dependency, ito ay bunga ng string backing. Ang isang bloke na aabot sa isang bagay na browser lamang ang makapagbibigay, o aabot sa network, ay hindi maiguguhit sa server na naghahain ng mga nailathalang pahina, at sa gayon ay magkaiba ang anyo ng isang pahina depende sa kung sino ang humingi nito.
Isang API reference na nakatira sa loob ng pahina
Bigyan ang bloke ng OpenAPI ng isang espesipikasyon, idinikit man o tinukoy sa pamamagitan ng tirahan, at iguguhit nito ang inilalarawan ng espesipikasyong iyon: ang mga operasyon, ang kanilang mga landas at parametro, ang mga eskema ng kahilingan at tugon, at ang paraan ng pagpapatotoo. Para sa bawat operasyon ay gumagawa rin ito ng maikling halimbawa ng kahilingan sa cURL, TypeScript, Dart at Python, hinango mula sa espesipikasyon at hindi tinipa ng may-akdang makakalimot namang mag-update. Ganoon din ang tingin ng embed na bloke sa labas ng mundo: kinikilala nito ang ilang serbisyong tunay nitong kayang ipakita, itinuturing na wastong bunga at hindi kabiguan ang isang payak na link para sa lahat ng iba pa, at tahasang tumatanggi itong iguhit ang isang tirahang hindi nito pinagkakatiwalaan.
Dalawang tao sa iisang talata
Ang pahinang inieedit nang live ay hawak ng iisang gawain sa server, isa sa bawat pahina, at bawat pagbabago ay dumadaan doon nang sunod-sunod. Iyan ang dahilan kung bakit maiisip pa rin nang malinaw ang sabayang pag-edit: walang pangalawang manunulat na nakikipagkarera sa una. Ang dokumento mismo ay isang CRDT, kaya ang dalawang taong sabay na nagsusulat sa iisang talata ay nagsasanib sa halip na magbura ng isa’t isa, at ang kliyenteng naiwan ay nakakahabol sa pamamagitan ng pagpapalitan ng kung ano ang kulang sa bawat panig. Bawat pagbabago ay idinaragdag muna sa isang write-ahead log bago ito ipamahagi kaninuman, kaya ang nakikita ng ibang nasa dokumento ay naitala na nang tuluyan at hindi basta ipinasa lamang. Ang pahintulot ay ipinatutupad sa server at hindi sa interface: ang kasamang sumali nang walang karapatang mag-edit ay ibinababa sa pagbabasa, at pana-panahong sinusuri muli ng sesyon ang karapatang iyon habang bukas ang dokumento, kaya ang inalis na akses ay dumadapo sa taong kasalukuyang nagta-type sa halip na hintayin pa niyang i-reload ang pahina.
Bawat pagsulat ay dumadaan sa iisang pinto
Mababago ang isang dokumento ng taong nagta-type dito at ng programang tumatawag sa API, at dati ay parehong nakakasulat ang dalawang landas na iyon sa iisang pahina nang hiwalay. Hindi na ngayon. Ang pagsulat mula sa API ay ipinapasa sa mismong sesyong may hawak ng buhay na dokumento, kung saan ito isinasagawa bilang iisang transaksiyon kasabay ng mga live na pag-edit, kaya iisa ang pagkakasunod-sunod ng mga pangyayari sa halip na dalawang manunulat na magkaiba ang palagay sa sinasabi ng pahina. Pinananatili ang mga id ng bloke kapag isinusulat pabalik ang dokumento, dahil naka-angkla rito ang mga komento at ang isang pagkakasundong gagawa ng bagong id ay mag-iiwan sa bawat komento na nakaturo sa wala. At kapag ang lumabas na hanay ng mga bloke ay kapareho na ng nakaimbak, wala nang isinusulat.
Ang tanging transport na hindi maaabot ng susi ng makina
Ang personal na API key ay gumagana sa REST, GraphQL, sa subscription socket ng GraphQL, at sa MCP. Hindi ito gumagana sa collaboration socket, at sinadya iyon. Bawat pagbabagong ginawa nang magkakasama ay may tatak kung sino ang gumawa nito, at ang mga tatak na iyon ang nagiging pagka-may-akda na nakatala sa kasaysayan ng pahina. Kung isang makina ang mag-eedit doon, magsusulat ito ng may-akda na walang taong sumulat, at ang pagbawi niyon sa bandang huli ay pagsulat-muli ng kasaysayan, hindi pagbura ng isang hilera. Ang hangganan ay wala sa pagitan ng websocket at HTTP: nasa kung ang transport ba ay sumusulat ng kasaysayang may may-akda. Ang tuntunin ay ipinatutupad ng hubog mismo ng code at hindi ng pagtanda, dahil ang pagtanggap ng key ay nangangailangan ng sadyang paglipat sa ibang tawag ng pagpapatotoo, at may pagsusulit na babagsak kapag ginawa iyon ng isang transport.
Isang workspace sa sarili nitong tirahan
Ang bawat workspace ay isang tenant na may sariling subdomain mula pa sa sandaling likhain ito, at natutukoy ang tenant mula sa tirahang pinagdatingan ng kahilingan. Kaya naipapasiya na kung aling tenant ka bago pa mabasa ang alinman sa iyong datos, at hindi sa pamamagitan ng salaang idinaragdag pagkatapos na maaaring makalimutan ng sinuman. Sa ilalim niyon, ang database mismo ang nagpapairal ng hangganan sa pamamagitan ng seguridad sa antas ng hilera: bawat kahilingan ay kumukuha ng koneksiyon, itinatatak dito ang pagkakakilanlan ng tumatawag, at binubura ng pool ang kalagayang iyon kapag naibalik ang koneksiyon, kaya hindi maaaring tumagas ang pagkakakilanlan ng isang kahilingan patungo sa mga tanong ng susunod.
Ang pag-angkin ng domain ay hindi katumbas ng pagpapatunay nito
Ang isang workspace sa planong Enterprise ay maaaring maghain ng mga pahina nito mula sa sarili nitong domain. Sinadyang magkahiwalay na hakbang ang pag-angkin ng domain at ang paghahain mula rito: itinatago ang domain nang hindi pa napapatunayan, at buong-buo itong binabalewala ng resolver hanggang lumitaw ang isang talaan ng pagpapatunay sa DNS. Kahit sino ay makakapagtipa ng tirahan ng ibang kompanya sa isang form. Tanging ang may kontrol sa domain na iyon ang makakapaglathala ng talaang magbubuhay dito.
Bawat bersiyong dinaanan ng pahina
Nagtatago ang Clepit ng mga rebisyon at hindi ng iisang kasalukuyang kalagayan. Kusang kumukuha ito ng snapshot habang nagtatrabaho ang mga tao, ngunit pinipigil upang hindi makagawa ng daan-daan ang pangkaraniwang pagta-type: may bagong naisusulat kapag lumipas na ang sampung minuto o nagbago na ang sampung bloke, alinman ang mauna. Ang pagsasauli ay iisang transaksiyon: ipinapatong ang lumang snapshot, pinagkakasundo ang mga bloke, at isinusulat ang pagsasauli mismo bilang bagong rebisyon, kaya ang pagbalik ay naitatala at hindi tahimik na binubura. Sinasadyang panatilihin ng pagkakasundo ang mga id ng bloke ng pinagmulan, dahil naka-angkla ang mga komento sa mga bloke, at ang pagsasauli ng pahina na may bagong id ay mag-iiwan sa bawat komento roon nang walang angkla.
Ang muling paghanap dito
Tumatakbo ang paghahanap sa isang projection ng mga pahina, at dumadaan ang tanong sa sariling web-search parser ng Postgres sa halip na tipunin nang manu-mano bilang SQL, kaya makakapagtipa ang isang tao ng panipi at mga minus at wala roong anumang butas para sa injection. Ngunit ang mahalaga sa isang workspace na pinagsasaluhan ay kung saan nakaupo ang pagsusuri ng pahintulot. Sumasama ang paghahanap sa talahanayan ng mga pahina, at ang seguridad sa antas ng hilera ng talahanayang iyon ay umiiral sa mismong pagsasama, kaya ang mga resulta ay nakakulong na sa mga pahinang maaaring makita ng nagtatanong. Ang mga salaan, isang bahagi ng puno ng mga pahina, kung sino ang huling nagbago, kung kailan huling inedit, ay idinaragdag doon bilang karagdagang kondisyon. Bawat isa sa kanila ay nagpapaliit; wala ni isang makakapagpalawak, dahil pawang nakaupo sila sa likod ng iisang pagsusuri.
Nagyeyelo ang paglalathala, hindi ang pagbabahagi
Dalawang magkaibang bagay ito at sinadya ng Clepit na iba ang pagtrato sa bawat isa. Ang paglalathala ng pahina ay nagyeyelo sa kasalukuyang dokumento bilang isang rebisyon, itinuturo ang pahina rito, at ginagawa itong pampubliko: ang binabasa ng isang bisita sa clepit.space, sa isang tirahang gaya ng acme.clepit.space/handbook, ay ang nagyelong rebisyong iyon at hindi ang mga pag-edit na sumunod. Ang pagbawi ng paglalathala ay naglilinis sa mga turong iyon ngunit iniingatan ang pampublikong tirahan, kaya ang muling paglalathala sa dakong huli ay bumabalik sa parehong URL sa halip na sirain ang bawat link na nakaturo rito. Kabaligtaran naman ang share link: naghahain ito ng buhay na dokumento, kaya nagbabago ang nakikita ng tumanggap habang nagbabago ang pahina.
Isang link na maaari mong bawiin
Ang share link ay isang token na maaari mong bawiin, at mabibigyan ito ng takdang pagkaubos sa sandaling likhain. Ang hash lamang ng token ang iniimbak, kaya minsan lamang ipinapakita ang link sa paglikha at hindi na ito mababawi mula sa database pagkatapos, ni ng amin ni ng sinumang makarating doon. Ang mga link na ito ay nagkakaloob ng pagbabasa at hindi ng pagkokomento: ang isang komento ay nangangailangan ng may-akda, at hindi may-akda ang may hawak ng link.
Pag-sign in mula sa sarili ninyong direktoryo
Maaaring ipasa ng isang workspace ang pagpapatotoo sa sarili nitong identity provider: OpenID Connect sa planong Business, SAML sa Enterprise, kasama ang SCIM para sa pagsasabay ng direktoryo. Saklaw ng SCIM ang user resource na talagang pinapatakbo ng Okta at Entra, at may isang sinadyang paglihis ito sa payak na pagbasa ng pamantayan: ang isang delete ay nagpapatigil sa miyembro sa halip na burahin siya. Pinapayagan iyon ng espesipikasyon, at ang kapalit ay isang pagsasabay ng direktoryo na kayang wasakin ang laman ng isang workspace sa simpleng pagtanggal ng isang tao mula sa isang grupo.
Apat na paraan para makipag-usap dito
Saklaw ng REST ang apatnapu’t apat na operasyon sa ilalim ng /v1, na inilalarawan ng isang dokumentong OpenAPI na hinahango mismo sa mga ruta at hindi isinusulat sa tabi ng mga ito, at inihahambing ng continuous integration ang bungang iyon sa kopyang nasa repositoryo, kaya hindi makakapasok nang tahimik ang isang pagbabago sa ruta na lumaktaw sa registry. Saklaw ng GraphQL ang modelo ng aplikasyon at dala nito ang mga subscription sa sarili nitong socket. Ang realtime ay hiwalay na proseso, kaya nga ang pag-restart ng gateway ay hindi kasamang ibinabagsak ang panig ng mga kahilingan, at nagpapahintulot ito ayon sa socket at hindi ayon sa silid: sa bawat pangyayari, ang bawat koneksiyon sa loob ng tenant ay sinusuri sa iisang sabay-sabay na pagsisiyasat at ang mga pinahihintulutan lamang ang tumatanggap nito. Inilalantad ng MCP ang mga operasyong iyon din sa mga AI agent bilang mga kasangkapan, at walang kasangkapang nagtitiwala sa id na galing sa tumatawag upang ipasiya kung aling workspace ang kinikilos nito; ang mga pagsulat ay dumadaan sa mismong mga serbisyong ginagamit ng interface, kaya iisa rin ang mga pagsusuri ng pahintulot at ang talaan ng pag-awdit.
Para kanino ito
Para sa mga koponang nangangailangan ng editor na kontrolado nila, at sa mga developer na naglalagay ng structured na nilalaman sa sariling produkto.
Bisitahin Clepit: clepit.com