Back to Skills

times-square-integration

lsst-sqre
Updated Today
25 views
2
1
2
View on GitHub
Metaapidata

About

This skill provides integration patterns for working with Times Square notebook execution system. Use it when implementing SSE updates, handling URL parameters, setting up GitHub PR previews, or working with the Times Square API. It includes context providers, data fetching hooks, mock API endpoints, and page routing patterns for notebook display and execution.

Quick Install

Claude Code

Recommended
Plugin CommandRecommended
/plugin add https://github.com/lsst-sqre/squareone
Git CloneAlternative
git clone https://github.com/lsst-sqre/squareone.git ~/.claude/skills/times-square-integration

Copy and paste this command in Claude Code to install this skill

Documentation

Times Square Integration

Times Square is a notebook execution system integrated into the squareone app for displaying computational notebooks.

Core Concepts

  • Pages: Notebooks that can be executed and displayed
  • Parameters: URL-based parameters for notebook execution
  • SSE (Server-Sent Events): Real-time updates during execution
  • GitHub PR Previews: Preview notebooks from pull requests

Context Providers

TimesSquareUrlParametersContext

Manages URL-based state for Times Square pages.

import { TimesSquareUrlParametersContext } from '../contexts/TimesSquareUrlParametersContext';

// Provider setup (usually in page)
<TimesSquareUrlParametersContext.Provider value={urlParams}>
  <TimesSquarePage />
</TimesSquareUrlParametersContext.Provider>

// Usage in components
const { getParameter, setParameter } = useContext(TimesSquareUrlParametersContext);

const value = getParameter('myParam');
setParameter('myParam', 'newValue');

TimesSquareHtmlEventsContext

Manages real-time SSE (Server-Sent Events) updates.

import { TimesSquareHtmlEventsContext } from '../contexts/TimesSquareHtmlEventsContext';

// Provider setup
<TimesSquareHtmlEventsContext.Provider value={eventSource}>
  <TimesSquarePage />
</TimesSquareHtmlEventsContext.Provider>

// Usage
const events = useContext(TimesSquareHtmlEventsContext);
// events provides real-time updates from notebook execution

Data Fetching Hooks

useTimesSquarePage

Custom hook for fetching Times Square page data.

import { useTimesSquarePage } from '../hooks/useTimesSquarePage';

function MyComponent({ pageSlug }) {
  const { data, error, isLoading } = useTimesSquarePage(pageSlug);

  if (isLoading) return <div>Loading...</div>;
  if (error) return <div>Error: {error.message}</div>;

  return <div>{data.displayName}</div>;
}

Pattern uses SWR for caching and revalidation.

Routing Patterns

Regular Pages

/times-square/{page-slug}

GitHub PR Previews

/times-square/github-pr/{owner}/{repo}/{commit}

Example:

/times-square/github-pr/lsst-sqre/times-square-demo/abc123

API Routes

Mock API endpoints in development (/pages/api/dev/times-square/):

  • GET /times-square/api/v1/pages - List pages
  • GET /times-square/api/v1/pages/:page - Page metadata
  • GET /times-square/api/v1/pages/:page/html - Rendered HTML
  • GET /times-square/api/v1/pages/:page/htmlstatus - Execution status
  • GET /times-square/api/v1/pages/:page/htmlevents - SSE endpoint

Mock API Endpoints

For local development without Times Square backend:

// pages/api/dev/times-square/v1/pages/[page]/html.ts
import type { NextApiRequest, NextApiResponse } from 'next';

export default async function handler(
  req: NextApiRequest,
  res: NextApiResponse
) {
  const { page } = req.query;

  // Return mock HTML
  res.status(200).json({
    html: '<div>Mock Times Square page</div>',
    parameters: {},
  });
}

Page Component Pattern

import { GetServerSideProps } from 'next';
import { useTimesSquarePage } from '../hooks/useTimesSquarePage';
import { TimesSquareUrlParametersContext } from '../contexts/TimesSquareUrlParametersContext';
import { loadAppConfig } from '../lib/config/loader';

type Props = {
  pageSlug: string;
};

export default function TimesSquarePage({ pageSlug }: Props) {
  const { data, error, isLoading } = useTimesSquarePage(pageSlug);

  if (isLoading) return <div>Loading notebook...</div>;
  if (error) return <div>Error loading notebook</div>;

  return (
    <div>
      <h1>{data.displayName}</h1>
      <div dangerouslySetInnerHTML={{ __html: data.html }} />
    </div>
  );
}

export const getServerSideProps: GetServerSideProps<Props> = async (context) => {
  const appConfig = await loadAppConfig();
  const pageSlug = context.params?.page as string;

  return {
    props: {
      appConfig,
      pageSlug,
    },
  };
};

SSE Integration

function TimesSquareLivePage({ pageSlug }) {
  const [eventSource, setEventSource] = useState(null);

  useEffect(() => {
    const es = new EventSource(
      `/times-square/api/v1/pages/${pageSlug}/htmlevents`
    );

    es.onmessage = (event) => {
      const data = JSON.parse(event.data);
      // Handle real-time updates
      console.log('New data:', data);
    };

    setEventSource(es);

    return () => es.close();
  }, [pageSlug]);

  return (
    <TimesSquareHtmlEventsContext.Provider value={eventSource}>
      {/* Page content */}
    </TimesSquareHtmlEventsContext.Provider>
  );
}

Configuration

Times Square URL configured in AppConfig:

# squareone.config.yaml
timesSquareUrl: 'http://localhost:3000/times-square/api'  # Dev
# timesSquareUrl: 'https://data.lsst.cloud/times-square/api'  # Prod

Access in components:

import { useAppConfig } from '../contexts/AppConfigContext';

const config = useAppConfig();
const timesSquareUrl = config.timesSquareUrl;

Best Practices

  1. Use context providers for shared state
  2. Cache with SWR for performance
  3. Mock APIs for development
  4. Handle loading states gracefully
  5. Clean up SSE connections on unmount
  6. Validate parameters before execution
  7. Show execution progress with SSE
  8. Handle errors appropriately

GitHub Repository

lsst-sqre/squareone
Path: .claude/skills/times-square-integration
nextjsrubin-science-platform

Related Skills

content-collections

Meta

This skill provides a production-tested setup for Content Collections, a TypeScript-first tool that transforms Markdown/MDX files into type-safe data collections with Zod validation. Use it when building blogs, documentation sites, or content-heavy Vite + React applications to ensure type safety and automatic content validation. It covers everything from Vite plugin configuration and MDX compilation to deployment optimization and schema validation.

View skill

evaluating-llms-harness

Testing

This Claude Skill runs the lm-evaluation-harness to benchmark LLMs across 60+ standardized academic tasks like MMLU and GSM8K. It's designed for developers to compare model quality, track training progress, or report academic results. The tool supports various backends including HuggingFace and vLLM models.

View skill

langchain

Meta

LangChain is a framework for building LLM applications using agents, chains, and RAG pipelines. It supports multiple LLM providers, offers 500+ integrations, and includes features like tool calling and memory management. Use it for rapid prototyping and deploying production systems like chatbots, autonomous agents, and question-answering services.

View skill

hybrid-cloud-networking

Meta

This skill configures secure hybrid cloud networking between on-premises infrastructure and cloud platforms like AWS, Azure, and GCP. Use it when connecting data centers to the cloud, building hybrid architectures, or implementing secure cross-premises connectivity. It supports key capabilities such as VPNs and dedicated connections like AWS Direct Connect for high-performance, reliable setups.

View skill