მენიუ

🏡 KristinaHouse · batume.li#

ბათუმის რეგიონული პორტალი — მარკეტი, სადაც საოჯახო უძრავი ქონების სააგენტო მხოლოდ ერთ-ერთი
გამყიდველია. ტექნოლოგია — გამჭვირვალე ნდობისთვის.

flowchart LR E["KristinaHouse Engine<br/>~42 000 ხაზი · 1 დამოკიდებულება<br/>0 ფრეიმვორკი · 100% კონტროლი"] E --> W["batume.li (პორტალი)"] E --> N["სატელიტ-საიტები (ერთი კოდი)"] E --> T["Telegram-ბოტები (რეესტრი)"]

3 წამი — და საიტი მუშაობს#

ერთი ფაილი. ერთი ბრძანება. არავითარი npm install, კონტეინერები და DevOps.

$ bun run server.ts
✓ SQLite მზადაა
✓ TLS: batume.li (let's encrypt)
✓ Telegram-ბოტები უსმენენ
✓ ვალუტის კურსები ჩატვირთულია
✓ სერვერი უსმენს :3000

სტეკი, რომელიც აოცებს: Bun (JavaScript/TypeScript runtime) — SQLite (WAL რეჟიმი) — ერთი შესრულებადი ფაილი server.ts, რომელშიც ცხოვრობს ყველაფერი: მარშრუტიზაცია, ბიზნეს-ლოგიკა, API, ავტორიზაცია, SSR-რენდერინგი, სურათების დამუშავება, ანალიტიკა და ინტეგრაციები.


არქიტექტურა — არც ერთი ფრეიმვორკი#

flowchart TB B["ბრაუზერი<br/>RU · EN · KA"] subgraph VPS["Contabo VPS (5.189.164.87)"] S["Bun.serve (:3000)"] subgraph Files["ფაილები"] direction LR F1["server.ts"] F2["db.ts"] F3["tg.ts"] F4["sync.ts"] F5["urns.ts"] F6["i18n.ts · ai.ts"] F7["qr.ts · rates.ts"] end D["SQLite WAL<br/>kh.sqlite (~2 МБ)"] S --- Files Files --- D end B -- HTTPS --> S S -- SSR HTML --> B

რატომ არის ეს თქვენთვის მნიშვნელოვანი:


ერთი კოდი — რამდენიმე საიტი (მულტი-URN)#

პროექტის მისამართების რეესტრი ცხოვრობს პირდაპირ ამ README-ში: სათაური განსაზღვრავს მთავარ urn-ს, სია ბოლოში — ყველა სარკეს პრიორიტეტის მიხედვით. სერვერი გაშვებისას თავად პოულობს თავის let's encrypt გასაღებებს და ხვდება, «ვინ არის». ფაილი urn-config.json აწყობს თითოეულ urn-ს ერთხელ — canonical, აქცენტ-ქალაქი, სექციები, სინქრონიზაცია და ტოკენები — ლოკალურად, დეპლოიმდე.

flowchart LR RM["README.md"] --> URN["batume.li · batumi.su<br/>(urn-რეესტრი)"] LE["let's encrypt"] --> ID["მე ვარ batumi.su<br/>(თვითგანსაზღვრა)"] UC["urn-config.json"] --> CONF["სატელიტი, ქალაქი, ტოკენი, ინტერვალი<br/>(ერთხელ აწყობილი, თავად აისახება)"]

3 ენა · 3 ქვეყანა · 0 კომპრომისი#

სისტემა სტუმრებს ესაუბრება მათ ენაზე — რუსული, ინგლისური, ქართული — გადართვა ერთი დაწკაპუნებით. თარგმანები ინახება ერთიან ლექსიკონში, მენეჯერს შეუძლია მათი რედაქტირება პირდაპირ მართვის პანელში.

ენაინტერფეისიკონტენტიშეტყობინებები
RU✅✅✅
EN✅✅✅
KA✅✅✅

შესაძლებლობები — 28 მოდული ერთ სისტემაში#

მოდულისტატუსივისთვის
🛒 მარკეტი — სექციები, ლოტები, კალათა☑ აქტიურიგამყიდვ. + მყიდვ.
🎛 კონსტრუქტორი — მთელი საიტის იერსახე ერთ კარს მიღმა☑ აქტიურისექციის მფლობელები
📃 გვერდები ბლოკებისგან — მთავარიც ერთ-ერთია☑ აქტიურიადმინისტრატორი
📐 სქემები — დარბაზები და სართულები მეტრებში, ვიზიოსავით☑ აქტიურიორგანიზატ. + გამყიდვ.
🗞 ლენტა — პოსტები, განხილვები და ვიდეოები ერთად☑ აქტიურიყველა
🔗 კავშირები — საერთო სახელი მეგობრების სიის ნაცვლად: ერთი id აკრიფეთ და შეხვდით☑ აქტიურიმომხმარებლები
👤 პირადი გვერდები /~login საიდუმლო ვერსიებით☑ აქტიურიმომხმარებლები
🔐 დოკუმენტები ბოლომდე დაშიფვრით — ცხრილები, სეიფი, ხელშეკრულების შაბლონები☑ აქტიურიდაფის მონაწილეები
💬 ჩატი — პირადი (ბოლომდე დაშიფვრა) და კომერციული დიალოგები, ერთი ღილაკი სწრაფი მოქმედებებით☑ აქტიურიყველა შესული
🔗 ბმული მოცვით — სტუმარს მიდის ამონაჭერი, დაშიფრული თქვენს ბრაუზერში☑ აქტიურიმფლობელები და ბუღალტრები
📄 PDF-ში გატანა — საკუთარი შემკრები, შრიფტები ჩაშენებული, ქართულის ჩათვლით☑ აქტიურიყველა, ვისაც აქვს დოკუმენტი
🏠 უძრავი ქონება — სექცია, არა ქვესისტემა☑ აქტიურისტუმრები
📅 ჯავშნები + ფასების კალენდარი☑ აქტიურისტუმრები + გამყიდვ.
🗺 საკუთარი რუკა — OSM-ფილებს თვითონ ვხატავთ☑ აქტიურიყველა
📊 გამყიდველის კაბინეტი: ანგარიშები, ლოტები☑ აქტიურიგამყიდველები
📝 ბლოგი☑ აქტიურიმკითხველები
💬 ფორუმი☑ აქტიურიყველა მომხმარებელი
🎉 ღონისძიებები + მოწვევები☑ აქტიურიორგანიზატ. + სტუმრები
🤖 Telegram-ბოტები (რეესტრი, მულტიბოტი)☑ აქტიურისტუმრები + გამყიდვ.
🧠 AI — გასაღებების პული, მულტივენდორი☑ აქტიურირედაქცია + ბოტები
🔐 ავტორიზაცია☑ აქტიურიმომხმარებლები
💱 ვალუტის კურსები☑ აქტიურისისტემა (ავტო)
📱 QR-კოდები ლოტებზე☑ აქტიურიპრომო
🌐 სინქრონიზაცია (დონორი → სატელიტები)☑ აქტიურიადმინისტრატორი
📄 დოკუმენტები☑ აქტიურისტუმრები
⚙️ მართვის პანელი☑ აქტიურიმენეჯერები
📈 ვიზიტების ანალიტიკა☑ აქტიურიმენეჯერები
⚖️ სამართლებრივი პროფილი (GE · EU-GDPR)☑ აქტიურივიზიტორები + ადმინი
🍪 Cookie-ბანერი☑ აქტიურივიზიტორები (GDPR)

ყოველი სექცია ითიშება ერთი გადამრთველით პანელში — per-urn: დონორს ბლოგი ღია აქვს, სატელიტს — მხოლოდ საკითხავი (შესვლა მხოლოდ პერსონალისთვის) ან საერთოდ გამორთული.

მარკეტ-პლატფორმა, სადაც უძრავი ქონება უბრალოდ სექციაა#

საიტი არის მარკეტი + ბლოგი + ფორუმი, ხოლო KristinaHouse მასში ერთი სექციის მიმაგრებული
გამყიდველია. უძრავი ქონება აღარაა ქვესისტემა: ბინა — სექცია „უძრავი ქონების“ ჩვეულებრივი
ლოტია, ხოლო ყველაფერი, რაც ადრე მასზე იყო მიბმული — დაკავებულობის კალენდარი, ფასების
სეზონები, ჯავშნის განაცხადები, ოთახები, მისამართი — გახდა **ინტერფეისის კონსტრუქტორის
ბლოკები**, რომელთა გამოცხადებაც ნებისმიერ სექციას შეუძლია. ჩართეთ ბლოკი „კოტეჯებში“ — და მისი
გამყიდველები იმავე კალენდარს მიიღებენ; გამორთეთ — და ის გაქრება კოდის ერთი ხაზის გარეშე.

ვიტრინა /property და სარკისებრი განცხადებები აღარ არსებობს — ორივე შეგნებულად მოიხსნა. ლოტის
მისამართი ახლა ბმულია სახლზე გეო-ცნობარში, ამიტომ სახლის ერთხელ შესწორება ასწორებს მასში
არსებულ ყველა ლოტს. მთავარი ნავიგაცია — მარკეტი · სტატიები · ფორუმი; მთავარი გვერდი იწყობა
ბლოკების კონსტრუქტორით, სადაც ყოველი ბლოკი თავად იმალება, თუ მას მონაცემები არ აქვს.

ბლოკები სიბრტყეებად ეწყობა. ზოლი მთელ სიგანეზე გადის, იჭრება სვეტებად, სვეტში კი — ბლოკების
დასტა; სიგანეები სიტყვებით ირჩევა („უფრო ფართო მარცხნივ“, „ვიწრო მარჯვნივ“), და არა რიცხვებით.
მანამდე გვერდს მხოლოდ „ერთი მეორის ქვეშ“ შეეძლო, და ყოველი ახალი განლაგება ბიბლიოთეკაში ცალკე
ბლოკს იწვევდა — ბიბლიოთეკა იზრდებოდა დაკაბადონებით, და არა შიგთავსის ახალი სახეებით. ყველაფერი
ერთ ადგილას იწყობა: პუნქტი „🎛 კონსტრუქტორი“ დგას „მიმოხილვის“ გვერდით და ჩამოთვლის არა
ქვესისტემებს, არამედ ცოცხალ გვერდებსა და სექციებს — მთავარს, „ჩვენ შესახებ“, /estate-ს. მარკეტის
სექცია სწორდება როგორც სექცია, და არა როგორც შაბლონი: მის გვერდით წერია, საერთო აქვს იერსახე
მეზობლებთან თუ საკუთარი, და ერთი ღილაკით მისი გამოყოფაა შესაძლებელი — შემდგომი შესწორებები მხოლოდ
მას ერგება.

დაფა ერთი ლენტა არ არის. /board განყოფილებების მიხედვით აჯგუფებს, რადგან „ფასის მიხედვით“
ლოტს, დახლს, შემსრულებელსა და ვაკანსიას შორის აზრი არ აქვს; განყოფილების გვერდი — იგივე
კონსტრუქტორის ბლოკებია, რაც მთავარზე. ვაკანსიები, რეზიუმეები და დამკვეთთა დავალებები სტრიქონებად
მიდის — ხელფასის დიაპაზონი, ფორმატი, გამოცდილება, გამოხმაურებათა რიცხვი, — ხელოსანი კი
ბარათია: ხელობა, ფასი თავისი შკალით („40 ₾-დან · საათში“), რეპუტაცია, ენები და „დავალებაზე
მოწვევა“ — მიმოწერა თქვენივე დავალებაზე, ახალი „მოწვევის“ ერთეულის გარეშე. ფასის ფილტრი
განყოფილების არჩევის შემდეგ ჩნდება: ოთხი შკალის საერთო ფასი არ არსებობს. რიცხვს საკუთარი
ბლოკი აქვს — „🔢 განცხადებების რიცხვი“: ცოცხალი მთვლელების ჯგუფი საკუთარი ფილტრებით, და ბმული
რიცხვს მხოლოდ იქ აქვს, სადაც გვერდი იმავე რიცხვს აჩვენებს; სხვაგვარად რიცხვი ბმულის გარეშე
რჩება. პალიტრის წესი: ბლოკი ცალკეა მაშინ და მხოლოდ მაშინ, როცა „გვარი × ფორმა“ წყვილი
განსხვავდება — ჩამონათვალი ან რიცხვი, — და ამას ტესტი იცავს, არა მეხსიერება.

ყოველი გამყიდველი — არა მხოლოდ საიტის მაღაზია — იღებს იმავე სიღრმეს: პროფილის
ვიტრინის კონსტრუქტორს (თემები/ფერები/ბლოკები, სხვისი CSS/JS-ის გარეშე),
კალათასა და შეკვეთებს (სასაქონლო რეჟიმი ნაშთებით), კატეგორიებს ატრიბუტებითა
და მიზნობრივი წვდომით, და გამყიდვლის კაბინეტს მინი-აღრიცხვით „მფლობელის
ანგარიშის“ დონეზე: შემოსავალი პერიოდებით, ნახვების სტატისტიკა, CSV-ექსპორტი და
ანგარიშის ბმულები ავტორიზაციის გარეშე.


ტექნოლოგია, რომელიც თქვენთვის მუშაობს#

⚡ წარმადობა#

მეტრიკამაჩვენებელი
სერვერის გაშვება~300 მწმ
კატალოგის ჩატვირთვა<100 მწმ
ფოტოს კონვერტაცია~50 მწმ/ფოტო
წყლის ნიშანიქეშირდება
მომხმარებლის სესია30 დღე
POST-ლიმიტი10/წთ IP-ზე
მაქს. ატვირთვა15 МБ-მდე
ბაზის ზომა~2 МБ

🔒 უსაფრთხოება#

ფუნქციამეთოდი
ავთენტიფიკაციაbcrypt + httpOnly cookies
მონაცემთა გაჟონვაAPI ყოველთვის მალავს მფლობელის მონაცემებს
ბმულით წვდომატოკენ-ანგარიშები (შესვლა არ სჭირდება)
XSS-დაცვაUnicode-ეკრანირება JSON-ში
Rate limiting10 მოთხოვნა/წთ საჯარო POST-ზე
GEO-ბლოკირებაარჩევით (IP/ქვეყნით)
ანალიტიკამხოლოდ აგრეგატები, IP არ ინახება
დოკუმენტებიბოლომდე დაშიფვრა: სერვერი მხოლოდ შიფრტექსტს ხედავს
ჩატიპირადი — ბოლომდე დაშიფვრა (სეიფის პაროლი); კომერციული — დაშიფრულია ბაზის გარეთ შენახული გასაღებით, მხარდაჭერის ყოველი წაკითხვა თავად დიალოგში ჩანს
პროფილის საიდუმლო ვერსიები#-ის შემდეგი ნაწილი სერვერამდე არ აღწევს — არც ლოგებში, არც Referer-ში, არც ინდექსში
რეზიუმეს პირადულობარეზიუმე ნაგულისხმევად უსახელოა; სახელს მხოლოდ ავტორი ხსნის
ხალხის საჯარო კატალოგიმხოლოდ თანხმობით, და ის მოთხოვნის შიგნით მოწმდება

📈 ანალიტიკა — თვალთვალის გარეშე#

პანელი აჩვენებს ვიზიტებს დღეების მიხედვით: ჯამები, უნიკალურები, mobile / desktop, user-agent ოჯახები (iPhone, Android, Windows, macOS, Linux), ბოტები — ცალკე ხაზზე. ბაზაში მხოლოდ დღიური მთვლელებია: არც IP-მისამართები, არც ნედლი ლოგები.

🤖 Telegram — ჯავშნები საიტის გარეშე#

სტუმარი წერს Telegram-ბოტს → ხედავს თავისუფალ ბინებს → ჯავშნის → იღებს კონტაქტებს მენეჯერის დადასტურების შემდეგ. არც საიტი, არც რეგისტრაცია — უბრალოდ ჩატი.

sequenceDiagram participant G as Telegram სტუმარი participant M as Telegram მენეჯერი G->>M: მინდა ბინა 3 დღით (booking) M-->>G: ✅ / ❌ M->>G: კონტაქტები

🧠 AI — კონტენტის რედაქტორი და ავტორი#

რედაქტორი უგზავნის Telegram-ბოტს სტატიას → AI ამოწმებს ხარისხს, აკატეგორიზებს (ტურიზმი/სიახლეები/კანონები), გადაწერს, ქმნის სათაურს, slug-ს და დაკავშირებული სტატიების შეთავაზებებს. ხარისხის ზღვარი კონფიგურირებადია (ნაგულისხმევად 6/10).

flowchart LR A["სტატია<br/>ტექსტი"] --> P["AI Pipeline<br/>შეფასება (0–10)<br/>კატეგორიზაცია<br/>გადაწერა<br/>Slug + ბმულები"] P --> O["შედეგი<br/>მონახაზი ბლოგში"]

✍️ BBCode და markdown — დიაგრამები, კოდი და ფორმულები#

სტატიები, ფორუმის პოსტები, განცხადებები და დოკუმენტები იყენებს ერთ უსაფრთხო ძრავას (md.js — ერთი და იგივე ფაილი სერვერზეც და ბრაუზერშიც, ამიტომ რედაქტორის გადახედვა და გამოქვეყნებული გვერდი ვერ დაშორდება ერთმანეთს). ყველაფერი ეკრანირდება დამუშავებამდე: არანაირი დაუმუშავებელი HTML, javascript: ბმული ან XSS. მარკირება — BBCode ∪ markdown: კლასიკის (სათაურები, სიები, GFM-ცხრილები, ციტატები, სურათები) გარდა ის რენდერავს:

მძიმე რენდერერები (mermaid, highlight.js, KaTeX) იტვირთება ზარმაცად CDN-იდან და მხოლოდ თუ გვერდზე ნამდვილად არის ასეთი ბლოკი — ჩვეულებრივი ტექსტური სტატია არც ერთ ზედმეტ ბაიტს არ ითრევს, სერვერს კი კვლავ ერთი დამოკიდებულება აქვს.

💰 გამჭვირვალე ანგარიშგება მესაკუთრეებისთვის#

ყოველი ბინის მფლობელი იღებს ტოკენ-ბმულს — ლოგინისა და პაროლის გარეშე ხედავს:

გაანგარიშების ქსელი კასკადის ნაცვლად. ვის რამდენი ერგება ჯავშნიდან, სააგენტო გრაფად ხატავს — «როგორც Visio-ში»: შესასვლელები «ჯავშანი» და «ზედმეტი მოგება», ქვაბები, მხარეები; ისრები — პროცენტით შემოსავლიდან, თანხით ჯავშანზე, ღამეზე ან თვეზე, ნაშთით. სააგენტოს სტანდარტი → შესწორება სახლისთვის → შესწორება ბინისთვის; მენეჯერი ადასტურებს — და ბინის ფული გაყინულია, სანამ თავად არ დაადასტურებს ახალ ვერსიას. ჯავშნის ყოველ არხს თავისი ქსელი აქვს: საიტის სტუმარი, გუნდი, პარტნიორი სააგენტო.

აღარავითარი «ქაღალდი დაიკარგა». ყველაფერი ონლაინ, ყველაფერი გამჭვირვალე.

🤝 ჯავშნები პარტნიორებთან და სტუმრის გადახდები#

🔑 ლოტის გადაცემა შუამავალს#

მფლობელი ობიექტს თავად ქმნის, ხოლო მის ჩვენებას, განაცხადებისა და ჯავშნების მიღებას სააგენტოს ანდობს — ლოტის გადაცემით და არა საერთო ანგარიშით.

💬 ჩატი — ერთი ღილაკი ყველა საუბრისთვის#

მრგვალი ღილაკი ყოველი გვერდის ქვედა მარჯვენა კუთხეში. მიიტანეთ კურსორი — გამოდის სწრაფი მოქმედებების კარუსელი: ჩემი დიალოგები, მხარდაჭერა, მიწერეთ გამყიდველს (ლოტის გვერდზე), დარეკვა · WhatsApp · Telegram, განცხადების დამატება, რჩეულები. თანამშრომლები და მარკეტის მონაწილეები მას თავისთვის აწყობენ, თანამშრომელი დომენის ნაგულისხმევსაც ადგენს.

🖼 გალერეა ოთახების მიხედვით — და გეგმა როგორც ინტერაქტიული რუკა#

ფოტოები ერთ ზოლად კი არა, ოთახების მიხედვით ლაგდება: «მისაღები სამზარეულოთი» — ერთი ოთახია ზონებით, როგორც ცხოვრებაში, ხოლო ოთახებს, საძინებლებსა და სამზარეულოებს ლოტი ამ ხიდან თავად ითვლის. ფოტოს აქვს წარწერა და alt სამ ენაზე, ტიპი (ნახაზი · მშენებლობა · მზა ოთახი) და თარიღი; გვერდით ცხოვრობს ვიდეო, gif და YouTube.

✏️ რედაქტირება — პირდაპირ ბარათზე#

ბარათის კიდეზე ღილაკები გვერდის ზემოთ ფანჯარას ხსნის, მასში კი იგივე ბლოკებია, რაც რედაქტირების გვერდზე: გვერდი სარეზერვო შესასვლელად დარჩა, მეორე რედაქტორი არ გაჩენილა.

🎚 ბარათი — მართვის პულტია, კატალოგი — მენეჯერის მაგიდა#

სტუმარი ვიტრინას ხედავს; ვინც ლოტს უძღვება — იმავე ბარათს მართვის ორგანოებით, პირდაპირ კატალოგში: ღილაკების რელსი მარცხნივ, ✏️ მარჯვნივ, რამდენიც გინდათ ბარათი ერთი ჩანართიდან.

📮 განთავსება — უფლებით, განყოფილებაში, რამდენიმე შეთავაზებით#

«ობიექტის განთავსებას» მხოლოდ ის ხედავს, ვისაც სერვერი ნამდვილად შეუშვებს: ღილაკი, გვერდი და კარი ერთ კითხვას სვამს, და სტუმარი არ ეჯახება ფორმას, რომელიც მას გააგდებს (ფორმაზე მოსული სტუმარი შესვლაზე გადადის და უკან ბრუნდება).

🎭 ერთი განყოფილება — ორი ვერსია და ორი გუნდი#

განყოფილებას შეუძლია ორჯერ იცოცხლოს: სააგენტოს თემად (/estate — საკუთარი იერი, ვიტრინა, ბარათი და განთავსების ფორმა, სააგენტოს მინი-საიტი) და საერთო ვერსიად მარკეტის შიგნით (/market/estate — მეზობლების ერთგვაროვნად). ლოტები იგივეა — ფაქტები, შეთავაზებები, ფოტოები, ჯავშნები, აღრიცხვა; განსხვავდება იერი და განთავსება — ჩვენების ადგილის მიხედვით.

📱 QR-კოდი ყოველ ობიექტზე#

ყოველ განცხადებას აქვს უნიკალური QR-კოდი (SVG, კორექციის დონე H — 30%, ცენტრზე სტიკერსაც კი გადაურჩება). გენერირდება სერვერზე მიკროწამებში. ფერები — ობიექტის ტეგებიდან.

flowchart LR QR["📸 QR-კოდი"] --> SITE["batume.li/estate/…"] SITE --> VIEW["ფოტოები, ფასი, თარიღები"]

💧 წყლის ნიშანი — სურათით ან ტექსტით#

ობიექტების ფოტოები დაცულია ლაივში: PNG-ლოგო ან ტექსტი (ზომა, სისქე, კურსივი, ფერი, შრიფტი — ყველაფერი კონფიგურირდება პანელში), პლუს grayscale ოფცია — ვიზიტორები ხედავენ შავ-თეთრ ფოტოებს, ორიგინალები კი მხოლოდ ობიექტის მენეჯერებს უჩანთ. შედეგი ქეშირდება.

🃏 ობიექტის ბარათი — ჯერ საძიებო სისტემისთვის, მერე თვალისთვის#

ყოველი ბარათი თავის თავში ატარებს schema.org-ის მარკირებას: ბინა ან სახლი — ქირავნობისა და გაყიდვის შეთავაზებებით, ფართით, ოთახებით, მისამართითა და წერტილით რუკაზე; საქონელი, ვაკანსია, მომსახურება — საკუთარი ტიპით. ფილა და მარკირება ობიექტის ერთი კომპილირებული ხედიდან იწყობა, ამიტომ „რას ხედავს რობოტი“ და „რას ხედავს ადამიანი“ არ განსხვავდება, ხოლო ძიების გვერდი იმავე ობიექტებს თავისი სიით მიუთითებს.

🔎 SEO — რომელსაც საძიებო სისტემა ხედავს, და არა მხოლოდ თქვენ#

საიტის რუკა ყოველ მოთხოვნაზე იკრიბება და ინდექსში თავად ობიექტებს ათავსებს: განცხადებებს, გამყიდველების ვიტრინებსა და მათ გვერდებს, საცხოვრებელ კომპლექსებს, გეო-ლენდინგებს. ყოველ ბმულს თან ახლავს hreflang-ალტერნატივები სამივე ენაზე, და ის ზუსტად იმ მისამართს იძახებს, რომელსაც გვერდი კანონიკურად აცხადებს — შემოვლა რედირექტებზე არ იხარჯება. სექცია ერთი გადამრთველით დამალეთ — მისი საქონელი რუკიდან მასთან ერთად გადის; გამყიდველი საკუთარ დომენზე გადავიდა — მისი გვერდები მის საკუთარ რუკაში გადადის და პორტალისაში აღარ დუბლირდება.

გეო-ლენდინგები — /market/in/georgia/batumi/cat/property: გვერდი ადგილისა და ტიპის გადაკვეთაზე, მეზობელ ქალაქებს შორის ურთიერთბმულებით. წყვილები რეალურად არსებული ობიექტებით იგება: გვერდები «არცერთი განცხადება» საერთოდ არ იქმნება.

🖼 გაზიარების ბარათი — სერვერი თვითონ ხატავს#

ბმული სურათის გარეშე ლენტში გატეხილად გამოიყურება. თუ გვერდს საკუთარი ფოტო არ აქვს — გეო-ლენდინგს ის აგებულებით არ ჰქონია, ახალ ბრენდს შეიძლება არ ჰქონდეს — სერვერი თვითონ ხატავს 1200×630 ბარათს: სახელი, ადგილი, რიცხვი, საიტის ხელმოწერა, თითოეული ტიპისთვის საკუთარი ფერი. ნული გარე მოთხოვნა და ნული დამატებითი დამოკიდებულება: SVG სტრიქონად იკრიბება, რასტრავს კი იგივე sharp, რომელიც წყლის ნიშნებს აკეთებს. ორგანიზაცია გადაარქვით — სურათი თავიდან იხატება, ბმული კი იგივე რჩება.

💱 ვალუტის კურსები — ყოველთვის აქტუალური#

დღეში 4-ჯერ (00/06/12/18) სერვერი აახლებს GEL/USD/RUB/EUR კურსებს. თუ API მიუწვდომელია — ძველი კურსები აგრძელებენ მუშაობას. ფასები განცხადებებში ყოველთვის სწორია, ვალუტის ნახტომების დროსაც კი.


სინქრონიზაცია — ორინსტანსიანი არქიტექტურა#

მონაცემები ორ დონედაა გაყოფილი: Donor (სრული მონაცემები, პერსონალურის ჩათვლით) და Satellite (მხოლოდ საჯარო კონტენტი, მფლობელების მონაცემებisa და სტუმრების ანგარიშების გარეშე). ეს აკმაყოფილებს მონაცემთა შენახვის მოთხოვნებს სხვადასხვა იურისდიქციაში. სატელიტი საკუთარ ბმულებს აზიარებს; კანონიკური მისამართი მხოლოდ meta-ტეგებში ცხოვრობს საძიებო სისტემებისთვის.

flowchart LR subgraph Donor["Donor (მთავარი)"] D1["ყველა მონაცემი"] D2["მფლობელები + აღრიცხვა"] D3["მომხმარებლები"] D4["შავი სია"] end subgraph Satellite["Satellite (ასლი)"] S1["საჯარო კონტენტი"] S2["პერსონალური მონაცემები არ არის"] S3["მხოლოდ მენეჯერები"] S4["(შესვლა მხოლოდ პერსონალისთვის)"] end Donor -- sync --> Satellite

სტეკი — რატომ არის ეს high-tech#

კომპონენტიტექნოლოგიარატომ
ენაTypeScriptტიპობრივი უსაფრთხოება ზედნადების გარეშე
RuntimeBun4×-ჯერ სწრაფი Node.js-ზე, ჩაშენებული SQLite, ტესტერი, bundler
ბაზაSQLite WALნულოვანი ადმინისტრირება, ~2 МБ, 100% ACID
ფრეიმვორკი❌ არასაკუთარი SSR — სრული კონტროლი, ნულოვანი bloat
დამოკიდებულებები1 (sharp)მინიმალური თავდასხმის ზედაპირი
ფოტოების დამუშავებაsharp + mozjpegJPEG 85%, წყლის ნიშანი (PNG/ტექსტი/შ-თ), EXIF-ორიენტაცია
QRსაკუთარი GF(256)Reed-Solomon level H, გარე API-ების გარეშე
AIOpenAI-თავსებადინებისმიერი პროვაიდერი (OpenAI, Anthropic, ლოკალური Ollama)
TelegramLong-polling (2 ბოტი)webhook-ის გარეშე, გარეთ არაფერი ჩანს
TLSLet's Encryptსერტიფიკატის ავტოარჩევა README-ს urn-რეესტრიდან
მულტი-საიტიurn-config.jsonერთი კოდი+ბაზა → რამდენიმე დომენი, ერთხელ აწყობილი
სარეზერვო ასლიcp kh.sqlite backup/ერთი ბრძანება

ციფრები, რომლებიც თავად ლაპარაკობენ#

მეტრიკამაჩვენებელი
📊TypeScript-ის ხაზები~42 000 — 50 ფაილი
🧪ტესტები54 ფაილი — პლუს 6 გამჭოლი მიღება ცოცხალ სერვერზე
📦დამოკიდებულებები1 — sharp (დანარჩენი — ჩვენია)
🗄️ბაზა~2 МБ — SQLite
🚀გაშვება~300 მწმ — ბრძანებიდან მოთხოვნამდე
🌍ენები3 — RU, EN, KA
🗺რუკის ფილებითვითონ ვხატავთ — 0 გარე მოთხოვნა
📸ფოტოს ლიმიტი15 МБ ატვირთვაზე
🔄კურსების განახლება4-ჯერ დღეში
🤖Telegram-ბოტებირეესტრი — რამდენიმე ტიპსა და დომენზე
🧠AI-ზღვარი6/10 — კონფიგურირებადი
⏱️სესია30 დღე — ხელახალი შესვლის გარეშე
🛡️QR-კორექცია30% — დონე H (Reed-Solomon)

UX/CX — რატომ ბრუნდებიან სტუმრები#

სცენარიშთაბეჭდილება
იპოვა ბინა 5 წამშიფილტრები: ტიპი, ფასი, თარიღები
ფოტოებს ტელეფონზე ფურცლავსსვაიპები სქროლისგან არ ირთვება — მხოლოდ აშკარა ჟესტი
ნახა რეალური ფოტოებიწყლის ნიშანი იცავს და არ უშლის
დაჯავშნა Telegram-შისაიტზე რეგისტრაციის გარეშე
მიიღო კონტაქტიმენეჯერის დადასტურების შემდეგ
მესაკუთრე: ანგარიში ბმულითშესვლის გარეშე
კითხულობს სტატიებს ბათუმზეAI-ხარისხი, 3 ენა
ყიდულობს/ყიდისმარკეტპლეისი FTS5-ძებნით
საუბრობს ფორუმზეანონიმურად (TTL-ით), შიშის გარეშე
ცვლის ენას1 დაწკაპუნება — RU/EN/KA

Customer Experience (CX) — ეს არის, როცა სისტემა გეხმარება და არ გიშლის ხელს. KristinaHouse ისეა დაპროექტებული, რომ სტუმარმა დრო ბინის არჩევაზე დახარჯოს და არა საიტთან ბრძოლაზე.


ბიზნესის მფლობელისთვის#

KristinaHouse — ეს არ არის CRM, არ არის WordPress, არ არის კონსტრუქტორი. ეს არის საკუთარი მაღალწარმადი პლატფორმა, დაწერილი სპეციალურად ბათუმის საოჯახო სააგენტოს მოდელისთვის.


მონაცემთა წყაროები#

პორტალის გეო-ცნობარი — ქვეყანა, მხარე, ქალაქი, ქუჩა, სახლი — ივსება OpenStreetMap-იდან
Overpass API-ით. იმპორტირებულ ჩანაწერებს აქვთ წარმოშობის ნიშანი: ადამიანის მიერ შესწორება
ჩანაწერს გამორიცხავს მომავალი გაშვებებიდან და შესწორება სამუდამოდ რჩება.

იქიდანვე მოდის რუკის გეომეტრია — და საიტი თავად ხატავს რუკის ფონს საკუთარი კონტურების
ბაზიდან. რუკის ჩვენებისას გარე tile-სერვერზე არც ერთი მოთხოვნა არ ხდება: რუკა ინტერნეტის
გარეშეც მუშაობს.

მონაცემები © OpenStreetMap contributors, ლიცენზია ODbL.
რუკის გაფორმება — ჩვენი საკუთარი.


KristinaHouse — Batumi, Georgia.
batume.li · batumi.su
«ჩვენ თვითონ ვცხოვრობთ აქ, პირადად ვამოწმებთ ყოველ ბინას და ვაწარმოებთ გამჭვირვალე ანგარიშგებას მესაკუთრეებისთვის.»

💬