Open from your device
Pick a DICOM folder, files or a scan CD from your computer or phone, or drag and drop. Or open a link. Nothing is uploaded.
Free online DICOM viewer · Free API
Open CT, MRI, X-ray and ultrasound images straight from your computer, phone or scan CD, or from your hospital system with the free API. MPR, 3D, multi layout and measurements included. A sharing and secondary viewing tool: free for everyone, and your images are never uploaded.
For sharing and secondary viewing only. Not for primary diagnosis or reporting.
No API needed
You do not need a server or the API to use SmartViewer. Pick a folder, a few files or a scan CD right here. The files open in your browser and are never uploaded.
or choose them:
Choose the study folder, or drag it here. Sub folders are searched too.
Insert the CD, press Choose folder and pick the CD drive. DICOMDIR and viewer programs on the CD are skipped.
Press Choose files and select the images (phones cannot pick a whole folder). Files shared on WhatsApp or e-mail can be opened the same way.
You can also open the full viewer at smartjoans.space/dicom and use its Open folder button.
Features
Open a folder, a few files or a link. SmartViewer reads the DICOM headers, groups the series, sorts the slices and shows patient details on top.
Pick a DICOM folder, files or a scan CD from your computer or phone, or drag and drop. Or open a link. Nothing is uploaded.
Mouse wheel, finger drag or arrow keys. At the end of a series, keep scrolling to go straight to the next series.
Drag to change brightness and contrast, or use presets: brain, lung, bone, abdomen, liver, subdural and more.
Length, angle, elliptical ROI and pixel probe, plus zoom, pan, magnifier, rotate, flip and invert.
Compare series in 1×1 up to 3×3. Drag a series onto any viewport. Double-click a viewport to enlarge it.
Axial, coronal and sagittal views with a shared crosshair, orientation letters and MIP slabs from 5 to 40 mm.
Rotate and zoom a 3D view of CT or MR with bone, skin, soft tissue, vessel, lung and MIP presets, and a cut tool.
Play a series from 5 to 30 frames per second and read every DICOM tag with a search box.
One click hides name, ID and birth date before you share your screen. Save any view as a PNG picture.
Touch scrolling, pinch zoom, a phone friendly layout and the Back button. Works on Android and iPhone.
Uncompressed, JPEG baseline and lossless, JPEG-LS, JPEG 2000 and RLE. Single-frame and multi-frame images.
Open studies from your own system with a link, a JSON study list or one script. No key, no sign-up, no permission.
Who it is for
SmartViewer is made to show images to people who need to see them, quickly and from anywhere.
Look at the images next to the official report, on a laptop or a phone, without installing software.
Open the CD or the folder from the scan centre and see your own scan in the browser.
Add a "View images" button to your website, RIS or patient portal with the free API.
Show a case on a projector with patient details hidden, compare series side by side, and use MPR or 3D.
How it works
Keyboard
Pick the way that fits your system. The viewer address is always
https://smartjoans.space/dicom/.
| Way | How it looks | Use it when |
|---|---|---|
| 1. Image links | …/dicom/?url=IMAGE1&url=IMAGE2 |
A few images (X-ray, a short series). No programming needed. |
| 2. Study list (manifest) | …/dicom/?manifest=LIST_URL |
Any study size from a public https server. Good for links in e-mail, SMS or WhatsApp. |
| 3. From your page (smartviewer.js) | SmartViewer.open({ files }) |
A button in your web app. Works with http, LAN and local servers, no CORS or https setup. Best for clinics and PACS. |
Access-Control-Allow-Origin: https://smartjoans.space. The server setup
section shows how for IIS, Apache, Nginx and PHP. Way 3 has no such rules.Add one url for every image file. Each address must be URL-encoded
(encodeURIComponent in JavaScript, rawurlencode in PHP).
https://smartjoans.space/dicom/?title=Chest%20X-ray&url=https%3A%2F%2Fpacs.example.com%2Fimages%2Fchest-pa.dcm&url=https%3A%2F%2Fpacs.example.com%2Fimages%2Fchest-lat.dcm
Keep this way for about 20 images or fewer (the viewer accepts up to 500), because very long links can break in some phones and messaging apps. For more images use the study list.
Your server gives one small JSON file that lists the images. The link only carries the address of that list.
https://smartjoans.space/dicom/?manifest=https%3A%2F%2Fpacs.example.com%2Fmanifest.php%3Fstudy%3D1234
{
"title": "CT Brain - 12 Oct 2026",
"files": [
{ "name": "IM0001.dcm", "url": "https://pacs.example.com/file.php?study=1234&f=IM0001.dcm", "size": 525312 },
{ "name": "IM0002.dcm", "url": "file.php?study=1234&f=IM0002.dcm", "size": 525312 }
]
}| Field | Needed | Meaning |
|---|---|---|
files | Yes | List of images. Order does not matter; SmartViewer sorts by series and instance number. |
files[].url | Yes | Address of one DICOM file. Full, or relative to the list address (like the second line above). |
files[].name | No | File name shown in the DICOM tags panel. |
files[].size | No | Size in bytes. Makes the progress bar exact. |
title | No | Text shown while downloading, e.g. the exam name. |
status + message | No | Send {"status":"error","message":"Link expired"} and SmartViewer shows your message. |
Add one script to your web page and call SmartViewer.open() from a button. Your page reads the
images from your own server and hands them to SmartViewer inside the browser. Because your page does the reading,
your images can be on http, on a LAN address like http://192.168.1.10, or on the user's computer.
<script src="https://smartjoans.space/dicom/smartviewer.js"></script>
<button id="view">View images</button>
<script>
document.getElementById('view').addEventListener('click', () => {
SmartViewer.open({
title: 'CT Brain - Ravi Kumar',
files: [
'/studies/1234/IM0001.dcm', // addresses your page can read
'/studies/1234/IM0002.dcm',
'/studies/1234/IM0003.dcm'
]
});
});
</script><input type="file" multiple
onchange="SmartViewer.open({ title: 'My study', files: [...this.files] })">button.addEventListener('click', async () => {
// your own script returns ["IM1.dcm","IM2.dcm",...]
const list = await fetch('/api/study-files.php?uid=' + encodeURIComponent(uid)).then(r => r.json());
SmartViewer.open({
title: patientName,
files: list.map(name => '/api/study-file.php?uid=' + encodeURIComponent(uid) + '&f=' + encodeURIComponent(name))
});
});| Option | Default | Meaning |
|---|---|---|
files | (needed) | List of image addresses, File objects, Blobs, ArrayBuffers, or { name, url } / { name, data }. |
title | none | Shown in the top bar and while loading. |
mode | 'overlay' | 'overlay' opens full screen on your page (best on phones). 'tab' opens a new tab. |
credentials | 'same-origin' | Cookies for the image addresses. Use 'include' if your images need your login cookie on another address. |
onProgress(done, total) | none | Called after each image is read. |
onDone(seriesCount) | none | Called when the viewer shows the images. |
onError(error) | console | Called if an image cannot be read or the viewer does not open. |
onClose() | none | Called when the viewer is closed. |
SmartViewer.open() returns an object with close(). The phone Back button
also closes the viewer. ArrayBuffers you pass are handed over and become empty on your page.
SmartViewer.open() inside a click handler, especially with mode: 'tab'.| Option | Example | What it does |
|---|---|---|
manifest | ?manifest=https%3A%2F%2F… | Address of your study list. |
url | ?url=…&url=… | Address of one image. Repeat for more (up to 500). |
title | &title=CT%20Brain | Text shown while downloading (up to 120 characters). Overrides the list title. |
Use either manifest or url. If both are given, manifest is used.
SmartViewer runs in the browser on https://smartjoans.space. To read files from your server,
your server must say it allows that. Add the header on the folder or script that serves the list and the images.
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="https://smartjoans.space" />
</customHeaders>
</httpProtocol>
<staticContent>
<remove fileExtension=".dcm" />
<mimeMap fileExtension=".dcm" mimeType="application/dicom" />
</staticContent>
</system.webServer>
</configuration>IIS does not serve files without an extension (many PACS name files like 1.2.840…).
For those, serve the files through a script as in the PHP example below.
<IfModule mod_headers.c> Header set Access-Control-Allow-Origin "https://smartjoans.space" </IfModule> AddType application/dicom .dcm
location /studies/ {
add_header Access-Control-Allow-Origin "https://smartjoans.space" always;
types { application/dicom dcm; }
}header('Access-Control-Allow-Origin: https://smartjoans.space');http://192.168.1.10), use Way 3 instead: it needs no setup.<a href="https://smartjoans.space/dicom/?manifest=https%3A%2F%2Fpacs.example.com%2Fmanifest.php%3Fstudy%3D1234" target="_blank" rel="noopener">View images</a>
// Build the link from your list address and open it const listUrl = 'https://pacs.example.com/manifest.php?study=' + encodeURIComponent(studyId); const viewer = 'https://smartjoans.space/dicom/?manifest=' + encodeURIComponent(listUrl); window.open(viewer, '_blank'); // new tab // or: window.location.href = viewer; // same tab
Your users open open.php?study=1234, and the page sends them to SmartViewer.
<?php // 1. Check your own login / permission here. $study = preg_replace('/[^A-Za-z0-9._-]/', '', $_GET['study'] ?? ''); $listUrl = 'https://pacs.example.com/manifest.php?study=' . rawurlencode($study); // 2. Send the browser to SmartViewer header('Location: https://smartjoans.space/dicom/?manifest=' . rawurlencode($listUrl)); exit;
<?php
header('Access-Control-Allow-Origin: https://smartjoans.space');
header('Content-Type: application/json');
$root = 'D:/studies/'; // your images folder
$study = preg_replace('/[^A-Za-z0-9._-]/', '', $_GET['study'] ?? '');
$dir = $root . $study;
if ($study === '' || !is_dir($dir)) {
echo json_encode(['status' => 'error', 'message' => 'Study not found']);
exit;
}
$files = [];
foreach (scandir($dir) as $name) {
$path = $dir . '/' . $name;
if ($name[0] === '.' || !is_file($path)) continue;
$files[] = [
'name' => $name,
'url' => 'file.php?study=' . rawurlencode($study) . '&f=' . rawurlencode($name),
'size' => filesize($path),
];
}
echo json_encode(['title' => 'Study ' . $study, 'files' => $files]);<?php
header('Access-Control-Allow-Origin: https://smartjoans.space');
$root = 'D:/studies/';
$study = preg_replace('/[^A-Za-z0-9._-]/', '', $_GET['study'] ?? '');
$name = basename($_GET['f'] ?? ''); // basename blocks ../ tricks
$path = $root . $study . '/' . $name;
if ($study === '' || $name === '' || !is_file($path)) {
http_response_code(404);
exit;
}
header('Content-Type: application/dicom');
header('Content-Length: ' . filesize($path));
readfile($path);&exp=…&sig=… on the list link, made with
hash_hmac('sha256', $study . '|' . $exp, $secret), and check it in manifest.php and
file.php before sending anything.Paste image addresses (one per line) or one study list address to make a ready link and test it.
SmartViewer shows a message when something is wrong. Find it here:
| Message in SmartViewer | Reason | Fix |
|---|---|---|
| Images cannot load on this address | The list or images are on http. | Serve them on https, or use Way 3. |
| Download stopped … server must allow this viewer (CORS) | Your server does not send the CORS header, or the address is wrong. | Add Access-Control-Allow-Origin: https://smartjoans.space. Open one image address in the browser to check it downloads. |
| The image server answered with a web page (often a login page) | Your server asked for a login instead of giving the list. | Let the list and file addresses work without a login, protected by a token that expires. |
| Study could not be opened | The list address did not answer, sent an error, or the link expired. | Open the list address in the browser. It must show the JSON. |
| Images could not be sent (Way 3) | Your page could not read one of the image addresses. | Open that address in the browser. The message shows which one failed. |
| No images could be read | The files are not DICOM (for example JPEG or a ZIP). | Link to the original DICOM files. |
FAQ
Yes. The viewer and the API are free for everyone, for personal use, clinics and hospitals. No account, no key, no permission.
No. Images go from your device or your own server straight into your browser. smartjoans.space does not receive, store or log them, and they are gone when you close the tab.
No. SmartViewer is a sharing and secondary viewing tool and is not a certified medical device. Use a certified PACS workstation with a calibrated display for primary reading and reports.
Yes. It works in current browsers on Android and iPhone, with touch scrolling, pinch zoom and the Back button. Very large CT studies need more memory, so MPR and 3D may be reduced on phones.
Yes, and you do not need the API for it. Use Open files from this device on this page, or the Open folder / Open files buttons in the viewer. The files open in your browser and are never uploaded.
Insert the CD, press "Choose folder" on this page (or "Open folder" in the viewer) and pick the CD drive or the copied folder. SmartViewer finds the images in all sub folders and skips other files.
Yes, with the free API. Use a link with image addresses, a link to a JSON study list, or the smartviewer.js script. Way 3 works even when your images are on http or on a LAN address.
CT, MR, CR, DX, US, MG, XA and other DICOM images, single-frame and multi-frame, uncompressed, JPEG baseline and lossless, JPEG-LS, JPEG 2000 and RLE.
A grayscale CT or MR series with at least 10 slices of the same size and one image per position. 3D also needs WebGL 2, which all current browsers have.