> ## Content Index
> Fetch the complete content index at: https://arabroot.io/llms.txt
> Use this file to discover other available public pages before exploring further.

# أدوات Presales: بيئة العرض ومكتبة الإجابات
- URL: https://arabroot.io/articles/ادوات-presales-بيئة-العرض-ومكتبة-الاجابات/
- Published: 2026-10-25T05:37:00.000Z
- Updated: 2026-10-25T13:37:47.000Z
- Description: أدوات العرض والإجابات والمخططات والتسجيل التجارية وبدائلها المفتوحة، مع بيئة عرض في Docker تستعاد بأمر واحد خلال ثوان.
- Author: فريق عرب رووت
- Tags: الأدلة التقنية, التسويق والمبيعات, الفرق والمنتج, الاستضافة الذاتية, Presales

مهندس ما قبل البيع Presales يقضي أسبوعه بين أربعة أعمال تتكرر: عرض توضيحي Demo أمام عميل، ورد على طلب عروض RFP فيه مئة سؤال سبق أن أجاب عن نصفها في طلب آخر، ورسم تصميم الحل Solution Design، ومكالمات يريد أن يتذكر ما قيل فيها بعد أسبوعين. ولكل عمل من هذه الأعمال سوق من الأدوات التجارية بأسعار تبدأ من الصفر وتصل إلى عشرات الآلاف من الدولارات في السنة، وفي المقابل أدوات مفتوحة المصدر تكفي فريقاً صغيراً إذا عرف ماذا يحتاج. وقد شرحنا الدور نفسه وطريقة إدارة العرض وإثبات المفهوم في مقالين سابقين:

[![](https://arabroot.io/content/images/2026/10/presales-role-cover-cover.webp)دليلما قبل البيع Presales: المهندس الذي يقنع قبل أن يبنيما هو دور مهندس ما قبل البيع، وأين يقف في مسار البيع بجانب مدير الحساب، وكيف يدير مكالمة الاكتشاف حتى القرار الفني.](https://arabroot.io/articles/%D9%85%D8%A7-%D9%82%D8%A8%D9%84-%D8%A7%D9%84%D8%A8%D9%8A%D8%B9-presales-%D8%A7%D9%84%D9%85%D9%87%D9%86%D8%AF%D8%B3-%D8%A7%D9%84%D8%B0%D9%8A-%D9%8A%D9%82%D9%86%D8%B9-%D9%82%D8%A8%D9%84-%D8%A7%D9%86-%D9%8A%D8%A8%D9%86%D9%8A/)[![](https://arabroot.io/content/images/2026/10/demo-poc-cover-cover.webp)دليلالعرض التوضيحي Demo وإثبات المفهوم PoC: كيف تديرهماكيف تبني عرضاً حول مشكلة العميل، وتدير إثبات مفهوم بمعايير نجاح مكتوبة ومدة محددة، مع قالب خطة جاهز للنسخ.](https://arabroot.io/articles/%D8%A7%D9%84%D8%B9%D8%B1%D8%B6-%D8%A7%D9%84%D8%AA%D9%88%D8%B6%D9%8A%D8%AD%D9%8A-demo-%D9%88%D8%A7%D8%AB%D8%A8%D8%A7%D8%AA-%D8%A7%D9%84%D9%85%D9%81%D9%87%D9%88%D9%85-poc-%D9%83%D9%8A%D9%81-%D8%AA%D8%AF%D9%8A%D8%B1%D9%87%D9%85%D8%A7/)

وفي هذا المقال سوف نتناول:

- عائلات أدوات Presales الأربع، والسؤال الذي يحسم الاختيار في كل عائلة.
- أدوات العرض التجارية Consensus وNavattic وStorylane وReprise، بأسعارها كما ظهرت في 25 أكتوبر 2026.
- تجربة عملية: بيئة عرض بـ Docker Compose وبيانات تجريبية Seed Data تستعاد بأمر واحد، مع زمن الاستعادة الذي قسناه.
- مكتبة الإجابات Answer Library: Loopio وResponsive، وما البديل على سيرفرك.
- المخططات، وتسجيل المكالمات وتحويلها إلى نص Transcription، وما يقوله نظام حماية البيانات الشخصية عن ذلك.
- جدول مقارنة، ثم من يختار ماذا.

## أربع عائلات من الأدوات

عندما تبحث عن «أدوات Presales» سوف تجد قوائم طويلة تخلط بين أدوات تحل مشكلات مختلفة، والأوضح أن تقسمها بحسب العمل الذي تخدمه كما في الصورة التالية:

![أربع مجموعات: بيئة العرض Demo Environment وأدواتها التجارية Consensus وNavattic وStorylane وReprise والبديل Docker Compose مع Seed Data، ومكتبة الإجابات Answer Library مع Loopio وResponsive والبديل BookStack وOutline وGit، والمخططات Diagrams مع draw.io وExcalidraw وMermaid، وتسجيل المكالمات Call Recording مع Gong وFathom وFireflies وtl;dv والبديل whisper.cpp وScriberr وMeetily](https://arabroot.io/content/images/2026/10/presales-tools-01-tool-map.webp)

لكل عائلة سؤال واحد يحسم أغلب الاختيار

ولاحظ أن الأدوات التجارية في هذا السوق تبيع غالباً للشركات الكبيرة، فأكثرها لا ينشر أسعاره ويطلب منك حجز مكالمة مع فريق المبيعات، وهذه مفارقة طريفة لأنك سوف تمر بنفس مسار البيع الذي تديره أنت مع عملائك. أما الفريق الصغير فيستطيع أن يغطي أغلب الحاجة بأدوات مفتوحة المصدر وبعض الانضباط، كما سيأتي.

## أدوات العرض التوضيحي التجارية

هذه الأدوات نوعان: أدوات العرض التفاعلي Interactive Demo التي تسجل شاشات منتجك وتحولها إلى نسخة يتصفحها العميل وحده دون بيئة حقيقية خلفها، وأدوات أتمتة العرض Demo Automation التي ترسل للعميل فيديو أو عرضاً مخصصاً قبل أن يتحدث مع المهندس. والجدول التالي يبين ما نشرته كل شركة عن أسعارها:

| الأداة                                                       | النوع                       | الأسعار المنشورة (25 أكتوبر 2026)                                                                                                                       |
| ------------------------------------------------------------ | --------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [Consensus](https://goconsensus.com/pricing?ref=arabroot.io) | أتمتة العرض Demo Automation | لا توجد أسعار، والتسعير بحسب عدد المستخدمين مع ميزات بحسب الاستخدام، عبر فريق المبيعات                                                                  |
| [Navattic](https://www.navattic.com/pricing?ref=arabroot.io) | عرض تفاعلي                  | خطة Starter مجانية، وخطتا Base وGrowth بدفع سنوي دون رقم ظاهر في الصفحة، وEnterprise بسعر خاص                                                           |
| [Storylane](https://www.storylane.io/plans?ref=arabroot.io)  | عرض تفاعلي                  | Free مجانية، وStarter بـ 50 دولاراً شهرياً، وGrowth بـ 625 دولاراً، وPremium بـ 1,500 دولار، وأقل من ذلك بنحو 20% مع الدفع السنوي، وEnterprise بسعر خاص |
| [Reprise](https://www.reprise.com/pricing?ref=arabroot.io)   | عرض تفاعلي وبيئات عرض       | لا توجد أسعار: رسم سنوي للمنصة مع تراخيص للمستخدمين عبر طلب سعر                                                                                         |

- **نقاط القوة**: العرض التفاعلي لا يتعطل لأنه لا يعتمد على بيئة حية، ويستطيع العميل أن يمر عليه وحده ويشاركه مع زملائه، وتعطيك الأداة إحصاءات عن الشاشات التي توقف عندها.
- **نقاط الضعف**: ما يراه العميل تسجيل وليس منتجاً يعمل، فلا يجيب على «جرب هذا على بياناتنا»، والأسعار العالية لا تناسب فريقاً يقدم بضعة عروض في الشهر، وبيانات العرض تحفظ عند مزود خارجي.

والعرض الحي أمام العميل يحتاج في النهاية بيئة حقيقية تعمل، وهذه تستطيع أن تبنيها بنفسك بشكل يمكن إعادته، وهو موضوع القسم التالي.

## تجربة عملية: بيئة عرض تستعاد بأمر واحد

المشكلة التي نريد حلها بسيطة: بعد كل عرض تتغير البيانات، فالمهندس يحذف طلبات ليبين ميزة الحذف، أو يعدل اسم عميل، أو يغير إعداداً، والعرض التالي يبدأ ببيانات مختلفة وأرقام لا تطابق ما في العرض التقديمي. والحل البسيط أن تحذف كل شيء وتعيد بناءه، ولكنه بطيء كما سوف ترى في القياس، والحل الأنسب أن تحفظ نسخة ذهبية Golden Copy من قاعدة البيانات لا يلمسها أحد، وتنسخ منها قاعدة العرض في ثوان.

والبيئة التي بنيناها لوحة مبيعات عربية صغيرة: قاعدة بيانات PostgreSQL فيها 2,000 عميل و100,000 طلب، وفوقها [PostgREST](https://docs.postgrest.org/en/v16/?ref=arabroot.io) الذي يحول جداول قاعدة البيانات إلى REST API، وأمامهما nginx يقدم صفحة اللوحة ويمرر طلبات `/api/`. وهي مثال على أي منتج تعرضه، فالفكرة نفسها تنطبق على تطبيقك أنت.

### الملفات

نبدأ بملف `.env` لكلمات المرور، ونولدها عشوائياً بدل كتابتها في الملفات:

```bash
mkdir -p demo/db demo/web && cd demo
echo "POSTGRES_PASSWORD=$(openssl rand -hex 16)" > .env
echo "AUTHENTICATOR_PASSWORD=$(openssl rand -hex 16)" >> .env
```

ثم ملف `compose.yaml` بإصدارات مثبتة:

```yaml
name: mkh-demo

services:
  db:
    image: postgres:18.6-alpine
    # Demo data is disposable (the reset rebuilds it), so durability settings are relaxed for speed
    command: ["postgres", "-c", "fsync=off", "-c", "synchronous_commit=off", "-c", "full_page_writes=off"]
    environment:
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
      AUTHENTICATOR_PASSWORD: ${AUTHENTICATOR_PASSWORD}
    volumes:
      - ./db:/docker-entrypoint-initdb.d:ro
      - pgdata:/var/lib/postgresql
    healthcheck:
      test: ["CMD-SHELL", "PGPASSWORD=$$POSTGRES_PASSWORD psql -h 127.0.0.1 -U postgres -d demo -tAc 'select 1 from api.orders limit 1' | grep -q 1"]
      interval: 2s
      timeout: 3s
      retries: 60

  api:
    image: postgrest/postgrest:v16.5
    environment:
      PGRST_DB_URI: postgres://authenticator:${AUTHENTICATOR_PASSWORD}@db:5432/demo
      PGRST_DB_SCHEMAS: api
      PGRST_DB_ANON_ROLE: web_anon
      PGRST_ADMIN_SERVER_PORT: "3001"
    depends_on:
      db:
        condition: service_healthy

  web:
    image: nginx:1.30.6-alpine
    ports:
      - "127.0.0.1:18830:80"
    volumes:
      - ./web/index.html:/usr/share/nginx/html/index.html:ro
      - ./web/nginx.conf:/etc/nginx/conf.d/default.conf:ro
    depends_on:
      - api

volumes:
  pgdata:
```

في الإعداد أعلاه لاحظ التالي:

- أوقفنا ضمانات الكتابة على القرص `fsync=off` والإعدادين بعده، وهذا لا ينصح به إطلاقاً لقاعدة بيانات إنتاج لأن انقطاع الكهرباء قد يتلف البيانات كما تشرح [وثائق PostgreSQL](https://www.postgresql.org/docs/18/non-durability.html?ref=arabroot.io)، ولكنه مقبول هنا لأن بيانات العرض تعاد من الصفر في أي لحظة. وإذا كان القرص بطيئاً، كما يحدث في Docker Desktop على جهاز عليه أحمال أخرى، فقد يفشل التشغيل الأول بدونها برسالة `pg_ctl: server does not shut down`، والسبب أن كتابة البيانات عند إيقاف خادم التهيئة المؤقت تتجاوز مهلة 60 ثانية التي ينتظرها سكربت التهيئة.
- فحص الصحة Healthcheck يتصل عبر `127.0.0.1` وليس عبر الـ Socket المحلي، لأن خادم التهيئة المؤقت يستمع على الـ Socket فقط، فلو فحصنا عبره لاعتبر Docker القاعدة جاهزة قبل أن تنتهي التهيئة.
- المنفذ الوحيد المفتوح هو منفذ nginx، ومربوط بـ `127.0.0.1`، فلا تفتح بيئة عرض على الشبكة دون كلمة مرور.

بعد ذلك ملف `db/01-roles.sh` الذي ينشئ الأدوار Roles التي يحتاجها PostgREST، ويقرأ كلمة المرور من البيئة:

```bash
#!/bin/sh
# Roles for PostgREST; the password comes from the environment, not from a file.
set -e
psql -v ON_ERROR_STOP=1 -U postgres -d postgres -v pw="$AUTHENTICATOR_PASSWORD" <<'SQL'
CREATE ROLE web_anon NOLOGIN;
CREATE ROLE authenticator LOGIN NOINHERIT PASSWORD :'pw';
GRANT web_anon TO authenticator;
CREATE DATABASE demo_golden;
SQL
```

ثم ملف البيانات التجريبية `db/02-seed.sql`، وهو قلب الفكرة: يبني البيانات داخل `demo_golden`، ثم يجعلها قالباً Template مغلقاً أمام الاتصالات، ثم ينشئ قاعدة العرض `demo` كنسخة منه:

```sql
-- The golden copy of the demo data. Everything is deterministic (setseed), so every reset gives the same numbers.
\connect demo_golden
CREATE SCHEMA api;

CREATE TABLE api.customers (
  id      int PRIMARY KEY,
  name    text NOT NULL,
  city    text NOT NULL,
  sector  text NOT NULL
);
CREATE TABLE api.plans (
  id      int PRIMARY KEY,
  name    text NOT NULL,
  monthly numeric(10,2) NOT NULL
);
CREATE TABLE api.orders (
  id          bigint PRIMARY KEY,
  customer_id int  NOT NULL REFERENCES api.customers(id),
  plan_id     int  NOT NULL REFERENCES api.plans(id),
  ordered_on  date NOT NULL,
  seats       int  NOT NULL
);

INSERT INTO api.plans VALUES (1, 'Starter', 49), (2, 'Business', 199), (3, 'Enterprise', 899);

SELECT setseed(0.42);
INSERT INTO api.customers
SELECT g,
       (ARRAY['مؤسسة','شركة','مجموعة','مكتب'])[1 + (g % 4)] || ' ' ||
       (ARRAY['النخبة','الأفق','الريادة','المدار','الواحة','البيان','السحاب','الرواد','المسار','الجسر'])[1 + (g % 10)] || ' ' || g,
       (ARRAY['الرياض','جدة','الدمام','مكة المكرمة','المدينة المنورة','الخبر','أبها','تبوك'])[1 + floor(random() * 8)::int],
       (ARRAY['التجزئة','الصحة','التعليم','اللوجستيات','الخدمات المالية'])[1 + floor(random() * 5)::int]
FROM generate_series(1, 2000) g;

INSERT INTO api.orders
SELECT g,
       1 + floor(random() * 2000)::int,
       CASE WHEN random() < 0.6 THEN 1 WHEN random() < 0.75 THEN 2 ELSE 3 END,
       date '2026-01-01' + floor(random() * 273)::int,
       1 + floor(random() * 50)::int
FROM generate_series(1, 100000) g;

CREATE INDEX ON api.orders (customer_id);
CREATE INDEX ON api.orders (ordered_on);

CREATE VIEW api.sales_by_city AS
SELECT c.city, count(*) AS orders, sum(o.seats * p.monthly) AS revenue
FROM api.orders o JOIN api.customers c ON c.id = o.customer_id JOIN api.plans p ON p.id = o.plan_id
GROUP BY c.city ORDER BY revenue DESC;

CREATE VIEW api.summary AS
SELECT (SELECT count(*) FROM api.customers) AS customers,
       (SELECT count(*) FROM api.orders) AS orders,
       (SELECT sum(o.seats * p.monthly) FROM api.orders o JOIN api.plans p ON p.id = o.plan_id) AS revenue;

GRANT USAGE ON SCHEMA api TO web_anon;
GRANT SELECT ON ALL TABLES IN SCHEMA api TO web_anon;
-- The demo lets the presenter delete and edit rows, the reset brings them back
GRANT DELETE, UPDATE ON api.orders, api.customers TO web_anon;
ANALYZE;

-- Freeze the golden copy and build the working database from it
\connect postgres
ALTER DATABASE demo_golden WITH IS_TEMPLATE true ALLOW_CONNECTIONS false;
CREATE DATABASE demo TEMPLATE demo_golden;
```

في الملف أعلاه لاحظ التالي:

- الدالة `setseed` تجعل الأرقام العشوائية نفسها في كل مرة، فيظهر نفس الإيراد ونفس ترتيب المدن في كل عرض، ويستطيع العرض التقديمي أن يذكر هذه الأرقام.
- أسماء العملاء والمدن بالعربية، لأن العميل العربي الذي يرى «Customer 17» يتساءل هل يدعم المنتج العربية أصلاً.
- القالب `demo_golden` مغلق بـ `ALLOW_CONNECTIONS false`، فلا يتصل به عرض ولا زميل بالخطأ، ويبقى النسخ منه ممكناً لأنه معلم كقالب `IS_TEMPLATE`. ونسخ قاعدة بيانات من قالب هو الطريقة التي يعمل بها `CREATE DATABASE` أصلاً كما تشرح [وثائق قواعد القوالب](https://www.postgresql.org/docs/18/manage-ag-templatedbs.html?ref=arabroot.io).
- صلاحيات الحذف والتعديل ممنوحة للزائر عن قصد، لأن المهندس يحتاج أن يعرض الحذف والتعديل أثناء العرض.

وأخيراً سكربت الاستعادة `reset.sh`، وفيه طريقتان:

```bash
#!/bin/sh
# Reset the demo to its golden state.
#   ./reset.sh        fast: rebuild the "demo" database from the golden template (seconds)
#   ./reset.sh full   rebuild everything: containers and volume removed, seed loaded again
set -e
cd "$(dirname "$0")"
if [ "$1" = "full" ]; then
  docker compose down -v
  docker compose up -d --wait
else
  docker compose exec -T db psql -v ON_ERROR_STOP=1 -U postgres -d postgres -q <<'SQL'
DROP DATABASE IF EXISTS demo WITH (FORCE);
CREATE DATABASE demo TEMPLATE demo_golden;
SQL
fi
./smoke.sh
```

وسكربت الفحص `smoke.sh` الذي يتأكد أن الأرقام الذهبية تظهر من نفس الطريق الذي يراه العميل، أي عبر nginx ثم PostgREST وليس من قاعدة البيانات مباشرة:

```bash
#!/bin/sh
# Checks that the demo shows the golden numbers through the same path the audience sees (nginx -> PostgREST).
set -e
expected='[{"customers":2000,"orders":100000'
for i in $(seq 1 30); do
  got=$(curl -s http://127.0.0.1:18830/api/summary || true)
  case "$got" in "$expected"*) echo "demo ready: $got"; exit 0;; esac
  sleep 1
done
echo "demo NOT ready, got: $got" >&2
exit 1
```

ويبقى ملف nginx الذي يمرر `/api/` إلى PostgREST، وصفحة `index.html` التي تعرض الأرقام والجدول، وتجدهما مع بقية الملفات في مجلد التجربة.

```nginx
server {
  listen 80;
  root /usr/share/nginx/html;
  location /api/ {
    proxy_pass http://api:3000/;
  }
}
```

### التشغيل الأول

الآن سوف نقوم بالبناء الكامل لأول مرة:

```bash
chmod +x reset.sh smoke.sh
time ./reset.sh full
```

والمخرج سوف يكون كما يلي (آخر الأسطر):

```text
 Container mkh-demo-db-1 Healthy
 Container mkh-demo-web-1 Healthy
demo ready: [{"customers":2000,"orders":100000,"revenue":456679094.00}]

real	1m38.009s
```

وعند فتح `http://127.0.0.1:18830` في المتصفح تظهر اللوحة كما يلي:

![لوحة المبيعات التجريبية بالعربية: 2,000 عميل و100,000 طلب وإيراد شهري 456,679,094 ريالاً، وجدول المدن مرتباً بالإيراد تبدأ بجدة ثم الخبر ثم الرياض، وزر أحمر لتجربة حذف آخر 1000 طلب](https://arabroot.io/content/images/2026/10/presales-tools-02-demo-dashboard.webp)

بيئة العرض بعد الاستعادة: نفس الأرقام في كل مرة

### نجرب العطل: عرض سابق غير البيانات

لنفرض أن المهندس في العرض السابق ضغط الزر الأحمر فحذف آخر 1000 طلب، وعدل اسم أول عميل، وهذا ما نفعله بنفس الـ API التي تستخدمها الصفحة:

```bash
curl -s -o /dev/null -w "DELETE %{http_code}\n" -X DELETE "http://127.0.0.1:18830/api/orders?id=gt.99000"
curl -s -o /dev/null -w "PATCH %{http_code}\n" -X PATCH "http://127.0.0.1:18830/api/customers?id=eq.1" \
  -H "Content-Type: application/json" -d '{"name":"Test Customer"}'
curl -s http://127.0.0.1:18830/api/summary
curl -s "http://127.0.0.1:18830/api/customers?id=eq.1"
```

والمخرج:

```text
DELETE 204
PATCH 204
[{"customers":2000,"orders":99000,"revenue":451773324.00}]
[{"id":1,"name":"Test Customer","city":"الخبر","sector":"الصحة"}]
```

![نفس اللوحة بعد الحذف: 99,000 طلب وإيراد 451,773,324 ريالاً، وأرقام المدن تغيرت](https://arabroot.io/content/images/2026/10/presales-tools-03-demo-damaged.webp)

العرض التالي سوف يبدأ بأرقام لا تطابق العرض التقديمي

وإذا شغلت `./smoke.sh` الآن فسوف يفشل بعد 30 ثانية من المحاولة برسالة `demo NOT ready, got: [{"customers":2000,"orders":99000,...`، وهذا هو المطلوب منه: أن يخبرك قبل العرض بأن البيئة ليست في حالتها الأصلية.

### الاستعادة السريعة والقياس

```bash
time ./reset.sh
curl -s "http://127.0.0.1:18830/api/customers?id=eq.1"
```

```text
demo ready: [{"customers":2000,"orders":100000,"revenue":456679094.00}]

real	0m5.873s
[{"id":1,"name":"شركة الأفق 1","city":"الخبر","sector":"الصحة"}]
```

ولاحظ أن PostgREST لم يحتج إعادة تشغيل، فعندما حذفنا قاعدة البيانات بـ `WITH (FORCE)` قطعت اتصالاته، ثم أعاد الاتصال وحده بالقاعدة الجديدة. وكررنا الطريقتين على Docker Desktop في Windows وعلى الجهاز أحمال أخرى، فكانت النتائج كما في الصورة التالية:

![مقارنة بين إعادة البناء الكاملة: حذف الـ Containers والـ Volume ثم تهيئة PostgreSQL ثم تحميل البيانات، واستغرقت من 69 إلى 98 ثانية، والنسخ من القالب demo_golden إلى demo واستغرق من 2.7 إلى 8.4 ثانية](https://arabroot.io/content/images/2026/10/presales-tools-04-reset-paths.webp)

النسخ من القالب أسرع بأكثر من عشر مرات في كل قياساتنا

| الطريقة         | عدد مرات القياس | الزمن              | متى تستخدمها                              |
| --------------- | --------------- | ------------------ | ----------------------------------------- |
| ./reset.sh full | 2               | 98 و69 ثانية       | عند تغيير ملف البيانات أو ترقية الإصدارات |
| ./reset.sh      | 6               | بين 2.7 و8.4 ثانية | قبل كل عرض وبعده                          |

والحجم الذي يشغله كل من `demo` و`demo_golden` هو 17 ميجابايت، واستهلكت الـ Containers الثلاث بعد الاختبارات حوالي 79 ميجابايت من الذاكرة لقاعدة البيانات و20 لـ PostgREST و8 لـ nginx، أي أن البيئة تعمل على حاسب المهندس نفسه. وكلما كبرت البيانات زاد الفرق بين الطريقتين، لأن البناء الكامل يعيد توليد كل صف وبناء كل فهرس Index، بينما النسخ من القالب ينسخ الملفات كما هي.

💡

إذا كان منتجك يعمل في السحابة وبيئة العرض فيها أكثر من قاعدة بيانات، فنفس الفكرة تطبق بأدوات البنية ككود IaC مثل Terraform أو OpenTofu: البيئة كلها في ملفات، وأمر واحد يحذفها وأمر واحد يعيدها، وقد شرحنا أساسياتها في [مقال البنية ككود](https://arabroot.io/articles/%D8%A7%D9%84%D8%A8%D9%86%D9%8A%D8%A9-%D9%83%D8%B4%D9%8A%D9%81%D8%B1%D8%A9-iac-%D9%84%D9%84%D9%85%D8%A8%D8%AA%D8%AF%D8%A6%D9%8A%D9%86/).

⚠️

لا تضع بيانات عميل حقيقي في بيئة العرض حتى لو كانت لإثبات مفهوم لنفس العميل، فالبيئة تتنقل بين أجهزة المهندسين وتعرض أمام عملاء آخرين. وإذا احتجت بيانات العميل فاجعل لها بيئة مستقلة تحذف بعد التجربة.

## مكتبة الإجابات Answer Library

طلب العروض RFP لشركة تقنية فيه أسئلة تتكرر من عميل لآخر: أين تستضاف البيانات، وما سياسة النسخ الاحتياطي، وهل يدعم الدخول الموحد SSO، وما شهادات الأمان. والمهندس الذي يكتب الإجابة من الصفر كل مرة يضيع أياماً، والأسوأ أنه قد يكتب إجابة تختلف عن إجابة زميله لعميل آخر. ومكتبة الإجابات تحل ذلك: إجابة معتمدة لكل سؤال متكرر، لها مالك وتاريخ مراجعة. وقد شرحنا كتابة العرض الفني نفسه في مقال طلبات العروض:

[![](https://arabroot.io/content/images/2026/10/rfp-proposals-cover-cover.webp)دليلالرد على طلبات العروض RFP وكتابة العرض الفنيكيف تقرأ كراسة الشروط وتقرر التقدم، وتبني مصفوفة الامتثال والعرض الفني وجدول الأسعار، مع قوالب جاهزة وسكربت يولد المصفوفة.](https://arabroot.io/articles/%D8%A7%D9%84%D8%B1%D8%AF-%D8%B9%D9%84%D9%89-%D8%B7%D9%84%D8%A8%D8%A7%D8%AA-%D8%A7%D9%84%D8%B9%D8%B1%D9%88%D8%B6-rfp-%D9%88%D9%83%D8%AA%D8%A7%D8%A8%D8%A9-%D8%A7%D9%84%D8%B9%D8%B1%D8%B6-%D8%A7%D9%84%D9%81%D9%86%D9%8A/)

| الأداة                                                                                       | النوع                                        | الأسعار المنشورة (25 أكتوبر 2026)                                                 |
| -------------------------------------------------------------------------------------------- | -------------------------------------------- | --------------------------------------------------------------------------------- |
| [Loopio](https://loopio.com/pricing/?ref=arabroot.io)                                        | تجارية                                       | لا توجد أسعار، ثلاث خطط Foundations وEnhanced وEnterprise بعرض سعر                |
| [Responsive](https://www.responsive.io/pricing?ref=arabroot.io) (اسمها السابق RFPIO)         | تجارية                                       | الخطة الأولى Emerging تبدأ من 10,000 دولار دون ذكر الفترة، والخطط الأعلى بعرض سعر |
| [BookStack](https://github.com/BookStackApp/BookStack/releases/tag/v26.09.2?ref=arabroot.io) | مفتوحة المصدر MIT                            | مجانية، آخر إصدار v26.09.2 في 20 أكتوبر 2026                                      |
| [Outline](https://github.com/outline/outline/blob/main/LICENSE?ref=arabroot.io)              | مصدر متاح بترخيص Business Source License 1.1 | مجانية للاستضافة الذاتية بشروط الترخيص، آخر إصدار v1.12.0 في 23 أكتوبر 2026       |
| مستودع Git بملفات Markdown                                                                   | طريقة وليست أداة                             | مجانية، والمراجعة عبر طلبات الدمج Pull Requests                                   |

- **نقاط القوة في الأدوات التجارية**: تقرأ ملف الطلب وتقترح الإجابة لكل سؤال من المكتبة، وتوزع الأسئلة على الخبراء وتتابع المواعيد، وتنبه المالك عندما يحين موعد مراجعة الإجابة.
- **نقاط الضعف**: سعر مرتفع لا يناسب شركة ترد على بضعة طلبات في السنة، والإجابات الحساسة عن أمن منتجك تحفظ عند مزود خارجي.

وبحثنا عن أداة مفتوحة المصدر مخصصة لمكتبات إجابات طلبات العروض فلم نجد مشروعاً ناضجاً تتابعه جهة وتصدر له إصدارات منتظمة، وإنما مشاريع تجريبية صغيرة، لذلك البديل العملي هو نظام توثيق مثل [BookStack](https://arabroot.io/articles/%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-bookstack-%D9%84%D8%AA%D9%88%D8%AB%D9%8A%D9%82-%D8%A7%D9%84%D9%81%D8%B1%D9%8A%D9%82/) أو [Outline](https://arabroot.io/articles/%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-outline-%D9%84%D9%82%D8%A7%D8%B9%D8%AF%D8%A9-%D9%85%D8%B9%D8%B1%D9%81%D8%A9-%D8%A7%D9%84%D9%81%D8%B1%D9%8A%D9%82/) بقالب ثابت لكل إجابة. ولاحظ أن ترخيص Outline ليس ترخيصاً مفتوح المصدر بالمعنى الذي تعتمده مبادرة OSI، فاقرأ شروطه قبل أن تبني عليه خدمة تبيعها. وهذا قالب إجابة يصلح لأي من الخيارات الثلاثة:

```markdown
## هل تدعمون الدخول الموحد SSO؟
- الإجابة المعتمدة: نعم، عبر SAML 2.0 وOpenID Connect، ويعمل مع Microsoft Entra ID وGoogle Workspace وKeycloak.
- الدليل: رابط صفحة الوثائق، ولقطة شاشة الإعداد.
- ينطبق على: الإصدار السحابي والمستضاف ذاتياً من الإصدار 4.2.
- المالك: مهندس الهوية في فريق المنصة.
- آخر مراجعة: 2026-10-01، والمراجعة القادمة: 2027-01-01.
- لا تقل: «ندعم كل مزودي الهوية»، فالمختبر منها هي المذكورة أعلاه فقط.
```

والسطر الأخير مهم أكثر مما يبدو، لأن الإجابة في طلب العروض تتحول إلى التزام في العقد، فالجملة الواسعة التي كتبت لتبدو أفضل تعود عليك بعد التوقيع كمتطلب لم تنفذه.

## المخططات Diagrams

تصميم الحل الذي يعرضه مهندس Presales هو في الغالب مخطط معمارية Architecture Diagram يبين مكونات النظام وكيف يرتبط بأنظمة العميل، ويعود إليه فريق التنفيذ بعد التوقيع. والأدوات المفتوحة هنا ناضجة، فـ [draw.io](https://github.com/jgraph/drawio?ref=arabroot.io) بترخيص Apache-2.0 وآخر إصدار له v32.6.1 في 23 أكتوبر 2026، وExcalidraw بترخيص MIT للرسم بأسلوب اليد، وقد قارنا بينها وبين الأدوات التجارية بالتفصيل، وبنينا Excalidraw على سيرفر مع الرسم المشترك:

[![](https://arabroot.io/content/images/2026/10/diagram-tools-cover-cover.webp)دليلأدوات رسم المخططات Diagrams: مقارنة عمليةمقارنة أدوات الرسم مفتوحة المصدر والتجارية بالترخيص والاستضافة والرسم المشترك وGit، مع اختبار فعلي للعربية.](https://arabroot.io/articles/%D8%A7%D8%AF%D9%88%D8%A7%D8%AA-%D8%B1%D8%B3%D9%85-%D8%A7%D9%84%D9%85%D8%AE%D8%B7%D8%B7%D8%A7%D8%AA-diagrams-%D9%85%D9%82%D8%A7%D8%B1%D9%86%D8%A9-%D8%B9%D9%85%D9%84%D9%8A%D8%A9/)[![](https://arabroot.io/content/images/2026/10/excalidraw-lab-cover-cover.webp)دليلExcalidraw على سيرفرك مع الرسم المشترككيف تبني Excalidraw وخادم الغرف على سيرفرك لترسم مع فريقك في نفس اللوحة دون أن يمر رسمك بخدمة خارجية.](https://arabroot.io/articles/excalidraw-%D8%B9%D9%84%D9%89-%D8%B3%D9%8A%D8%B1%D9%81%D8%B1%D9%83-%D9%85%D8%B9-%D8%A7%D9%84%D8%B1%D8%B3%D9%85-%D8%A7%D9%84%D9%85%D8%B4%D8%AA%D8%B1%D9%83/)

والقاعدة التي تهم مهندس Presales هنا: احفظ المخطط بصيغة قابلة للتعديل بجانب الصورة، أي ملف `.drawio` أو `.excalidraw` بجانب ملف PNG، في نفس مجلد العرض الفني، والسبب أن العميل سوف يطلب تعديلاً بعد شهر، والمهندس الذي لا يملك إلا الصورة يعيد الرسم من البداية.

## تسجيل المكالمات وتحويلها إلى نص

أدوات ذكاء المحادثات Conversation Intelligence تسجل مكالمات المبيعات وتحولها إلى نص وتلخصها، وتتابع ما ذكره العميل عن المنافسين والميزانية. وأسعارها المنشورة كما ظهرت في 25 أكتوبر 2026:

| الأداة                                                       | الأسعار المنشورة                                                                                 |
| ------------------------------------------------------------ | ------------------------------------------------------------------------------------------------ |
| [Gong](https://www.gong.io/pricing/?ref=arabroot.io)         | لا توجد أسعار: ترخيص لكل مستخدم مع رسم للمنصة يعتمد على عدد المستخدمين، بعرض سعر                 |
| [Fathom](https://www.fathom.ai/pricing?ref=arabroot.io)      | Free مجانية، وPremium بـ 20 دولاراً للمستخدم شهرياً أو 16 مع الدفع السنوي، وBusiness بـ 34 أو 25 |
| [Fireflies.ai](https://fireflies.ai/pricing?ref=arabroot.io) | Free مجانية، وPro بـ 18 دولاراً للمستخدم شهرياً أو 10 مع الدفع السنوي، وBusiness بـ 29 أو 19     |
| [tl;dv](https://tldv.io/app/pricing/?ref=arabroot.io)        | باليورو: Pro بـ 29 يورو للمستخدم شهرياً أو 18 مع الدفع السنوي، وBusiness بـ 39 أو 29             |

والبدائل التي تعمل على سيرفرك مبنية في أغلبها على نموذج Whisper من OpenAI بترخيص MIT، وقائمة اللغات في [كود النموذج](https://github.com/openai/whisper/blob/main/whisper/tokenizer.py?ref=arabroot.io) تحتوي العربية:

- [**whisper.cpp**](https://github.com/ggml-org/whisper.cpp/releases/tag/v1.9.5?ref=arabroot.io): تنفيذ لنفس النموذج بلغة C/C++ يعمل على المعالج دون كرت شاشة، بترخيص MIT، وآخر إصدار v1.9.5 في 6 أكتوبر 2026\. وهو محرك وليس تطبيقاً، فتعطيه ملف الصوت ويعطيك النص.
- [**Scriberr**](https://github.com/rishikanthc/Scriberr?ref=arabroot.io): تطبيق ويب للاستضافة الذاتية ترفع إليه التسجيل فيحوله إلى نص، بترخيص MIT، وآخر إصدار v1.2.0 في ديسمبر 2025 مع تحديثات على الكود حتى سبتمبر 2026.
- [**Meetily**](https://github.com/Zackriya-Solutions/meetily?ref=arabroot.io): تطبيق على جهاز المستخدم يسجل الاجتماع ويحوله إلى نص وملخص محلياً، بترخيص MIT، وآخر إصدار v0.4.1 في 12 سبتمبر 2026.
- [**Vexa**](https://github.com/Vexa-ai/vexa?ref=arabroot.io): خدمة تدخل الاجتماعات كمشارك وتحولها إلى نص عبر API، بترخيص Apache-2.0، وآخر إصدار v0.12.28 في 9 أكتوبر 2026.

ودقة النص العربي تختلف بحسب حجم النموذج واللهجة وجودة الصوت، لذلك جرب الأداة على تسجيل حقيقي من اجتماعاتك قبل أن تعتمد عليها، وراجع أسماء المنتجات والمصطلحات الإنجليزية في النص الناتج، فهي أكثر ما يخطئ فيه التحويل.

⚠️

تسجيل مكالمة مع عميل هو جمع لبيانات شخصية، و[نظام حماية البيانات الشخصية](https://laws.boe.gov.sa/BoeLaws/Laws/LawDetails/b7cfae89-828e-4994-b167-adaa00e37188/1?ref=arabroot.io) لا يحتوي مادة خاصة بالتسجيل، ولكن مواده العامة تنطبق عليه: المادة الخامسة تشترط الموافقة إلا في الحالات المستثناة، والمادة الثالثة عشرة توجب إبلاغ الشخص قبل الجمع بالغرض ومن سوف يطلع على البيانات، والمادة التاسعة والعشرون تنظم نقل البيانات خارج المملكة، وهذا يهمك إذا كانت أداة التسجيل سحابية خارج المملكة. لذلك اطلب الموافقة في بداية المكالمة واذكر سبب التسجيل، واحذف التسجيل عندما ينتهي غرضه.

## جدول المقارنة

| العمل          | الخيار التجاري                                                | الخيار على سيرفرك                                      | متى يكفيك الخيار المفتوح                                           |
| -------------- | ------------------------------------------------------------- | ------------------------------------------------------ | ------------------------------------------------------------------ |
| بيئة العرض     | Consensus وNavattic وStorylane وReprise، من مجاني إلى عرض سعر | Docker Compose مع Seed Data وقالب ذهبي، أو IaC للسحابة | إذا كان العرض حياً يقدمه مهندس، وليس عرضاً يتصفحه العميل وحده      |
| مكتبة الإجابات | Loopio وResponsive، بعرض سعر أو من 10,000 دولار               | BookStack أو Outline أو مستودع Git بقالب ثابت          | إذا كانت الطلبات بالعشرات في السنة وليس بالمئات                    |
| المخططات       | أدوات الرسم التجارية                                          | draw.io وExcalidraw                                    | في أغلب الحالات                                                    |
| التسجيل والنص  | Gong بعرض سعر، وFathom وFireflies وtl;dv بأسعار منشورة        | whisper.cpp وScriberr وMeetily وVexa                   | إذا كانت البيانات يجب أن تبقى عندك، وعندك من يراجع دقة النص العربي |

## من يختار ماذا؟

- **شركة ناشئة فيها مهندس Presales واحد أو المؤسس نفسه**: بيئة عرض بـ Docker Compose تستعاد بأمر واحد، ومكتبة إجابات في نظام التوثيق الموجود عندكم، وdraw.io، ولا شيء مدفوع.
- **فريق يرد على طلبات عروض كثيرة كل شهر**: هنا تبدأ أداة مثل Loopio أو Responsive في توفير وقت يستحق سعرها، وقارن عرضي السعر بعدد الطلبات وساعات المهندسين.
- **منتج يجربه العميل وحده قبل أن يتحدث مع أحد**: عرض تفاعلي من Navattic أو Storylane، وابدأ بالخطة المجانية لتعرف هل يستخدمه العملاء فعلاً.
- **جهة تمنع خروج تسجيلات الاجتماعات من شبكتها**: Meetily على الجهاز أو Scriberr مع whisper.cpp على سيرفر داخلي، مع مراجعة النص العربي.

## الخلاصة

وصلنا لنهاية الموضوع، وأهم ما فيه:

- قسم الأدوات بحسب العمل: بيئة العرض، ومكتبة الإجابات، والمخططات، والتسجيل، ولكل منها سؤال يحسم الاختيار.
- أغلب الأدوات التجارية لا تنشر أسعارها، وما نشر منها يتراوح بين خطط مجانية و10,000 دولار كبداية لـ Responsive.
- بيئة العرض على سيرفرك تحتاج قالباً ذهبياً: في تجربتنا أخذت الاستعادة من القالب بين 2.7 و8.4 ثانية مقابل 69 إلى 98 ثانية لإعادة البناء الكاملة.
- فحص `smoke.sh` قبل كل عرض يخبرك بأن البيئة تغيرت قبل أن يراها العميل.
- لا توجد أداة مفتوحة المصدر ناضجة لمكتبات إجابات طلبات العروض، ونظام توثيق بقالب ثابت ومالك وتاريخ مراجعة يكفي الفريق الصغير.
- تسجيل المكالمات يحتاج موافقة وإبلاغاً بحسب نظام حماية البيانات الشخصية، ومكان حفظ التسجيل جزء من القرار.

تدريب عملي: خذ بيئة العرض التي تستخدمها اليوم، واكتب لها ملف بيانات تجريبية بـ `setseed`، ثم قس الزمن بين إعادة البناء والنسخ من القالب. وأقرب المقالات إلى هذا الموضوع على الموقع:

[![](https://arabroot.io/content/images/2026/10/demo-poc-cover-cover.webp)دليلالعرض التوضيحي Demo وإثبات المفهوم PoC: كيف تديرهماكيف تبني عرضاً حول مشكلة العميل، وتدير إثبات مفهوم بمعايير نجاح مكتوبة ومدة محددة، مع قالب خطة جاهز للنسخ.](https://arabroot.io/articles/%D8%A7%D9%84%D8%B9%D8%B1%D8%B6-%D8%A7%D9%84%D8%AA%D9%88%D8%B6%D9%8A%D8%AD%D9%8A-demo-%D9%88%D8%A7%D8%AB%D8%A8%D8%A7%D8%AA-%D8%A7%D9%84%D9%85%D9%81%D9%87%D9%88%D9%85-poc-%D9%83%D9%8A%D9%81-%D8%AA%D8%AF%D9%8A%D8%B1%D9%87%D9%85%D8%A7/)[![](https://arabroot.io/content/images/2026/10/rfp-proposals-cover-cover.webp)دليلالرد على طلبات العروض RFP وكتابة العرض الفنيكيف تقرأ كراسة الشروط وتقرر التقدم، وتبني مصفوفة الامتثال والعرض الفني وجدول الأسعار، مع قوالب جاهزة وسكربت يولد المصفوفة.](https://arabroot.io/articles/%D8%A7%D9%84%D8%B1%D8%AF-%D8%B9%D9%84%D9%89-%D8%B7%D9%84%D8%A8%D8%A7%D8%AA-%D8%A7%D9%84%D8%B9%D8%B1%D9%88%D8%B6-rfp-%D9%88%D9%83%D8%AA%D8%A7%D8%A8%D8%A9-%D8%A7%D9%84%D8%B9%D8%B1%D8%B6-%D8%A7%D9%84%D9%81%D9%86%D9%8A/)[![](https://arabroot.io/content/images/2026/10/local-dev-practice-cover-cover.webp)دليلبيئة تطوير محلية كاملة بملف Docker Compose واحدنبني بيئة تطوير فيها البريد وHTTPS والأسماء المحلية، ونكتب اختباراً آلياً لبريد استعادة كلمة المرور ثم نفتعل فيها الأعطال.](https://arabroot.io/articles/%D8%A8%D9%8A%D8%A6%D8%A9-%D8%AA%D8%B7%D9%88%D9%8A%D8%B1-%D9%85%D8%AD%D9%84%D9%8A%D8%A9-%D8%A8%D9%85%D9%84%D9%81-docker-compose-%D9%88%D8%A7%D8%AD%D8%AF/)[![](https://arabroot.io/content/images/2026/10/diagram-tools-cover-cover.webp)دليلأدوات رسم المخططات Diagrams: مقارنة عمليةمقارنة أدوات الرسم مفتوحة المصدر والتجارية بالترخيص والاستضافة والرسم المشترك وGit، مع اختبار فعلي للعربية.](https://arabroot.io/articles/%D8%A7%D8%AF%D9%88%D8%A7%D8%AA-%D8%B1%D8%B3%D9%85-%D8%A7%D9%84%D9%85%D8%AE%D8%B7%D8%B7%D8%A7%D8%AA-diagrams-%D9%85%D9%82%D8%A7%D8%B1%D9%86%D8%A9-%D8%B9%D9%85%D9%84%D9%8A%D8%A9/)[![](https://arabroot.io/content/images/2026/10/bookstack-cover-cover.webp)دليلBookStack: توثيق فريقك في كتب وفصول على سيرفرككيف تشغل BookStack على سيرفرك وتنظم توثيق فريقك في أرفف وكتب وفصول، مع صلاحيات ودخول موحد وبحث بالعربية.](https://arabroot.io/articles/%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-bookstack-%D9%84%D8%AA%D9%88%D8%AB%D9%8A%D9%82-%D8%A7%D9%84%D9%81%D8%B1%D9%8A%D9%82/)

## سجل التحديثات

- أكتوبر 2026: كتابة المقال واختبار بيئة العرض على postgres:18.6-alpine وpostgrest/postgrest:v16.5 وnginx:1.30.6-alpine في Docker Engine 29.8.0، والأسعار كما ظهرت في 25 أكتوبر 2026.