ADVERTISEMENT

Tot.rocks indeed

Published Mar 5, 2020 12:00 am
One of the popular software engineering companies, The Iconfactory just came up with a nifty little notes application for Mac OS X, iOS and iPadOS named Tot. Being familiar with their excellent software portfolio, I immediately downloaded the Mac OS X version, which is a free download. And after the initial try-out period (which is 20 minutes for this particular instance), I picked up my iPhone 11 Pro and searched for the iOS version on the App Store. Lo and behold, it is not free, and it is not cheap at USD20! That price point held me from buying it instantly — but that didn’t take long, after seriously considering the built-in iCloud sync support, I pulled the trigger and bought it. I figured that Iconfactory deserves the money considering how elegantly crafted Tot is. Besides, if it were a USD5/year subscription (to ensure that the application gets updated regularly), I just chucked four years worth. 1_EuuxHZ6ZJlg6J18di4i6rQ You might think that this is another one of those text/note applications that sync between iPhone, iPad and Mac. One should also consider that there is the native Notes application that does wonders, too, specially with the recent updates. However, Tot is a different beast. First off, Dark Mode — application developers should start embracing this, specially when the underlying operating system supports it. Yeah, the Notes application has this too. One thing that the Notes application does not have is Markdown support, which Tot has. In addition to partially supporting Markdown, I love that it has plaintext mode, that is pure ASCII text, with no formatting whatsoever. This is super useful when you have code snippets that you need to move around — heck, I love how I can use Tot as my clipboard for the various bash scripts that I have been playing with (thanks to Linux on the Raspberry Pi). 1_anqv358Vwm3RH9oPPHmDGQ Tot has a wonderfully designed keyboard. Well, it is still the usual QWERTY keyboard, but the addition of formatting keys on the top left and the user-customizable keys on the top right make this a joy to use. The little touch of changing the color of the keyboard depending on the color of the active tab is a pleasant user experience.   Tot only has seven (7) tabs or work areas or text pages, each identified by different colored dots at the top. You can select the dots to go to specific tabs, or swipe left or right to cycle through it. Whilst some may think that this is not enough, I’d say try it out first, but bear in mind that Tot is not aimed for long form writing. I have barely touched the full feature set of Tot — it has support for some URL schemes that allow you to do some automations, it has command-line support for those who prefer launching the application from the terminal, and more. My most basic one is using ssh://[email protected] on one of the tabs, which, when selected, launches the Terminal on Mac OS X, or Prompt on iOS/iPadOS and immediately logs you in. Unfortunately, the initial version does not come with Shortcuts support yet — something that I am looking forward to. Yes, Tot occupies my Mac’s Dock, and the main home pages of my iPhone and iPad. Give the Mac OS X version a try, and I am sure that you will fork that USD20 later.
ADVERTISEMENT
.most-popular .layout-ratio{ padding-bottom: 79.13%; } @media (min-width: 768px) and (max-width: 1024px) { .widget-title { font-size: 15px !important; } }

{{ articles_filter_1561_widget.title }}

.most-popular .layout-ratio{ padding-bottom: 79.13%; } @media (min-width: 768px) and (max-width: 1024px) { .widget-title { font-size: 15px !important; } }

{{ articles_filter_1562_widget.title }}

.most-popular .layout-ratio{ padding-bottom: 79.13%; } @media (min-width: 768px) and (max-width: 1024px) { .widget-title { font-size: 15px !important; } }

{{ articles_filter_1563_widget.title }}

{{ articles_filter_1564_widget.title }}

.mb-article-details { position: relative; } .mb-article-details .article-body-preview, .mb-article-details .article-body-summary{ font-size: 17px; line-height: 30px; font-family: "Libre Caslon Text", serif; color: #000; } .mb-article-details .article-body-preview iframe , .mb-article-details .article-body-summary iframe{ width: 100%; margin: auto; } .read-more-background { background: linear-gradient(180deg, color(display-p3 1.000 1.000 1.000 / 0) 13.75%, color(display-p3 1.000 1.000 1.000 / 0.8) 30.79%, color(display-p3 1.000 1.000 1.000) 72.5%); position: absolute; height: 200px; width: 100%; bottom: 0; display: flex; justify-content: center; align-items: center; padding: 0; } .read-more-background a{ color: #000; } .read-more-btn { padding: 17px 45px; font-family: Inter; font-weight: 700; font-size: 18px; line-height: 16px; text-align: center; vertical-align: middle; border: 1px solid black; background-color: white; } .hidden { display: none; }
function initializeAllSwipers() { // Get all hidden inputs with cms_article_id document.querySelectorAll('[id^="cms_article_id_"]').forEach(function (input) { const cmsArticleId = input.value; const articleSelector = '#article-' + cmsArticleId + ' .body_images'; const swiperElement = document.querySelector(articleSelector); if (swiperElement && !swiperElement.classList.contains('swiper-initialized')) { new Swiper(articleSelector, { loop: true, pagination: false, navigation: { nextEl: '#article-' + cmsArticleId + ' .swiper-button-next', prevEl: '#article-' + cmsArticleId + ' .swiper-button-prev', }, }); } }); } setTimeout(initializeAllSwipers, 3000); const intersectionObserver = new IntersectionObserver( (entries) => { entries.forEach((entry) => { if (entry.isIntersecting) { const newUrl = entry.target.getAttribute("data-url"); if (newUrl) { history.pushState(null, null, newUrl); let article = entry.target; // Extract metadata const author = article.querySelector('.author-section').textContent.replace('By', '').trim(); const section = article.querySelector('.section-info ').textContent.replace(' ', ' '); const title = article.querySelector('.article-title h1').textContent; // Parse URL for Chartbeat path format const parsedUrl = new URL(newUrl, window.location.origin); const cleanUrl = parsedUrl.host + parsedUrl.pathname; // Update Chartbeat configuration if (typeof window._sf_async_config !== 'undefined') { window._sf_async_config.path = cleanUrl; window._sf_async_config.sections = section; window._sf_async_config.authors = author; } // Track virtual page view with Chartbeat if (typeof pSUPERFLY !== 'undefined' && typeof pSUPERFLY.virtualPage === 'function') { try { pSUPERFLY.virtualPage({ path: cleanUrl, title: title, sections: section, authors: author }); } catch (error) { console.error('ping error', error); } } // Optional: Update document title if (title && title !== document.title) { document.title = title; } } } }); }, { threshold: 0.1 } ); function showArticleBody(button) { const article = button.closest("article"); const summary = article.querySelector(".article-body-summary"); const body = article.querySelector(".article-body-preview"); const readMoreSection = article.querySelector(".read-more-background"); // Hide summary and read-more section summary.style.display = "none"; readMoreSection.style.display = "none"; // Show the full article body body.classList.remove("hidden"); } document.addEventListener("DOMContentLoaded", () => { let loadCount = 0; // Track how many times articles are loaded const offset = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; // Offset values const currentUrl = window.location.pathname.substring(1); let isLoading = false; // Prevent multiple calls if (!currentUrl) { console.log("Current URL is invalid."); return; } const sentinel = document.getElementById("load-more-sentinel"); if (!sentinel) { console.log("Sentinel element not found."); return; } function isSentinelVisible() { const rect = sentinel.getBoundingClientRect(); return ( rect.top < window.innerHeight && rect.bottom >= 0 ); } function onScroll() { if (isLoading) return; if (isSentinelVisible()) { if (loadCount >= offset.length) { console.log("Maximum load attempts reached."); window.removeEventListener("scroll", onScroll); return; } isLoading = true; const currentOffset = offset[loadCount]; window.loadMoreItems().then(() => { let article = document.querySelector('#widget_1690 > div:nth-last-of-type(2) article'); intersectionObserver.observe(article) loadCount++; }).catch(error => { console.error("Error loading more items:", error); }).finally(() => { isLoading = false; }); } } window.addEventListener("scroll", onScroll); });

Sign up by email to receive news.