
Security News
Attackers Are Hunting High-Impact Node.js Maintainers in a Coordinated Social Engineering Campaign
Multiple high-impact npm maintainers confirm they have been targeted in the same social engineering campaign that compromised Axios.
JavaScript library for creating circular timeline visualizations for annual and cyclical data

A flexible, zero-dependency JavaScript library for creating circular timeline visualizations.
Perfect for annual planning, project timelines, and cyclical data. Built with pure JavaScript and SVG.
🌐 Website | 📺 Live Demo | 📦 npm | ⭐ GitHub
Circular layouts excel at showing:
Traditional linear timelines are better for sequences and chronology. Circular timelines are better for cycles and patterns.
npm install circalify
import CircularTimeline from 'circalify';
const timeline = new CircularTimeline('#timeline', {
startYear: 2025,
rings: [{ type: 'calendar' }]
});
import CircularTimeline from 'circalify';
const timeline = new CircularTimeline('#timeline', {
startYear: 2025,
rings: [
{ type: 'calendar' },
{ type: 'data', name: 'Events' }
]
});
timeline.setData([
{ label: 'Launch', startDate: '2025-03-15', endDate: '2025-03-15' }
], 'Events');
<!DOCTYPE html>
<html>
<head>
<style>
#timeline { width: 100%; height: 600px; }
</style>
</head>
<body>
<div id="timeline"></div>
<script type="module">
import CircularTimeline from 'https://unpkg.com/circalify@latest/src/index.js';
const timeline = new CircularTimeline('#timeline', {
startYear: 2025,
rings: [
{ type: 'calendar', calendarType: 'month-names' },
{ type: 'data', name: 'Events' }
]
});
timeline.setData([
{ label: 'Project Launch', startDate: '2025-03-15', endDate: '2025-03-15' }
], 'Events');
</script>
</body>
</html>
Circalify creates SVG-based circular timelines with:
{
startYear: 2025, // Required: Year to display
startMonth: 0, // Optional: Starting month (0-11, default: 0)
numberOfMonths: 12, // Optional: How many months to show (default: 12)
sameRingHeight: false, // Optional: Equal ring heights (default: false)
backgroundColor: '#fff', // Optional: Background color (default: '#ffffff')
interactive: true // Optional: Enable hover/click (default: true)
}
Displays time divisions (months, weeks, days, quarters).
{
type: 'calendar',
calendarType: 'month-names', // Options: 'month-names', 'weeks', 'days', 'quarters'
active: true,
color: '#f0f0f0',
height: 18,
fontSize: 11,
fontColor: '#333',
separator: { show: true, color: '#ccc', width: 1 }
}
Provides labels and categorical divisions.
{
type: 'header',
headerText: 'Quarter Goals',
active: true,
cells: 4, // Number of divisions
color: '#ffffff',
height: 12,
fontSize: 9,
fontColor: '#666'
}
Shows events positioned by their dates.
{
type: 'data',
name: 'Events', // Ring identifier for setData()
active: true,
color: '#4ECDC4',
unit: 'day', // Options: 'day', 'week', 'month', 'quarter'
height: 20,
fontSize: 10,
fontColor: '#fff'
}
Events must include date information in ISO format (YYYY-MM-DD):
{
label: 'Event Name', // Required: Display text
startDate: '2025-03-15', // Required: ISO date string
endDate: '2025-03-15', // Required: ISO date string
color: '#FF6B6B', // Optional: Override ring color
description: 'Details...' // Optional: Shown in detail panel
}
new CircularTimeline(container, config, callbacks)
Parameters:
container: CSS selector string or DOM elementconfig: Configuration object (see Configuration section)callbacks: Optional object with interaction handlersCallbacks:
{
onSegmentClick: (event) => { /* ... */ },
onSegmentHover: (event) => { /* ... */ },
onSegmentLeave: (event) => { /* ... */ }
}
setData(events, ringName)Add or update events for a specific data ring.
timeline.setData([
{ label: 'Event 1', startDate: '2025-01-15', endDate: '2025-01-15' },
{ label: 'Event 2', startDate: '2025-02-01', endDate: '2025-02-28' }
], 'Events');
getRings()Get all rings in the visualization.
const rings = timeline.getRings();
destroy()Clean up and remove the visualization.
timeline.destroy();
Check out the live demo on CodePen or browse the examples directory.
To run examples locally:
npx serve .
# Then open http://localhost:3000/examples/demo.html
Great for:
Not ideal for:
Works in all modern browsers that support ES6 modules and SVG:
No build step required for development.
This project is licensed under the MIT License - see the LICENSE file for details.
Issues and pull requests welcome! Visit the GitHub repository to contribute.
FAQs
JavaScript library for creating circular timeline visualizations for annual and cyclical data
We found that circalify demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Security News
Multiple high-impact npm maintainers confirm they have been targeted in the same social engineering campaign that compromised Axios.

Security News
Axios compromise traced to social engineering, showing how attacks on maintainers can bypass controls and expose the broader software supply chain.

Security News
Node.js has paused its bug bounty program after funding ended, removing payouts for vulnerability reports but keeping its security process unchanged.