<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Naveen Kumar</title>
    <description>The latest articles on DEV Community by Naveen Kumar (@naveen_kumar_19).</description>
    <link>https://dev.to/naveen_kumar_19</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3927681%2F9cf43d6e-e811-4b45-b59d-8f2f218b79bd.jpg</url>
      <title>DEV Community: Naveen Kumar</title>
      <link>https://dev.to/naveen_kumar_19</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/naveen_kumar_19"/>
    <language>en</language>
    <item>
      <title>One Viewer for Every File: A Better Story for React Apps</title>
      <dc:creator>Naveen Kumar</dc:creator>
      <pubDate>Tue, 12 May 2026 23:25:27 +0000</pubDate>
      <link>https://dev.to/naveen_kumar_19/one-viewer-for-every-file-a-better-story-for-react-apps-2cb1</link>
      <guid>https://dev.to/naveen_kumar_19/one-viewer-for-every-file-a-better-story-for-react-apps-2cb1</guid>
      <description>&lt;p&gt;There is a moment almost every product team runs into.&lt;/p&gt;

&lt;p&gt;Someone uploads a PDF. Then someone else opens a spreadsheet. A support agent needs to inspect a log file. A reviewer wants to check a DOCX attachment. An engineer clicks into JSON. A designer drops in an SVG. Suddenly one small “preview this file” feature turns into a scattered collection of viewers, custom conditions, and inconsistent user experiences.&lt;/p&gt;

&lt;p&gt;That is exactly why this project feels valuable.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;@smazeeapps/file-viewer&lt;/code&gt; is built around a simple promise: one viewer for all your files. Not one viewer for PDFs and a second one for code and a third one for images. One React component that can sit inside your product and handle the everyday reality of modern file workflows.&lt;/p&gt;

&lt;p&gt;Package URL: &lt;a href="https://www.npmjs.com/package/@smazeeapps/file-viewer" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/@smazeeapps/file-viewer&lt;/a&gt;&lt;br&gt;
GitHub URL: &lt;a href="https://github.com/smazeestudio/edithly-file-viewer" rel="noopener noreferrer"&gt;https://github.com/smazeestudio/edithly-file-viewer&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Instead of making your app juggle different preview experiences, this package gives you a single &lt;code&gt;FileViewer&lt;/code&gt; component and lets the file itself shape the rendering experience through &lt;code&gt;fileName&lt;/code&gt;. The result is cleaner product code, a more unified interface, and far less friction for the people actually using the app.&lt;/p&gt;
&lt;h2&gt;
  
  
  It starts with a very familiar problem
&lt;/h2&gt;

&lt;p&gt;Most teams do not plan to build a file platform.&lt;/p&gt;

&lt;p&gt;They start with one small use case. Maybe it is a proposal viewer in a client portal. Maybe it is a support tool that needs to inspect CSV exports. Maybe it is an internal dashboard where users open logs, markdown notes, JSON payloads, and screenshots in the same workflow.&lt;/p&gt;

&lt;p&gt;At first, it sounds manageable.&lt;/p&gt;

&lt;p&gt;Then the formats keep growing.&lt;/p&gt;

&lt;p&gt;The UI starts splitting.&lt;/p&gt;

&lt;p&gt;Search works in one place but not another. Images open differently from documents. Code previews feel disconnected from office files. Every new format adds another branch in the logic and another edge case in the interface.&lt;/p&gt;

&lt;p&gt;That is where the idea of a single viewer becomes more than a convenience. It becomes a product decision.&lt;/p&gt;
&lt;h2&gt;
  
  
  One component, many file experiences
&lt;/h2&gt;

&lt;p&gt;What makes this extension compelling is how small the integration surface stays, even while the capabilities are broad.&lt;/p&gt;

&lt;p&gt;If you want to try it quickly, the install is simple:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; @smazeeapps/file-viewer react react-dom
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;FileViewer&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@smazeeapps/file-viewer&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;PreviewPanel&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;FileViewer&lt;/span&gt;
      &lt;span class="na"&gt;src&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"https://example.com/files/report.pdf"&lt;/span&gt;
      &lt;span class="na"&gt;fileName&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"report.pdf"&lt;/span&gt;
      &lt;span class="na"&gt;height&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"800px"&lt;/span&gt;
      &lt;span class="na"&gt;theme&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"light"&lt;/span&gt;
    &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is the promise in its simplest form.&lt;/p&gt;

&lt;p&gt;You give the component a source and a file name. The viewer takes care of the rest. It detects the file type, loads the right rendering path, and keeps the experience inside the same product surface. For teams building real applications, that kind of consistency is hard to overvalue.&lt;/p&gt;

&lt;h2&gt;
  
  
  The experience feels unified because it is unified
&lt;/h2&gt;

&lt;p&gt;The biggest win here is not just that many file types are supported. It is that they are supported through one mental model.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;one &lt;code&gt;FileViewer&lt;/code&gt; API&lt;/li&gt;
&lt;li&gt;one consistent embedding pattern in your app&lt;/li&gt;
&lt;li&gt;one place for search&lt;/li&gt;
&lt;li&gt;one place for selection&lt;/li&gt;
&lt;li&gt;one place for theming&lt;/li&gt;
&lt;li&gt;one place for previewing documents, text, code, data, and images&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is what makes the extension feel less like a bundle of viewers and more like a true file experience layer for React apps.&lt;/p&gt;

&lt;h2&gt;
  
  
  Search is part of the story, not an afterthought
&lt;/h2&gt;

&lt;p&gt;When people open files inside products, they usually are not browsing casually. They are trying to find something.&lt;/p&gt;

&lt;p&gt;A phrase in a contract. A value in a JSON payload. A function in a code file. A line in a markdown note.&lt;/p&gt;

&lt;p&gt;This is why built-in search matters so much.&lt;/p&gt;

&lt;p&gt;The viewer supports keyboard-triggered search through &lt;code&gt;Ctrl+F&lt;/code&gt; and &lt;code&gt;Cmd+F&lt;/code&gt;, which already makes it feel natural inside a browser-based workflow. On top of that, product teams can drive search from outside the component with &lt;code&gt;searchMode&lt;/code&gt;, which is a strong fit for global search experiences, guided review flows, and workflow-driven inspection tools.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo3o03xrxygguery9hujg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo3o03xrxygguery9hujg.png" alt="Code preview with search highlighting" width="800" height="716"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That small detail changes the tone of the whole component. It stops being just a renderer and starts becoming an active part of how users work through files.&lt;/p&gt;

&lt;h2&gt;
  
  
  Selection makes the viewer feel connected to the product
&lt;/h2&gt;

&lt;p&gt;Another part of the story is text selection.&lt;/p&gt;

&lt;p&gt;Many preview components stop at “show the file.” This one goes a step further. With &lt;code&gt;onTextSelect&lt;/code&gt;, the parent application can receive structured information about what the user selected inside the viewer.&lt;/p&gt;

&lt;p&gt;That opens the door to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;review workflows&lt;/li&gt;
&lt;li&gt;annotations&lt;/li&gt;
&lt;li&gt;citations&lt;/li&gt;
&lt;li&gt;support investigation tools&lt;/li&gt;
&lt;li&gt;document intelligence experiences&lt;/li&gt;
&lt;li&gt;internal audit and compliance flows&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When a viewer can pass meaningful selection metadata back to the app, it starts acting less like a static preview and more like a real product surface.&lt;/p&gt;

&lt;p&gt;That can look like this in practice:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;FileViewer&lt;/span&gt;
  &lt;span class="na"&gt;src&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
  &lt;span class="na"&gt;fileName&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
  &lt;span class="na"&gt;fileId&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;`sample:&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
  &lt;span class="na"&gt;onTextSelect&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Example payload:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"file_name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"example.ts"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"file_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sample:example.ts"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"function greet(name)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"page_number"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"line_number"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Images belong in the same viewer too
&lt;/h2&gt;

&lt;p&gt;Image support is one of those things that sounds secondary until you are building an actual product.&lt;/p&gt;

&lt;p&gt;Real workflows do not separate everything neatly. A team may need to review a DOCX file, then a screenshot, then a CSV, then a markdown note, then an SVG asset. If images have to open in a completely separate experience, the product starts feeling fragmented again.&lt;/p&gt;

&lt;p&gt;That is why the image support here matters. Formats like &lt;code&gt;png&lt;/code&gt;, &lt;code&gt;jpg&lt;/code&gt;, &lt;code&gt;jpeg&lt;/code&gt;, &lt;code&gt;gif&lt;/code&gt;, &lt;code&gt;webp&lt;/code&gt;, &lt;code&gt;svg&lt;/code&gt;, &lt;code&gt;bmp&lt;/code&gt;, and &lt;code&gt;ico&lt;/code&gt; can live inside the same viewer flow as the rest of the product.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftbok9g7xdv06mna5ke0l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftbok9g7xdv06mna5ke0l.png" alt="Image preview inside the same viewer flow" width="800" height="716"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That is the bigger story of this package: it helps your app stay whole.&lt;/p&gt;

&lt;h2&gt;
  
  
  Features that make the single-viewer promise real
&lt;/h2&gt;

&lt;p&gt;The “single viewer for all files” message works because there is real product thinking behind it. The extension includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a single &lt;code&gt;FileViewer&lt;/code&gt; component API&lt;/li&gt;
&lt;li&gt;support for remote file URLs&lt;/li&gt;
&lt;li&gt;support for local browser &lt;code&gt;File&lt;/code&gt; objects&lt;/li&gt;
&lt;li&gt;automatic file-type detection from &lt;code&gt;fileName&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;lazy-loaded format-specific viewers&lt;/li&gt;
&lt;li&gt;keyboard-triggered search with &lt;code&gt;Ctrl+F&lt;/code&gt; / &lt;code&gt;Cmd+F&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;parent-driven search with &lt;code&gt;searchMode&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;text selection callbacks through &lt;code&gt;onTextSelect&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;light and dark theme support&lt;/li&gt;
&lt;li&gt;TypeScript types for React integration&lt;/li&gt;
&lt;li&gt;one browser-based preview flow for documents, code, data, text, and images&lt;/li&gt;
&lt;li&gt;a safe unsupported-file fallback&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every one of those features reinforces the same idea: your product should not need a different viewer strategy for every format your users bring into the system.&lt;/p&gt;

&lt;h2&gt;
  
  
  Supported formats
&lt;/h2&gt;

&lt;p&gt;The format coverage is broad enough to make the package feel genuinely useful across real teams and workflows.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;PDF: &lt;code&gt;pdf&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Word documents: &lt;code&gt;docx&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;PowerPoint files: &lt;code&gt;ppt&lt;/code&gt;, &lt;code&gt;pptx&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Plain text and logs: &lt;code&gt;txt&lt;/code&gt;, &lt;code&gt;log&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;HTML: &lt;code&gt;html&lt;/code&gt;, &lt;code&gt;htm&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Markdown: &lt;code&gt;md&lt;/code&gt;, &lt;code&gt;markdown&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;CSV: &lt;code&gt;csv&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Excel: &lt;code&gt;xls&lt;/code&gt;, &lt;code&gt;xlsx&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;JSON: &lt;code&gt;json&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Images: &lt;code&gt;png&lt;/code&gt;, &lt;code&gt;jpg&lt;/code&gt;, &lt;code&gt;jpeg&lt;/code&gt;, &lt;code&gt;gif&lt;/code&gt;, &lt;code&gt;webp&lt;/code&gt;, &lt;code&gt;svg&lt;/code&gt;, &lt;code&gt;bmp&lt;/code&gt;, &lt;code&gt;ico&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Code files: &lt;code&gt;js&lt;/code&gt;, &lt;code&gt;ts&lt;/code&gt;, &lt;code&gt;tsx&lt;/code&gt;, &lt;code&gt;jsx&lt;/code&gt;, &lt;code&gt;py&lt;/code&gt;, &lt;code&gt;java&lt;/code&gt;, &lt;code&gt;cpp&lt;/code&gt;, &lt;code&gt;c&lt;/code&gt;, &lt;code&gt;go&lt;/code&gt;, &lt;code&gt;rs&lt;/code&gt;, &lt;code&gt;php&lt;/code&gt;, &lt;code&gt;rb&lt;/code&gt;, &lt;code&gt;css&lt;/code&gt;, &lt;code&gt;scss&lt;/code&gt;, &lt;code&gt;sql&lt;/code&gt;, &lt;code&gt;yaml&lt;/code&gt;, &lt;code&gt;yml&lt;/code&gt;, &lt;code&gt;xml&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That means one viewer can comfortably cover proposals, decks, exports, logs, payloads, markdown notes, engineering files, and brand assets without forcing users into different tools for each one.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where this shines
&lt;/h2&gt;

&lt;p&gt;This kind of extension fits naturally into:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;admin panels&lt;/li&gt;
&lt;li&gt;support dashboards&lt;/li&gt;
&lt;li&gt;client portals&lt;/li&gt;
&lt;li&gt;internal operations tools&lt;/li&gt;
&lt;li&gt;engineering review tools&lt;/li&gt;
&lt;li&gt;document workflows&lt;/li&gt;
&lt;li&gt;data inspection interfaces&lt;/li&gt;
&lt;li&gt;knowledge and compliance systems&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Anywhere files show up as part of the product journey, a unified viewer makes the interface feel simpler, more polished, and easier to trust.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final thought
&lt;/h2&gt;

&lt;p&gt;Some components solve a narrow problem. This one solves a recurring product headache.&lt;/p&gt;

&lt;p&gt;If your team wants one dependable React viewer that can handle documents, code, spreadsheets, structured data, logs, markdown, and images in a single experience, this is the right message to remember:&lt;/p&gt;

&lt;p&gt;One viewer for every file.&lt;/p&gt;

&lt;p&gt;That is not just a cleaner implementation detail. It is a better experience for the people using your product every day.&lt;/p&gt;

&lt;h2&gt;
  
  
  About the author
&lt;/h2&gt;

&lt;p&gt;This package is created by Naveen Kumar.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Name: Naveen Kumar&lt;/li&gt;
&lt;li&gt;Email: &lt;a href="mailto:rajarajannaveenkumar@gmail.com"&gt;rajarajannaveenkumar@gmail.com&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  About Smazee Apps
&lt;/h2&gt;

&lt;p&gt;Smazee Apps is the product identity behind &lt;code&gt;@smazeeapps/file-viewer&lt;/code&gt;, focused on building practical software experiences and developer-friendly tools that solve real workflow problems in a simple way.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;npm package: &lt;a href="https://www.npmjs.com/package/@smazeeapps/file-viewer" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/@smazeeapps/file-viewer&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GitHub source: &lt;a href="https://github.com/smazeestudio/edithly-file-viewer" rel="noopener noreferrer"&gt;https://github.com/smazeestudio/edithly-file-viewer&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>typescript</category>
    </item>
  </channel>
</rss>
