Активность движка
🏡 KristinaHouse · batume.li#
ბათუმის რეგიონული პორტალი — მარკეტი, სადაც საოჯახო უძრავი ქონების სააგენტო მხოლოდ ერთ-ერთი
გამყიდველია. ტექნოლოგია — გამჭვირვალე ნდობისთვის.
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-რენდერინგი, სურათების დამუშავება, ანალიტიკა და ინტეგრაციები.
არქიტექტურა — არც ერთი ფრეიმვორკი#
რატომ არის ეს თქვენთვის მნიშვნელოვანი:
- არავითარი «სერვერი დაეცა» — არ არის PostgreSQL, Redis, Docker. ერთი ერთეული — ერთი წერტილი.
- მყისიერი გაშვება — ~300 მწმ პირველ მოთხოვნამდე.
- სარეზერვო ასლი — დააკოპირეთ ერთი ფაილი
kh.sqlite. სულ ეს არის.
ერთი კოდი — რამდენიმე საიტი (მულტი-URN)#
პროექტის მისამართების რეესტრი ცხოვრობს პირდაპირ ამ README-ში: სათაური განსაზღვრავს მთავარ urn-ს, სია ბოლოში — ყველა სარკეს პრიორიტეტის მიხედვით. სერვერი გაშვებისას თავად პოულობს თავის let's encrypt გასაღებებს და ხვდება, «ვინ არის». ფაილი urn-config.json აწყობს თითოეულ urn-ს ერთხელ — canonical, აქცენტ-ქალაქი, სექციები, სინქრონიზაცია და ტოკენები — ლოკალურად, დეპლოიმდე.
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 limiting | 10 მოთხოვნა/წთ საჯარო POST-ზე |
| GEO-ბლოკირება | არჩევით (IP/ქვეყნით) |
| ანალიტიკა | მხოლოდ აგრეგატები, IP არ ინახება |
| დოკუმენტები | ბოლომდე დაშიფვრა: სერვერი მხოლოდ შიფრტექსტს ხედავს |
| ჩატი | პირადი — ბოლომდე დაშიფვრა (სეიფის პაროლი); კომერციული — დაშიფრულია ბაზის გარეთ შენახული გასაღებით, მხარდაჭერის ყოველი წაკითხვა თავად დიალოგში ჩანს |
| პროფილის საიდუმლო ვერსიები | #-ის შემდეგი ნაწილი სერვერამდე არ აღწევს — არც ლოგებში, არც Referer-ში, არც ინდექსში |
| რეზიუმეს პირადულობა | რეზიუმე ნაგულისხმევად უსახელოა; სახელს მხოლოდ ავტორი ხსნის |
| ხალხის საჯარო კატალოგი | მხოლოდ თანხმობით, და ის მოთხოვნის შიგნით მოწმდება |
📈 ანალიტიკა — თვალთვალის გარეშე#
პანელი აჩვენებს ვიზიტებს დღეების მიხედვით: ჯამები, უნიკალურები, mobile / desktop, user-agent ოჯახები (iPhone, Android, Windows, macOS, Linux), ბოტები — ცალკე ხაზზე. ბაზაში მხოლოდ დღიური მთვლელებია: არც IP-მისამართები, არც ნედლი ლოგები.
🤖 Telegram — ჯავშნები საიტის გარეშე#
სტუმარი წერს Telegram-ბოტს → ხედავს თავისუფალ ბინებს → ჯავშნის → იღებს კონტაქტებს მენეჯერის დადასტურების შემდეგ. არც საიტი, არც რეგისტრაცია — უბრალოდ ჩატი.
🧠 AI — კონტენტის რედაქტორი და ავტორი#
რედაქტორი უგზავნის Telegram-ბოტს სტატიას → AI ამოწმებს ხარისხს, აკატეგორიზებს (ტურიზმი/სიახლეები/კანონები), გადაწერს, ქმნის სათაურს, slug-ს და დაკავშირებული სტატიების შეთავაზებებს. ხარისხის ზღვარი კონფიგურირებადია (ნაგულისხმევად 6/10).
✍️ BBCode და markdown — დიაგრამები, კოდი და ფორმულები#
სტატიები, ფორუმის პოსტები, განცხადებები და დოკუმენტები იყენებს ერთ უსაფრთხო ძრავას (md.js — ერთი და იგივე ფაილი სერვერზეც და ბრაუზერშიც, ამიტომ რედაქტორის გადახედვა და გამოქვეყნებული გვერდი ვერ დაშორდება ერთმანეთს). ყველაფერი ეკრანირდება დამუშავებამდე: არანაირი დაუმუშავებელი HTML, javascript: ბმული ან XSS. მარკირება — BBCode ∪ markdown: კლასიკის (სათაურები, სიები, GFM-ცხრილები, ციტატები, სურათები) გარდა ის რენდერავს:
- BBCode-ფორმატირებას —
[b] [i] [u] [s] [color=…] [size=…] [spoiler] [quote=ვინ] [h1…h4] - განლაგების ბლოკებს —
[row]/[col]სვეტებისთვის და[block bg=… border=… align=…]გაფორმებული ბლოკისთვის; ყველა მნიშვნელობა გადის whitelist-ს, თვითნებური CSS გვერდზე არ ხვდება - ბმულებს საიტის ხატულით —
[link="მისამართი" favicon]; ხატულები მოდის ჩვენივე ქეშირებადი პროქსით, მკითხველის ბრაუზერი მესამე მხარეს არ მიმართავს - Mermaid-დიაგრამებს — ბლოკი
`mermaidიქცევა flowchart-ად, sequence-ად ან განტის დიაგრამად (securityLevel: strict) - კოდის ხაზგასმას — ბლოკი
`ენაიღებს highlight.js-ს (GitHub-თემა) და „კოპირების“ ღილაკს ერთი დაჭერით - LaTeX-ფორმულებს —
…ხაზში და…ბლოკად, KaTeX-ით - სურათების სლაიდერებს — ფოტოების მოკლე სია ხდება swipe-გალერეა წარწერებით
მძიმე რენდერერები (mermaid, highlight.js, KaTeX) იტვირთება ზარმაცად CDN-იდან და მხოლოდ თუ გვერდზე ნამდვილად არის ასეთი ბლოკი — ჩვეულებრივი ტექსტური სტატია არც ერთ ზედმეტ ბაიტს არ ითრევს, სერვერს კი კვლავ ერთი დამოკიდებულება აქვს.
💰 გამჭვირვალე ანგარიშგება მესაკუთრეებისთვის#
ყოველი ბინის მფლობელი იღებს ტოკენ-ბმულს — ლოგინისა და პაროლის გარეშე ხედავს:
- ყველა ჯავშანს (თარიღები, თანხები, სტატუსები)
- ხარჯებს (კომუნალური, დალაგება, რემონტი)
- გადასახდელის გაანგარიშებას — საკუთარ ვალუტაშიც, სააგენტოს მიერ მითითებული კურსით
- ანგარიშს სრულად ან მხოლოდ არჩეული ჯავშნებით — როგორც სააგენტო გადაწყვეტს
გაანგარიშების ქსელი კასკადის ნაცვლად. ვის რამდენი ერგება ჯავშნიდან, სააგენტო გრაფად ხატავს — «როგორც Visio-ში»: შესასვლელები «ჯავშანი» და «ზედმეტი მოგება», ქვაბები, მხარეები; ისრები — პროცენტით შემოსავლიდან, თანხით ჯავშანზე, ღამეზე ან თვეზე, ნაშთით. სააგენტოს სტანდარტი → შესწორება სახლისთვის → შესწორება ბინისთვის; მენეჯერი ადასტურებს — და ბინის ფული გაყინულია, სანამ თავად არ დაადასტურებს ახალ ვერსიას. ჯავშნის ყოველ არხს თავისი ქსელი აქვს: საიტის სტუმარი, გუნდი, პარტნიორი სააგენტო.
აღარავითარი «ქაღალდი დაიკარგა». ყველაფერი ონლაინ, ყველაფერი გამჭვირვალე.
🤝 ჯავშნები პარტნიორებთან და სტუმრის გადახდები#
- დაკავებულობის შეთანხმების ბმული — პარტნიორი სააგენტო ხედავს თავისუფალ თარიღებს (ფასებისა და სახელების გარეშე) და რეგისტრაციის გარეშე შეაქვს თავისი კლიენტის ჯავშანი; გუნდი მას რიგში ადასტურებს.
- დადასტურების ორი სია — «სტუმრებისა და პარტნიორებისგან» და «გუნდის შეტანილი»: საკუთარი ჯავშანი სხვებს შორის არ იკარგება.
- სტუმრის გადახდები — გადახდილი, ვალი, ზედმეტად გადახდილი; დაბრუნება — სტორნოა და არა «მინუს ასი».
- ზედმეტი მოგება — ჩვეულებრივ ფასზე მეტად აღებული ცალკე ნაწილდება და ნაგულისხმევად დამალულია მესაკუთრის ანგარიშიდან.
🔑 ლოტის გადაცემა შუამავალს#
მფლობელი ობიექტს თავად ქმნის, ხოლო მის ჩვენებას, განაცხადებისა და ჯავშნების მიღებას სააგენტოს ანდობს — ლოტის გადაცემით და არა საერთო ანგარიშით.
- შეთავაზება და თანხმობა — სააგენტო ლოტს იღებს ან მიზეზის მითითებით უარს ამბობს; უფლებებს მფლობელი ირჩევს: ლოტის ველები, კონტაქტები, «აწევა», «გაიყიდა», არქივი.
- მფლობელი მხოლოდ უყურებს — ლოტს, ყოველი განაცხადის ფაქტს (განმცხადებლის კონტაქტის გარეშე: ის სააგენტოსთანაა) და საკუთარ მესაკუთრის ანგარიშს.
- ჯავშნები არ იკარგება — განაცხადები ლოტს მიჰყვება, დადასტურებულ ჯავშნებს გასვლამდე თითოეული თავად მიჰყავს, აღრიცხვა კი თითოეულს თავისი აქვს.
- დახურული განყოფილება — მიმაგრებული სააგენტო თავად წყვეტს, ვის დაუშვას «ლოტ-შეთავაზებებით»; მიბმა «განყოფილების ყველა ჩემი ლოტი — ამ სააგენტოს» ერთხელ თანხმდება.
💬 ჩატი — ერთი ღილაკი ყველა საუბრისთვის#
მრგვალი ღილაკი ყოველი გვერდის ქვედა მარჯვენა კუთხეში. მიიტანეთ კურსორი — გამოდის სწრაფი მოქმედებების კარუსელი: ჩემი დიალოგები, მხარდაჭერა, მიწერეთ გამყიდველს (ლოტის გვერდზე), დარეკვა · WhatsApp · Telegram, განცხადების დამატება, რჩეულები. თანამშრომლები და მარკეტის მონაწილეები მას თავისთვის აწყობენ, თანამშრომელი დომენის ნაგულისხმევსაც ადგენს.
- ვწერ როგორც მე, კერძო პირი ან ორგანიზაცია — პირის გადამრთველი ზემოთ; სააგენტოს მთელი გუნდი ხედავს და უძღვება მის მიმოწერას, უფლებას კი სერვერი ყოველ წერილზე ამოწმებს.
- პირადი დიალოგები — ბოლომდე დაშიფვრა — გასაღები იხსნება სეიფის იმავე პაროლით, რაც დოკუმენტები; სერვერი და მხარდაჭერა მხოლოდ შიფრტექსტს ხედავენ, თანამოსაუბრის ანაბეჭდი — საიტის გარეთ შესადარებლად.
- კომერციული — გამჭვირვალეა — ინახება დაშიფრულად, ღიაა მხარეებისა და მხარდაჭერისთვის დავების განსახილველად; მხარდაჭერის ყოველი წაკითხვა დიალოგის ქვეშვე აღინიშნება.
- რედაქტირება ძაფის დაკარგვის გარეშე — რედაქტირება = ახალი ვერსია; «🕘 ისტორია» ვერსიების ხეს შეტყობინების შიგნით შლის, პასუხები არ წყდება. პირადი ნიშნები (⭐ 📌 ☐ ✅ ❓, ფერები) ფილტრით.
- ლოტი სააგენტოს გადაეცა? — მყიდველი სააგენტოს წერს და არა მფლობელს.
- batumi.su — იგივე ღილაკი, მხოლოდ მესენჯერების ბმულები.
🖼 გალერეა ოთახების მიხედვით — და გეგმა როგორც ინტერაქტიული რუკა#
ფოტოები ერთ ზოლად კი არა, ოთახების მიხედვით ლაგდება: «მისაღები სამზარეულოთი» — ერთი ოთახია ზონებით, როგორც ცხოვრებაში, ხოლო ოთახებს, საძინებლებსა და სამზარეულოებს ლოტი ამ ხიდან თავად ითვლის. ფოტოს აქვს წარწერა და alt სამ ენაზე, ტიპი (ნახაზი · მშენებლობა · მზა ოთახი) და თარიღი; გვერდით ცხოვრობს ვიდეო, gif და YouTube.
- დათვალიერება — კადრი, ოთახები ზოლად, ოთახის მახასიათებლები და საძილე ადგილები გარემოებებით («დივანი იშლება»).
- სართულის გეგმა — მეტრებში, ავეჯით; ღილაკი «📐 გეგმა» აჩვენებს გეგმას, ფოტოსთან მინი-გეგმა ოთახს უნათებს, ოთახზე დაჭერა კი მის ფოტოებს ხსნის.
- სახელები და თეგები — კონსტრუქტორში, კოდის გარეშე. «აპარტამენტი 1+1» და «ევრო ოროთახიანი» განყოფილების წესები ოთახებისა და შენობისგან აწყობს; თეგი «პლაჟი {მანძილი} მეტრში» — შაბლონია ველებითა და ერთეულებით, შენობა ერთხელ მოინიშნება — ბინები მემკვიდრეობით იღებენ.
- გადასვლა დანაკარგის გარეშე — წინა საიტის ობიექტები საბრძოლო ლოტებად გადმოვიდა, მათი ძველი მისამართები
/property/…კი მუდმივი გადამისამართებით ახალ ბარათზე მიდის, ენის შენარჩუნებით.
✏️ რედაქტირება — პირდაპირ ბარათზე#
ბარათის კიდეზე ღილაკები გვერდის ზემოთ ფანჯარას ხსნის, მასში კი იგივე ბლოკებია, რაც რედაქტირების გვერდზე: გვერდი სარეზერვო შესასვლელად დარჩა, მეორე რედაქტორი არ გაჩენილა.
- ℹ️ ცნობები — განცხადების ველებს დაემატა «ჩემი სახელი» (მხოლოდ თქვენ ხედავთ: «ეკატერინე», «ბინა ზღვასთან»), გუნდური სახელი მენეჯერებისთვის, ბმულის საკუთარი გადახედვა მესენჯერებისა და სოციალური ქსელებისთვის ყველა ენაზე და ხელით დასმული ბეჯები «თარიღამდე».
- 👤 მხარეები და მესაკუთრე — ვინ მონაწილეობს ობიექტის ფულში, მესაკუთრეს კი ბარათი აქვს ტელეფონით, ფოსტით, მესენჯერით და რეკვიზიტებით. ინახება მხოლოდ მაშინ, როცა ამას საიტის სამართლებრივი პროფილი უშვებს; «მონაცემების წაშლა» პერსონალურს შლის, აღრიცხვის სტრიქონები კი რჩება.
- 🎨 სააგენტოს ლოტების საკუთარი იერი — განყოფილების აწყობის თავზე: ბლოკის დამალვა, შევიწროება ან გაფართოება, გადაწყობა — და სააგენტოს ლოტები ასე გამოიყურება ნებისმიერ განყოფილებასა და კრებულში, მართვაში აღებულების ჩათვლით. განყოფილების ცვლილება აღწევს ყველაფერს, რასაც სააგენტო არ შეხებია; ყოველ ბლოკს აქვს «↺ საბაზისოზე დაბრუნება».
🎚 ბარათი — მართვის პულტია, კატალოგი — მენეჯერის მაგიდა#
სტუმარი ვიტრინას ხედავს; ვინც ლოტს უძღვება — იმავე ბარათს მართვის ორგანოებით, პირდაპირ კატალოგში: ღილაკების რელსი მარცხნივ, ✏️ მარჯვნივ, რამდენიც გინდათ ბარათი ერთი ჩანართიდან.
- ერთი მიერთება ყველაფრისთვის — ჯავშნები, ფასების კალენდარი, განაცხადები, აღრიცხვა და მესაკუთრის ანგარიში, მხარეები, დოკუმენტები, ცხრილები, ენები: თითოეული კონსტრუქტორის ორგანოა და ბარათს ერთნაირად უერთდება. რა ჩანს, ამას უფლებები და მონაცემები წყვეტს და არა ჩაშენებული ღილაკები — ღილაკი, რომელზეც სერვერი უარს იტყვის, არ იხატება.
- დოკუმენტები საკუთარი სეიფიდან — ხელშეკრულებები, ცხრილები და შაბლონები ბოლომდე დაშიფრულ საცავში ცხოვრობს და ლოტს, ჯავშანს ან მესაკუთრეს ბრმა ნიშნით ებმის: სერვერი ვერ იგებს, რა არის შიგნით. ხელშეკრულება შაბლონიდან ბრაუზერში იკრიბება — ლოტის, ჯავშნის, მესაკუთრისა და სააგენტოს რეკვიზიტების მიხედვით, არჩეულ ენაზე.
- 🌐 ენები — ლოტის ყველა თარგმანის მიმოხილვა და ღილაკი «თარგმნა», პირდაპირ ბარათზე.
- მენეჯერის პანელი — ფილტრები «ჩემი · პასუხს ელოდება · გადაუხდელი · გადაცემული», ბარათებზე მონიშვნა (ან «ყველა ფილტრით»), ერთი ორგანო — ერთბაშად ყველა მონიშნულზე; ყოველი ბარათი საკუთარი უფლებით პასუხობს, გამოტოვებულები კი ამბობენ, რა აკლდა. ჯგუფური მოქმედებები — მხოლოდ არსებული კარებით, მასობრივი წაშლა არ არის. ტელეფონზე — ფარდა «🧰 მართვა (N)».
- + ობიექტი — ახალი ლოტი მონახაზად იწყება პირდაპირ საკუთარ ბარათში, იმავე ბლოკებით, რაც განთავსების ფორმას აქვს.
📮 განთავსება — უფლებით, განყოფილებაში, რამდენიმე შეთავაზებით#
«ობიექტის განთავსებას» მხოლოდ ის ხედავს, ვისაც სერვერი ნამდვილად შეუშვებს: ღილაკი, გვერდი და კარი ერთ კითხვას სვამს, და სტუმარი არ ეჯახება ფორმას, რომელიც მას გააგდებს (ფორმაზე მოსული სტუმარი შესვლაზე გადადის და უკან ბრუნდება).
- კონტექსტში — განყოფილებიდან გახსნილი ფორმა უკვე არჩეული კატეგორიით და განყოფილების იერით მოდის; კონტექსტის გარეშე — მარკეტის ტიპური ფორმაა, სადაც კატეგორიისა და «ვყიდულობ / ვყიდი» არჩევა სავალდებულოა.
- ფორმა კონსტრუქტორში იკრიბება — რომელი ველები, რომელი გარიგებები, რომელი შეთავაზებები: განყოფილების მფლობელი მას კოდის გარეშე აწყობს.
- რამდენიმე შეთავაზება ერთ განცხადებაში — გაყიდვა, თვიური და დღიური ქირა ერთად, თითოეულს თავისი ფასი და თავისი ვაჭრობა აქვს: სტარტი, ბიჯი, ვადა, რეზერვი. ფსონები — მხოლოდ ზემოთ, გამარჯვებული ვადის შემდეგ ფიქსირდება, გამარჯვებულის გარეშე დარჩენილი ვაჭრობა ახალი ვადით თავიდან იწყება.
🎭 ერთი განყოფილება — ორი ვერსია და ორი გუნდი#
განყოფილებას შეუძლია ორჯერ იცოცხლოს: სააგენტოს თემად (/estate — საკუთარი იერი, ვიტრინა, ბარათი და განთავსების ფორმა, სააგენტოს მინი-საიტი) და საერთო ვერსიად მარკეტის შიგნით (/market/estate — მეზობლების ერთგვაროვნად). ლოტები იგივეა — ფაქტები, შეთავაზებები, ფოტოები, ჯავშნები, აღრიცხვა; განსხვავდება იერი და განთავსება — ჩვენების ადგილის მიხედვით.
- სხვადასხვა ადამიანი ასწორებს — თემას მიმაგრებული სააგენტოს გუნდი ფლობს, საერთო ვერსიას — მარკეტის ოპერატორი პირის გუნდი; პორტალი ორივეზე მაღლაა. ეს გუნდებში წევრობის ორი სტრიქონია და არა განშტოება კოდში.
- კონსტრუქტორმა ადგილი იცის — თემის მფლობელი მის საკუთარ აწყობას ერთი ღილაკით იწყებს (ცარიელი ზედაპირი საგნობრივ სფეროს იმემკვიდრებს), საერთო ვერსია მარკეტის აწყობას მიჰყვება; გადახედვა «ჟეტონის თვალით» გვერდს ისე აჩვენებს, როგორც მას სტუმარი, მენეჯერი ან მფლობელი დაინახავს.
- მისამართები რჩება — როცა პორტალი საერთო ვერსიას ხსნის, ის
/market/<განყოფილება>-ზე პასუხობს, ძველი მისამართები იქ მუდმივი გადამისამართებით მიდის, ლოტების მისამართები კი არ იცვლება.
📱 QR-კოდი ყოველ ობიექტზე#
ყოველ განცხადებას აქვს უნიკალური QR-კოდი (SVG, კორექციის დონე H — 30%, ცენტრზე სტიკერსაც კი გადაურჩება). გენერირდება სერვერზე მიკროწამებში. ფერები — ობიექტის ტეგებიდან.
💧 წყლის ნიშანი — სურათით ან ტექსტით#
ობიექტების ფოტოები დაცულია ლაივში: PNG-ლოგო ან ტექსტი (ზომა, სისქე, კურსივი, ფერი, შრიფტი — ყველაფერი კონფიგურირდება პანელში), პლუს grayscale ოფცია — ვიზიტორები ხედავენ შავ-თეთრ ფოტოებს, ორიგინალები კი მხოლოდ ობიექტის მენეჯერებს უჩანთ. შედეგი ქეშირდება.
🃏 ობიექტის ბარათი — ჯერ საძიებო სისტემისთვის, მერე თვალისთვის#
ყოველი ბარათი თავის თავში ატარებს schema.org-ის მარკირებას: ბინა ან სახლი — ქირავნობისა და გაყიდვის შეთავაზებებით, ფართით, ოთახებით, მისამართითა და წერტილით რუკაზე; საქონელი, ვაკანსია, მომსახურება — საკუთარი ტიპით. ფილა და მარკირება ობიექტის ერთი კომპილირებული ხედიდან იწყობა, ამიტომ „რას ხედავს რობოტი“ და „რას ხედავს ადამიანი“ არ განსხვავდება, ხოლო ძიების გვერდი იმავე ობიექტებს თავისი სიით მიუთითებს.
- როგორც ძველ საიტზე — ფოტოების სლაიდერი ოთახების მიხედვით, ენების ზოლი RU · EN · GE ყოველ ბარათზე, პანელები „📰 სტატიები და კომენტარები“ და „📑 აღწერა · მახასიათებლები“, ვალუტის არჩევა პირდაპირ ფასში, „გაზიარება“ QR-ით და რუკა მისამართით.
- ობიექტის გვერდი ოთხ რიგად — კადრი ფოტოების ბადის გვერდით, ფასი და „დაკავშირება“ სათაურის მარჯვნივ, თეგები, „აღწერა · მახასიათებლები · სტატიები“, საუბარი, სახლის რუკა, სამი მსგავსი.
- სწრაფად — 24 ბარათიანი გვერდი ბაზას 9 მოთხოვნა უჯდება ~300-ის ნაცვლად: ობიექტის ხედი ერთხელ კომპილირდება ყოველ რედაქტირებაზე, რჩეულები და მნახველის უფლებები კი ერთი გავლით ითვლება გვერდზე.
- მთლიანია სკრიპტების გარეშეც — ბარათს სერვერი აწყობს, სკრიპტი მხოლოდ აცოცხლებს მას.
🔎 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-ტეგებში ცხოვრობს საძიებო სისტემებისთვის.
სტეკი — რატომ არის ეს high-tech#
| კომპონენტი | ტექნოლოგია | რატომ |
|---|---|---|
| ენა | TypeScript | ტიპობრივი უსაფრთხოება ზედნადების გარეშე |
| Runtime | Bun | 4×-ჯერ სწრაფი Node.js-ზე, ჩაშენებული SQLite, ტესტერი, bundler |
| ბაზა | SQLite WAL | ნულოვანი ადმინისტრირება, ~2 МБ, 100% ACID |
| ფრეიმვორკი | ❌ არა | საკუთარი SSR — სრული კონტროლი, ნულოვანი bloat |
| დამოკიდებულებები | 1 (sharp) | მინიმალური თავდასხმის ზედაპირი |
| ფოტოების დამუშავება | sharp + mozjpeg | JPEG 85%, წყლის ნიშანი (PNG/ტექსტი/შ-თ), EXIF-ორიენტაცია |
| QR | საკუთარი GF(256) | Reed-Solomon level H, გარე API-ების გარეშე |
| AI | OpenAI-თავსებადი | ნებისმიერი პროვაიდერი (OpenAI, Anthropic, ლოკალური Ollama) |
| Telegram | Long-polling (2 ბოტი) | webhook-ის გარეშე, გარეთ არაფერი ჩანს |
| TLS | Let'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, არ არის კონსტრუქტორი. ეს არის საკუთარი მაღალწარმადი პლატფორმა, დაწერილი სპეციალურად ბათუმის საოჯახო სააგენტოს მოდელისთვის.
- ყოველთვიური გადასახადები არ არის — საკუთარი Contabo სერვერი, საკუთარი კოდი.
- SaaS-ლიმიტები არ არის — რამდენიც გინდათ ობიექტი, მომხმარებელი, ჯავშანი.
- მონაცემების სრული კონტროლი — SQLite ბაზა თქვენს სერვერზე დევს.
- ერთი შესასვლელი წერტილი — საიტი + Telegram + AI + ანგარიშგება ერთ სისტემაში.
- GDPR-ready — ორინსტანსიანი არქიტექტურა, cookie-ბანერი, ანალიტიკა IP-ების გარეშე.
მონაცემთა წყაროები#
პორტალის გეო-ცნობარი — ქვეყანა, მხარე, ქალაქი, ქუჩა, სახლი — ივსება OpenStreetMap-იდან
Overpass API-ით. იმპორტირებულ ჩანაწერებს აქვთ წარმოშობის ნიშანი: ადამიანის მიერ შესწორება
ჩანაწერს გამორიცხავს მომავალი გაშვებებიდან და შესწორება სამუდამოდ რჩება.
იქიდანვე მოდის რუკის გეომეტრია — და საიტი თავად ხატავს რუკის ფონს საკუთარი კონტურების
ბაზიდან. რუკის ჩვენებისას გარე tile-სერვერზე არც ერთი მოთხოვნა არ ხდება: რუკა ინტერნეტის
გარეშეც მუშაობს.
მონაცემები © OpenStreetMap contributors, ლიცენზია ODbL.
რუკის გაფორმება — ჩვენი საკუთარი.
KristinaHouse — Batumi, Georgia.
batume.li · batumi.su
«ჩვენ თვითონ ვცხოვრობთ აქ, პირადად ვამოწმებთ ყოველ ბინას და ვაწარმოებთ გამჭვირვალე ანგარიშგებას მესაკუთრეებისთვის.»
