Готовая библиотека для социальной сети на чистом JavaScript. Чаты, клубы, посты, опросы, уведомления, истории, маркетплейс — всё внутри. Бесплатно. Открытый код. Лицензия MIT.
Скачать исходный кодСобытийно-ориентированная библиотека с автоматическим сохранением в localStorage и опциональной интеграцией с Appwrite.
Все изменения данных генерируют события, на которые можно подписаться через on() / off(). Это позволяет легко связывать UI с данными и строить реактивные интерфейсы без фреймворков.
По умолчанию все данные сохраняются в localStorage под ключом pear_social_core. Библиотека автоматически синхронизирует кеш при каждом изменении — никаких лишних действий.
Для продакшена достаточно передать endpoint и project ID — библиотека начнёт работать с Appwrite Database, Realtime и Storage. Все запросы проходят через единый слой абстракции AppStorage.
AppCache — in-memory кеш для быстрого доступа к данным.AppStorage — единый интерфейс для localStorage и Appwrite. Все модули библиотеки работают только через них.
Подключите библиотеку и настройте хранилище за пару строк.
<script src="social-core.js"></script>
<script>
// Базовая инициализация (только localStorage)
PearSocialCore.init();
// С Appwrite
PearSocialCore.init({
appwrite: {
endpoint: 'https://cloud.appwrite.io/v1',
projectId: 'your-project-id'
}
});
// Глобальные объекты доступны после init()
console.log(AppCache); // In-memory кеш
console.log(AppStorage); // Интерфейс хранилища
</script>Полный список API для построения социальной сети.
true если токен сессии действителен.const isLoggedIn = checkAuth();
if (!isLoggedIn) loginUser('email', 'password');email, password, name.const user = await registerUser({
email: 'alice@example.com',
password: 'securePass123',
name: 'Алиса'
});const user = await loginUser('alice@example.com', 'securePass123');
// user.token — токен сессииlogoutUser();
// Перенаправление на страницу входа
window.location.href = '/login';filter, limit, onPostClick.renderFeed(document.getElementById('feed'), {
limit: 20,
filter: { clubId: 'club_123' }
});text, media (массив файлов), clubId (опционально).const post = await publishPost({
text: 'Всем привет! 🍐',
media: ['https://.../photo.jpg']
});const updated = await toggleLike('post_456');
console.log(updated.likesCount); // 42const comment = await addComment('post_456', 'Отличный пост!');renderDialogs(document.getElementById('dialogs'));openChat('dialog_789', document.getElementById('chat'));const msg = await sendMessage('dialog_789', 'Привет! Как дела?');renderClubs(document.getElementById('clubs'));name, description, avatar.const club = await createClub({
name: 'Любители груш',
description: 'Обсуждаем всё, что связано с Pear 🍐'
});await joinClub('club_123');like, comment, follow, club_invite.await sendNotification('user_789', {
type: 'like',
message: 'Ваш пост оценили!',
postId: 'post_456'
});renderNotifications(document.getElementById('notifications'));type может быть users, posts, clubs или all.const results = await doSearch('груша', 'all');
console.log(results.users, results.posts, results.clubs);renderRecommendations(document.getElementById('recommendations'));renderStories(document.getElementById('stories'));const story = await publishStory({
media: 'https://.../story.jpg',
caption: 'Мой день 🍐'
});renderMarket(document.getElementById('market'), {
category: 'electronics',
maxPrice: 50000
});title, description, price, category, images.const ad = await createMarketAd({
title: 'MacBook Pro M3',
price: 149999,
category: 'electronics',
images: ['https://.../mbp.jpg']
});renderEvents(document.getElementById('events'));title, date, location, description, clubId.const event = await createEvent({
title: 'Встреча Pear Community',
date: '2025-06-15T18:00:00Z',
location: 'Москва, ул. Тверская, 1',
clubId: 'club_123'
});Примеры JSON-объектов, с которыми работает библиотека.
| Поле | Тип | Описание |
|---|---|---|
| $id | string | Уникальный идентификатор |
| string | Email пользователя | |
| name | string | Отображаемое имя |
| avatar | string|null | URL аватара |
| bio | string | Краткая информация |
| createdAt | string (ISO) | Дата регистрации |
| Поле | Тип | Описание |
|---|---|---|
| $id | string | Уникальный идентификатор |
| authorId | string | ID автора |
| text | string | Текст поста |
| media | string[] | Массив URL вложений |
| clubId | string|null | ID клуба (если пост в клубе) |
| likesCount | number | Количество лайков |
| commentsCount | number | Количество комментариев |
| createdAt | string (ISO) | Дата публикации |
| Поле | Тип | Описание |
|---|---|---|
| $id | string | Уникальный идентификатор |
| dialogId | string | ID диалога |
| senderId | string | ID отправителя |
| text | string | Текст сообщения |
| attachments | string[] | Массив URL вложений |
| read | boolean | Прочитано ли сообщение |
| createdAt | string (ISO) | Дата отправки |
| Поле | Тип | Описание |
|---|---|---|
| $id | string | Уникальный идентификатор |
| name | string | Название клуба |
| description | string | Описание клуба |
| avatar | string|null | URL аватара клуба |
| ownerId | string | ID создателя |
| membersCount | number | Количество участников |
| createdAt | string (ISO) | Дата создания |
Библиотека автоматически сохраняет данные в localStorage. Appwrite подключается опционально.
При каждом изменении данных библиотека сериализует весь кеш в JSON и сохраняет под ключом pear_social_core. При загрузке страницы данные восстанавливаются автоматически — пользователь видит последнее состояние мгновенно.
Если передан конфиг Appwrite, библиотека дублирует все операции в облачную базу. Используются коллекции: users, posts, messages, clubs, notifications, stories, marketplace, events. Realtime-подписка обновляет UI мгновенно.
Пример конфигурации коллекций для вашей базы данных (Appwrite).
// Конфигурация коллекций для Appwrite
PearSocialCore.init({
appwrite: {
endpoint: 'https://cloud.appwrite.io/v1',
projectId: 'your-project-id',
collections: {
users: { dbId: 'db_main', collectionId: 'users' },
posts: { dbId: 'db_main', collectionId: 'posts' },
messages: { dbId: 'db_main', collectionId: 'messages' },
clubs: { dbId: 'db_main', collectionId: 'clubs' },
notifications: { dbId: 'db_main', collectionId: 'notifications' },
stories: { dbId: 'db_main', collectionId: 'stories' },
marketplace: { dbId: 'db_main', collectionId: 'marketplace' },
events: { dbId: 'db_main', collectionId: 'events' }
}
}
});Библиотека распространяется по лицензии MIT — можно использовать, модифицировать и распространять без ограничений.
Лицензия MIT Copyright (c) 2026 Pear Данная лицензия разрешает лицам, получившим копию данного программного обеспечения и сопутствующей документации (в дальнейшем — «Программное обеспечение»), безвозмездно использовать Программное обеспечение без ограничений, включая неограниченное право на использование, копирование, изменение, слияние, публикацию, распространение, сублицензирование и/или продажу копий Программного обеспечения, а также лицам, которым предоставляется данное Программное обеспечение, при соблюдении следующих условий: Указанное выше уведомление об авторском праве и данные условия должны быть включены во все копии или значительные части данного Программного обеспечения. ДАННОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ «КАК ЕСТЬ», БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ, ЯВНЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ, ГАРАНТИЯМИ ТОВАРНОЙ ПРИГОДНОСТИ, СООТВЕТСТВИЯ ПО ЕГО КОНКРЕТНОМУ НАЗНАЧЕНИЮ И ОТСУТСТВИЯ НАРУШЕНИЙ. НИ В КАКОМ СЛУЧАЕ АВТОРЫ ИЛИ ПРАВООБЛАДАТЕЛИ НЕ НЕСУТ ОТВЕТСТВЕННОСТИ ПО КАКИМ-ЛИБО ИСКАМ, ЗА УЩЕРБ ИЛИ ПО ИНЫМ ТРЕБОВАНИЯМ, В ТОМ ЧИСЛЕ, ПРИ ДЕЙСТВИИ ДОГОВОРА, ДЕЛИКТЕ ИЛИ ИНОЙ СИТУАЦИИ, ВОЗНИКШИМ ИЗ-ЗА ЗА ИСПОЛЬЗОВАНИЯ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ ИЛИ ИНЫХ ДЕЙСТВИЙ С НИМ.