DEV Community

Cover image for 8 Essential JavaScript Techniques for Building Robust Real-Time Collaborative Document Systems
Nithin Bharadwaj
Nithin Bharadwaj

Posted on

8 Essential JavaScript Techniques for Building Robust Real-Time Collaborative Document Systems

As a best-selling author, I invite you to explore my books on Amazon. Don't forget to follow me on Medium and show your support. Thank you! Your support means the world!

Building robust real-time collaborative document systems requires mastering eight essential JavaScript techniques that ensure seamless synchronization across multiple users. I've spent considerable time implementing these systems, and the challenges extend far beyond simple text sharing.

The foundation of any collaborative system starts with precise change tracking at the character level. When users type, delete, or modify content, the system must capture these changes without storing complete document copies. This requires implementing efficient diff algorithms that identify exactly what changed and where.

class ChangeTracker {
  constructor() {
    this.previousContent = '';
    this.changes = [];
  }

  trackChanges(currentContent) {
    const changes = this.computeDiff(this.previousContent, currentContent);
    this.previousContent = currentContent;
    return changes;
  }

  computeDiff(oldText, newText) {
    const changes = [];
    let i = 0, j = 0;

    // Find common prefix
    while (i < oldText.length && i < newText.length && oldText[i] === newText[i]) {
      i++;
    }

    // Find common suffix
    while (j < oldText.length - i && j < newText.length - i && 
           oldText[oldText.length - 1 - j] === newText[newText.length - 1 - j]) {
      j++;
    }

    const deleteStart = i;
    const deleteLength = oldText.length - i - j;
    const insertContent = newText.slice(i, newText.length - j);

    if (deleteLength > 0) {
      changes.push({
        type: 'delete',
        position: deleteStart,
        length: deleteLength
      });
    }

    if (insertContent.length > 0) {
      changes.push({
        type: 'insert',
        position: deleteStart,
        content: insertContent
      });
    }

    return changes;
  }
}
Enter fullscreen mode Exit fullscreen mode

When multiple users edit the same document simultaneously, conflicts become inevitable. Building automatic conflict resolution requires implementing three-way merge algorithms that preserve user intent. The system must understand not just what changed, but the context and intention behind each modification.

class ConflictResolver {
  constructor() {
    this.mergeStrategy = 'last-writer-wins';
  }

  resolveConflict(baseContent, localChanges, remoteChanges) {
    const conflicts = this.detectConflicts(localChanges, remoteChanges);

    if (conflicts.length === 0) {
      return this.applyChanges(baseContent, [...localChanges, ...remoteChanges]);
    }

    return this.performThreeWayMerge(baseContent, localChanges, remoteChanges, conflicts);
  }

  detectConflicts(localChanges, remoteChanges) {
    const conflicts = [];

    for (const localChange of localChanges) {
      for (const remoteChange of remoteChanges) {
        if (this.changesOverlap(localChange, remoteChange)) {
          conflicts.push({
            local: localChange,
            remote: remoteChange,
            type: this.determineConflictType(localChange, remoteChange)
          });
        }
      }
    }

    return conflicts;
  }

  changesOverlap(change1, change2) {
    const end1 = change1.position + (change1.length || change1.content?.length || 0);
    const end2 = change2.position + (change2.length || change2.content?.length || 0);

    return !(end1 <= change2.position || end2 <= change1.position);
  }

  performThreeWayMerge(baseContent, localChanges, remoteChanges, conflicts) {
    let mergedContent = baseContent;
    const resolvedChanges = [];

    // Apply non-conflicting changes first
    const nonConflictingLocal = localChanges.filter(change => 
      !conflicts.some(conflict => conflict.local === change)
    );
    const nonConflictingRemote = remoteChanges.filter(change => 
      !conflicts.some(conflict => conflict.remote === change)
    );

    resolvedChanges.push(...nonConflictingLocal, ...nonConflictingRemote);

    // Resolve conflicts based on strategy
    for (const conflict of conflicts) {
      const resolution = this.resolveSpecificConflict(conflict);
      resolvedChanges.push(resolution);
    }

    return this.applyChanges(mergedContent, resolvedChanges);
  }

  resolveSpecificConflict(conflict) {
    switch (this.mergeStrategy) {
      case 'last-writer-wins':
        return conflict.remote.timestamp > conflict.local.timestamp ? 
               conflict.remote : conflict.local;
      case 'merge-content':
        return this.mergeConflictContent(conflict);
      default:
        return conflict.local;
    }
  }

  mergeConflictContent(conflict) {
    if (conflict.local.type === 'insert' && conflict.remote.type === 'insert') {
      return {
        type: 'insert',
        position: Math.min(conflict.local.position, conflict.remote.position),
        content: conflict.local.content + '\n' + conflict.remote.content
      };
    }

    return conflict.local;
  }

  applyChanges(content, changes) {
    let result = content;
    const sortedChanges = changes.sort((a, b) => b.position - a.position);

    for (const change of sortedChanges) {
      result = this.applyChange(result, change);
    }

    return result;
  }

  applyChange(content, change) {
    switch (change.type) {
      case 'insert':
        return content.slice(0, change.position) + 
               change.content + 
               content.slice(change.position);
      case 'delete':
        return content.slice(0, change.position) + 
               content.slice(change.position + change.length);
      default:
        return content;
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

Efficient bandwidth usage becomes critical in collaborative systems with frequent updates. Delta compression transmits only document changes rather than complete content. This technique dramatically reduces network overhead during continuous collaboration sessions.

class DeltaCompressor {
  constructor() {
    this.compressionLevel = 'medium';
  }

  compressDeltas(deltas) {
    const compressed = {
      version: '1.0',
      deltas: this.optimizeDeltas(deltas),
      checksum: this.calculateChecksum(deltas)
    };

    return this.binaryEncode(compressed);
  }

  optimizeDeltas(deltas) {
    const optimized = [];
    let currentDelta = null;

    for (const delta of deltas) {
      if (currentDelta && this.canMergeDelta(currentDelta, delta)) {
        currentDelta = this.mergeDelta(currentDelta, delta);
      } else {
        if (currentDelta) optimized.push(currentDelta);
        currentDelta = { ...delta };
      }
    }

    if (currentDelta) optimized.push(currentDelta);
    return optimized;
  }

  canMergeDelta(delta1, delta2) {
    if (delta1.type !== delta2.type) return false;

    if (delta1.type === 'insert') {
      return delta1.position + delta1.content.length === delta2.position;
    }

    if (delta1.type === 'delete') {
      return delta1.position === delta2.position;
    }

    return false;
  }

  mergeDelta(delta1, delta2) {
    if (delta1.type === 'insert') {
      return {
        ...delta1,
        content: delta1.content + delta2.content
      };
    }

    if (delta1.type === 'delete') {
      return {
        ...delta1,
        length: delta1.length + delta2.length
      };
    }

    return delta1;
  }

  binaryEncode(data) {
    const jsonString = JSON.stringify(data);
    const encoder = new TextEncoder();
    const bytes = encoder.encode(jsonString);

    // Simple compression using run-length encoding for repeated bytes
    const compressed = this.runLengthEncode(bytes);

    return {
      data: compressed,
      originalSize: bytes.length,
      compressedSize: compressed.length,
      ratio: compressed.length / bytes.length
    };
  }

  runLengthEncode(bytes) {
    const result = [];
    let i = 0;

    while (i < bytes.length) {
      const byte = bytes[i];
      let count = 1;

      while (i + count < bytes.length && bytes[i + count] === byte && count < 255) {
        count++;
      }

      if (count > 3 || byte === 0) {
        result.push(0, count, byte);
      } else {
        for (let j = 0; j < count; j++) {
          result.push(byte);
        }
      }

      i += count;
    }

    return new Uint8Array(result);
  }

  decompressDeltas(compressed) {
    const decompressed = this.runLengthDecode(compressed.data);
    const decoder = new TextDecoder();
    const jsonString = decoder.decode(decompressed);
    const data = JSON.parse(jsonString);

    // Verify checksum
    const expectedChecksum = this.calculateChecksum(data.deltas);
    if (expectedChecksum !== data.checksum) {
      throw new Error('Delta decompression checksum mismatch');
    }

    return data.deltas;
  }

  runLengthDecode(compressed) {
    const result = [];
    let i = 0;

    while (i < compressed.length) {
      if (compressed[i] === 0 && i + 2 < compressed.length) {
        const count = compressed[i + 1];
        const byte = compressed[i + 2];

        for (let j = 0; j < count; j++) {
          result.push(byte);
        }

        i += 3;
      } else {
        result.push(compressed[i]);
        i++;
      }
    }

    return new Uint8Array(result);
  }

  calculateChecksum(deltas) {
    const content = JSON.stringify(deltas);
    let hash = 0;

    for (let i = 0; i < content.length; i++) {
      const char = content.charCodeAt(i);
      hash = ((hash << 5) - hash) + char;
      hash = hash & hash; // Convert to 32-bit integer
    }

    return hash;
  }
}
Enter fullscreen mode Exit fullscreen mode

Distributed version control requires sophisticated version vector management to track document state across multiple clients. This ensures operations apply in the correct sequence regardless of network delays or client differences.

class VersionVectorManager {
  constructor(clientId) {
    this.clientId = clientId;
    this.vectors = new Map();
    this.vectors.set(clientId, 0);
    this.operationLog = [];
  }

  incrementVersion() {
    const currentVersion = this.vectors.get(this.clientId) || 0;
    this.vectors.set(this.clientId, currentVersion + 1);
    return currentVersion + 1;
  }

  updateRemoteVersion(clientId, version) {
    const currentVersion = this.vectors.get(clientId) || 0;
    this.vectors.set(clientId, Math.max(currentVersion, version));
  }

  createOperation(change) {
    const version = this.incrementVersion();
    const operation = {
      id: `${this.clientId}_${version}_${Date.now()}`,
      clientId: this.clientId,
      version: version,
      vectorClock: new Map(this.vectors),
      change: change,
      timestamp: Date.now()
    };

    this.operationLog.push(operation);
    return operation;
  }

  canApplyOperation(operation) {
    // Check if we have all prerequisite operations
    for (const [clientId, version] of operation.vectorClock) {
      if (clientId === operation.clientId) {
        // This operation should be exactly one version ahead
        const expectedVersion = (this.vectors.get(clientId) || 0) + 1;
        if (version !== expectedVersion) {
          return false;
        }
      } else {
        // We should have at least this version of other clients
        const ourVersion = this.vectors.get(clientId) || 0;
        if (ourVersion < version) {
          return false;
        }
      }
    }

    return true;
  }

  applyOperation(operation) {
    if (!this.canApplyOperation(operation)) {
      return false;
    }

    this.updateRemoteVersion(operation.clientId, operation.version);
    this.operationLog.push(operation);

    return true;
  }

  getOperationsSince(vectorClock) {
    return this.operationLog.filter(op => {
      const theirVersion = vectorClock.get(op.clientId) || 0;
      return op.version > theirVersion;
    });
  }

  getMissingOperations(remoteVectorClock) {
    const missing = [];

    for (const [clientId, theirVersion] of remoteVectorClock) {
      const ourVersion = this.vectors.get(clientId) || 0;

      if (theirVersion > ourVersion) {
        // They have operations we don't have
        const clientOps = this.operationLog.filter(op => 
          op.clientId === clientId && op.version > ourVersion && op.version <= theirVersion
        );
        missing.push(...clientOps);
      }
    }

    return missing.sort((a, b) => a.timestamp - b.timestamp);
  }

  mergeVectorClocks(remoteVectorClock) {
    const merged = new Map(this.vectors);

    for (const [clientId, version] of remoteVectorClock) {
      const currentVersion = merged.get(clientId) || 0;
      merged.set(clientId, Math.max(currentVersion, version));
    }

    return merged;
  }

  compareVectorClocks(vectorClock1, vectorClock2) {
    const allClients = new Set([
      ...vectorClock1.keys(),
      ...vectorClock2.keys()
    ]);

    let clock1Greater = false;
    let clock2Greater = false;

    for (const clientId of allClients) {
      const version1 = vectorClock1.get(clientId) || 0;
      const version2 = vectorClock2.get(clientId) || 0;

      if (version1 > version2) clock1Greater = true;
      if (version2 > version1) clock2Greater = true;
    }

    if (clock1Greater && !clock2Greater) return 1;
    if (clock2Greater && !clock1Greater) return -1;
    if (!clock1Greater && !clock2Greater) return 0;
    return null; // Concurrent/conflicting
  }

  getCurrentVector() {
    return new Map(this.vectors);
  }

  getClientVersion(clientId) {
    return this.vectors.get(clientId) || 0;
  }

  pruneOperationLog(safeVectorClock) {
    // Remove operations that all clients have acknowledged
    this.operationLog = this.operationLog.filter(op => {
      const safeVersion = safeVectorClock.get(op.clientId) || 0;
      return op.version > safeVersion;
    });
  }
}
Enter fullscreen mode Exit fullscreen mode

Offline synchronization capabilities ensure users can continue working during network interruptions. The system must queue changes locally and resolve conflicts when connectivity returns.

class OfflineSynchronizer {
  constructor(documentId, clientId) {
    this.documentId = documentId;
    this.clientId = clientId;
    this.isOnline = navigator.onLine;
    this.offlineOperations = [];
    this.conflictQueue = [];

    this.setupOfflineHandlers();
    this.loadOfflineState();
  }

  setupOfflineHandlers() {
    window.addEventListener('online', () => {
      this.isOnline = true;
      this.synchronizeOfflineChanges();
    });

    window.addEventListener('offline', () => {
      this.isOnline = false;
    });
  }

  queueOperation(operation) {
    if (this.isOnline) {
      return this.sendOperation(operation);
    } else {
      this.offlineOperations.push({
        ...operation,
        queuedAt: Date.now(),
        status: 'queued'
      });

      this.saveOfflineState();
      return Promise.resolve({ queued: true });
    }
  }

  async synchronizeOfflineChanges() {
    if (this.offlineOperations.length === 0) return;

    try {
      // Get current server state
      const serverState = await this.fetchServerState();

      // Resolve conflicts between offline operations and server state
      const resolvedOperations = await this.resolveOfflineConflicts(
        this.offlineOperations, 
        serverState
      );

      // Send resolved operations to server
      const results = await this.sendBatchOperations(resolvedOperations);

      // Handle any remaining conflicts
      this.handleSynchronizationResults(results);

      // Clear successfully synchronized operations
      this.clearSynchronizedOperations(results);

    } catch (error) {
      console.error('Offline synchronization failed:', error);
      this.scheduleRetry();
    }
  }

  async resolveOfflineConflicts(offlineOps, serverState) {
    const resolver = new ConflictResolver();
    const resolvedOps = [];

    for (const offlineOp of offlineOps) {
      const conflicts = this.findConflictsWithServerState(offlineOp, serverState);

      if (conflicts.length === 0) {
        resolvedOps.push(offlineOp);
      } else {
        const resolved = await this.resolveOperationConflicts(offlineOp, conflicts);
        resolvedOps.push(resolved);
      }
    }

    return resolvedOps;
  }

  findConflictsWithServerState(operation, serverState) {
    const conflicts = [];

    // Check if the operation conflicts with server operations that occurred
    // while we were offline
    for (const serverOp of serverState.operations) {
      if (this.operationsConflict(operation, serverOp)) {
        conflicts.push(serverOp);
      }
    }

    return conflicts;
  }

  operationsConflict(op1, op2) {
    // Check if operations affect overlapping ranges
    const getRange = (op) => {
      return {
        start: op.change.position,
        end: op.change.position + (op.change.length || op.change.content?.length || 0)
      };
    };

    const range1 = getRange(op1);
    const range2 = getRange(op2);

    return !(range1.end <= range2.start || range2.end <= range1.start);
  }

  async resolveOperationConflicts(operation, conflicts) {
    // Apply transformation to resolve conflicts
    let resolved = { ...operation };

    for (const conflict of conflicts) {
      resolved = this.transformOperation(resolved, conflict);
    }

    // Mark as conflict-resolved for tracking
    resolved.conflictResolved = true;
    resolved.originalOperation = operation;

    return resolved;
  }

  transformOperation(operation, againstOperation) {
    const transformer = new OperationTransformer();
    return transformer.transform(operation, againstOperation);
  }

  async sendBatchOperations(operations) {
    const batch = {
      documentId: this.documentId,
      clientId: this.clientId,
      operations: operations,
      batchId: this.generateBatchId()
    };

    const response = await fetch('/api/operations/batch', {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify(batch)
    });

    return response.json();
  }

  handleSynchronizationResults(results) {
    for (const result of results.operations) {
      if (result.status === 'conflict') {
        this.conflictQueue.push(result);
      } else if (result.status === 'failed') {
        // Re-queue failed operations
        this.offlineOperations.push(result.operation);
      }
    }

    if (this.conflictQueue.length > 0) {
      this.handleRemainingConflicts();
    }
  }

  async handleRemainingConflicts() {
    // Present conflicts to user for manual resolution if needed
    for (const conflict of this.conflictQueue) {
      const resolution = await this.getUserConflictResolution(conflict);

      if (resolution) {
        await this.applyConflictResolution(conflict, resolution);
      }
    }

    this.conflictQueue = [];
  }

  async getUserConflictResolution(conflict) {
    // In a real implementation, this would show UI for conflict resolution
    return new Promise((resolve) => {
      // Simulate automatic resolution for now
      setTimeout(() => {
        resolve({
          strategy: 'merge',
          content: conflict.localContent + '\n---\n' + conflict.remoteContent
        });
      }, 100);
    });
  }

  clearSynchronizedOperations(results) {
    const successfulIds = results.operations
      .filter(r => r.status === 'success')
      .map(r => r.operationId);

    this.offlineOperations = this.offlineOperations.filter(
      op => !successfulIds.includes(op.id)
    );

    this.saveOfflineState();
  }

  saveOfflineState() {
    const state = {
      documentId: this.documentId,
      clientId: this.clientId,
      operations: this.offlineOperations,
      conflicts: this.conflictQueue,
      timestamp: Date.now()
    };

    localStorage.setItem(`offline_sync_${this.documentId}`, JSON.stringify(state));
  }

  loadOfflineState() {
    const stored = localStorage.getItem(`offline_sync_${this.documentId}`);
    if (stored) {
      const state = JSON.parse(stored);
      this.offlineOperations = state.operations || [];
      this.conflictQueue = state.conflicts || [];
    }
  }

  scheduleRetry() {
    setTimeout(() => {
      if (this.isOnline && this.offlineOperations.length > 0) {
        this.synchronizeOfflineChanges();
      }
    }, 5000);
  }

  generateBatchId() {
    return `${this.clientId}_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
  }

  async fetchServerState() {
    const response = await fetch(`/api/documents/${this.documentId}/state`);
    return response.json();
  }

  async sendOperation(operation) {
    const response = await fetch('/api/operations', {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify(operation)
    });

    return response.json();
  }
}
Enter fullscreen mode Exit fullscreen mode

Real-time awareness features keep collaborators informed about each other's activities. This includes showing active users, cursor positions, and current editing locations with minimal network overhead.


javascript
class AwarenessManager {
  constructor(documentId, userId, websocket) {
    this.documentId = documentId;
    this.userId = userId;
    this.websocket = websocket;
    this.collaborators = new Map();
    this.localCursor = { position: 0, selection: null };
    this.updateThrottle = 50; // ms
    this.lastUpdate = 0;

    this.setupAwarenessHandlers();
  }

  setupAwarenessHandlers() {
    this.websocket.on('user_joined', (data) => {
      this.collaborators.set(data.userId, {
        ...data.user,
        cursor: { position: 0, selection: null },
        lastSeen: Date.now(),
        status: 'active'
      });

      this.notifyCollaboratorChange('joined', data.user);
    });

    this.websocket.on('user_left', (data) => {
      this.collaborators.delete(data.userId);
      this.notifyCollaboratorChange('left', data.user);
    });

    this.websocket.on('cursor_update', (data) => {
      this.updateCollaboratorCursor(data.userId, data.cursor);
    });

    this.websocket.on('selection_update', (data) => {
      this.updateCollaboratorSelection(data.userId, data.selection);
    });

    this.websocket.on('user_typing', (data) => {
      this.updateCollaboratorStatus(data.userId, 'typing');
    });

    this.websocket.on('user_idle', (data) => {
      this.updateCollaboratorStatus(data.userId, 'idle');
    });
  }

  updateCursor(position, selection = null) {
    this.localCursor = { position, selection };
    this.throttledBroadcastUpdate();
  }

  updateSelection(start, end) {
    this.localCursor.selection = { start, end };
    this.throttledBroadcastUpdate();
  }

  throttledBroadcastUpdate() {
    const now = Date.now();
    if (now - this.lastUpdate < this.updateThrottle) {
      return;
    }

    this.lastUpdate = now;
    this.broadcastCursorUpdate();
  }

  broadcastCursorUpdate() {
    if (this.websocket.readyState !== WebSocket.OPEN) return;

    this.websocket.send(JSON.stringify({
      type: 'cursor_update',
      documentId: this.documentId,
      cursor: {
        position: this.localCursor.position,
        selection: this.localCursor.selection,
        timestamp: Date.now()
      }
    }));
  }

  broadcastSelectionUpdate(start, end) {
    if (this.websocket.readyState !== WebSocket.OPEN) return;

    this.websocket.send(JSON.stringify({
      type: 'selection_update',
      documentId: this.documentId,
      selection: { start, end },
      timestamp: Date.now()
    }));
  }

  broadcastTypingStatus() {
    if (this.websocket.readyState !== WebSocket.OPEN) return;

    this.websocket.send(JSON.stringify({
      type: 'user_typing',
      documentId: this.documentId,
      timestamp: Date.now()
    }));

    // Clear typing status after delay
    this.clearTypingStatusAfterDelay();
  }

  clearTypingStatusAfterDelay() {
    clearTimeout(this.typingTimeout);
    this.typingTimeout = setTimeout(() => {
      this.websocket.send(JSON.stringify({
        type: 'user_idle',
        documentId: this.documentId,
        timestamp: Date.now()
      }));
    }, 1000);
  }

  updateCollaboratorCursor(userId, cursor) {
    const collaborator = this.collaborators.get(userId);
    if (collaborator) {
      collaborator.cursor = cursor;
      collaborator.lastSeen = Date.now();
      this.notifyCollaboratorUpdate(userId, 'cursor', cursor);
    }
  }

  updateCollaboratorSelection(userId, selection) {
    const collaborator = this.collaborators.get(userId);
    if (collaborator) {
      collaborator.cursor.selection = selection;
      collaborator.lastSeen = Date.now();
      this.notifyCollaboratorUpdate(userId, 'selection', selection);
    }
  }

  updateCollaboratorStatus(userId, status) {
    const collaborator = this.collaborators.get(userId);
    if (collaborator) {
      collaborator.status = status;
      collaborator.lastSeen = Date.now();
      this.notifyCollaboratorUpdate(userId, 'status', status);
    }
  }

  getActiveCollaborators() {
    const now = Date.now();
    const activeThreshold = 30000; // 30 seconds

    return Array.from(this.collaborators.values()).filter(
      collaborator => now - collaborator.lastSeen < activeThreshold
    );
  }

  getCollaboratorAt(position) {
    return Array.from(this.collaborators.values()).find(
      collaborator => {
        const cursor = collaborator.cursor;
        if (cursor.selection) {
          return position >= cursor.selection.start && position <= cursor.selection.end;
        }
        return Math.abs(cursor.position - position) < 5;
      }
    );
  }

  getCollaboratorsInRange(start, end) {
    return Array.from(this.collaborators.values()).filter(collaborator => {
      const cursor = collaborator.cursor;

      if (cursor.selection) {
        return !(cursor.selection.end < start || cursor.selection.start > end);
      }

      return cursor.position >= start && cursor.position <= end;
    });
  }

  createCursorElement(collaborator) {
    const cursor = document.createElement('div');
    cursor.className = 'collaborator-cursor';
    cursor.style.cssText = `
      position: absolute;
      width: 2px;
      height: 18px;
      background-color: ${collaborator.color};
      pointer-events: none;
      z-index: 1000;
    `;

    const label = document.createElement('div');
    label.className = 'collaborator-label';
    label.textContent = collaborator.name;
    label.style.cssText = `
      position: absolute;
      top: -25px;
      left: 0;
      background-color: ${collaborator.color};
---
📘 **Checkout my [latest ebook](https://youtu.be/WpR6F4ky4uM) for free on my channel!**  
Be sure to **like**, **share**, **comment**, and **subscribe** to the channel!

---
## 101 Books

**101 Books** is an AI-driven publishing company co-founded by author **Aarav Joshi**. By leveraging advanced AI technology, we keep our publishing costs incredibly low—some books are priced as low as **$4**—making quality knowledge accessible to everyone.

Check out our book **[Golang Clean Code](https://www.amazon.com/dp/B0DQQF9K3Z)** available on Amazon. 

Stay tuned for updates and exciting news. When shopping for books, search for **Aarav Joshi** to find more of our titles. Use the provided link to enjoy **special discounts**!

## Our Creations

Be sure to check out our creations:

**[Investor Central](https://www.investorcentral.co.uk/)** | **[Investor Central Spanish](https://spanish.investorcentral.co.uk/)** | **[Investor Central German](https://german.investorcentral.co.uk/)** | **[Smart Living](https://smartliving.investorcentral.co.uk/)** | **[Epochs & Echoes](https://epochsandechoes.com/)** | **[Puzzling Mysteries](https://www.puzzlingmysteries.com/)** | **[Hindutva](http://hindutva.epochsandechoes.com/)** | **[Elite Dev](https://elitedev.in/)** | **[JS Schools](https://jsschools.com/)**

---

### We are on Medium

**[Tech Koala Insights](https://techkoalainsights.com/)** | **[Epochs & Echoes World](https://world.epochsandechoes.com/)** | **[Investor Central Medium](https://medium.investorcentral.co.uk/)** | **[Puzzling Mysteries Medium](https://medium.com/puzzling-mysteries)** | **[Science & Epochs Medium](https://science.epochsandechoes.com/)** | **[Modern Hindutva](https://modernhindutva.substack.com/)**

Enter fullscreen mode Exit fullscreen mode

Top comments (0)